ijkplayer詳解使用教程

1.認識ijkplayer

最近公司準備開發(fā)一款視頻播放及直播的應用纺非,找了許多開源的框架蒂培,大部分都是基于ffmpeg開發(fā)的贝润。最開始準備用Vitamio框架開發(fā)的,相關的文章也比較豐富掂墓,結果對于非個人移動應用均需購買Vitamio使用授權谦纱。不過B站開源的ijkplayer也不錯,而且也不需要商業(yè)授權君编。
ijkplayer是一個基于FFmpeg的輕量級Android/iOS視頻播放器跨嘉。FFmpeg的是全球領先的多媒體框架,能夠解碼啦粹,編碼偿荷, 轉碼,復用唠椭,解復用跳纳,流,過濾器和播放大部分的視頻格式贪嫂。它提供了錄制寺庄、轉換以及流化音視頻的完整解決方案。它包含了非常先進的音頻/視頻編解碼庫libavcodec力崇,為了保證高可移植性和編解碼質(zhì)量斗塘,libavcodec里很多code都是從頭開發(fā)的。

2.環(huán)境配置

項目中引入ijkplayer環(huán)境有兩種方式亮靴。

2.1在Gradle中引入

# required
allprojects {
    repositories {
        jcenter()
    }
}

dependencies {
    # required, enough for most devices.
    compile 'tv.danmaku.ijk.media:ijkplayer-java:0.6.1'
    compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.6.1'

    # Other ABIs: optional
    compile 'tv.danmaku.ijk.media:ijkplayer-armv5:0.6.1'
    compile 'tv.danmaku.ijk.media:ijkplayer-arm64:0.6.1'
    compile 'tv.danmaku.ijk.media:ijkplayer-x86:0.6.1'
    compile 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.6.1'

    # ExoPlayer as IMediaPlayer: optional, experimental
    compile 'tv.danmaku.ijk.media:ijkplayer-exo:0.6.1'
}

2.2在Ubuntu下編譯源碼得到

Ubuntu需要安裝homebrew, git, yasm

# install homebrew, git, yasm
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install git
brew install yasm

# add these lines to your ~/.bash_profile or ~/.profile
# export ANDROID_SDK=<your sdk path>
# export ANDROID_NDK=<your ndk path>

# on Cygwin (unmaintained)
# install git, make, yasm

開始編譯

git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android
cd ijkplayer-android
git checkout -B latest k0.6.1

./init-android.sh

cd android/contrib
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all

cd ..
./compile-ijk.sh all

# Android Studio:
#     Open an existing Android Studio project
#     Select android/ijkplayer/ and import
#
#     define ext block in your root build.gradle
#     ext {
#       compileSdkVersion = 23       // depending on your sdk version
#       buildToolsVersion = "23.0.0" // depending on your build tools version
#
#       targetSdkVersion = 23        // depending on your sdk version
#     }
#
# Eclipse: (obselete)
#     File -> New -> Project -> Android Project from Existing Code
#     Select android/ and import all project
#     Import appcompat-v7
#     Import preference-v7
#
# Gradle
#     cd ijkplayer
#     gradle

目錄結構

目錄結構

3.播放器使用

可能是網(wǎng)絡的問題馍盟,使用Gradle導入會花費很長時間,如果遇到超時茧吊,還得重頭來一遍贞岭,太費時間了八毯。后來我就直接在Ubuntu下編譯后,在Android Studio下導入該項目瞄桨。我先介紹下Demo中利用ijkplayer播放視頻的過程话速。

3.1初始化播放器

IjkMediaPlayer.loadLibrariesOnce(null);
IjkMediaPlayer.native_profileBegin("libijkplayer.so");

3.2初始化IjkVideoView

//這里使用的是Demo中提供的AndroidMediaController類控制播放相關操作
mMediaController = new AndroidMediaController(this, false);
mMediaController.setSupportActionBar(actionBar);
mVideoView = (IjkVideoView) findViewById(R.id.video_view);
mVideoView.setMediaController(mMediaController);

3.3設置本地視頻文件位置或服務器地址,然后播放

mVideoView.setVideoPath(mVideoPath);
mVideoView.start();

3.4Activity銷毀時芯侥,需要釋放資源

@Override
public void onBackPressed() {
    mBackPressed = true;
    super.onBackPressed();
}
@Override
protected void onStop() {
    super.onStop();
    //點擊返回或不允許后臺播放時 釋放資源
    if (mBackPressed || !mVideoView.isBackgroundPlayEnabled()) {
        mVideoView.stopPlayback();
        mVideoView.release(true);
        mVideoView.stopBackgroundPlay();
    } else {
        mVideoView.enterBackground();
    }
    IjkMediaPlayer.native_profileEnd();
}

4.自定義播放器

當然官方提供的Demo只是演示視頻播放的基本操作泊交,對于視頻播放的控制、全屏等操作柱查,還要自己動手做廓俭。

4.1部分聲明

private static final int SIZE_DEFAULT = 0;
private static final int SIZE_4_3 = 1;
private static final int SIZE_16_9 = 2;
private int currentSize = SIZE_16_9;
private IjkVideoView video;
private SeekBar seekBar;

4.2視頻播放比例

這里需要修改IjkVideoView部分代碼后,才支持按比例播放

//修改相關代碼
private static final int[] s_allAspectRatio = {
    IRenderView.AR_ASPECT_FIT_PARENT,
    IRenderView.AR_ASPECT_FILL_PARENT,
    IRenderView.AR_ASPECT_WRAP_CONTENT,
    IRenderView.AR_MATCH_PARENT,
    IRenderView.AR_16_9_FIT_PARENT,
    IRenderView.AR_4_3_FIT_PARENT
};
private int mCurrentAspectRatioIndex = 3;//0
private int mCurrentAspectRatio = s_allAspectRatio[3];//0
private int mCurrentRender = RENDER_TEXTURE_VIEW;
//增加下面方法
public IRenderView getmRenderView() {
    return mRenderView;
}
public int getmVideoWidth() {
   return mVideoWidth;
}
public int getmVideoHeight() {
   return mVideoHeight;
}

設置視頻播放比例

public void setScreenRate(int rate) {
    int width = 0;
    int height = 0;
    if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {// 橫屏
        if (rate == SIZE_DEFAULT) {
            width = video.getmVideoWidth();
            height = video.getmVideoHeight();
        } else if (rate == SIZE_4_3) {
            width = screenHeight / 3 * 4;
            height = screenHeight;
        } else if (rate == SIZE_16_9) {
            width = screenHeight / 9 * 16;
            height = screenHeight;
        }
    } else { //豎屏
        if (rate == SIZE_DEFAULT) {
            width = video.getmVideoWidth();
            height = video.getmVideoHeight();
        } else if (rate == SIZE_4_3) {
            width = screenWidth;
            height = screenWidth * 3 / 4;
        } else if (rate == SIZE_16_9) {
            width = screenWidth;
            height = screenWidth * 9 / 16;
        }
    }
    if (width > 0 && height > 0) {
        FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) video.getmRenderView().getView().getLayoutParams();
        lp.width = width;
        lp.height = height;
        video.getmRenderView().getView().setLayoutParams(lp);
    }
}

4.3屏幕方向切換

private void fullChangeScreen() {
    if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {// 切換為豎屏
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    } else {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    }
}

4.4全屏播放

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    //重新獲取屏幕寬高
    initScreenInfo();
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {//切換為橫屏
        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) video.getLayoutParams();
        lp.height = screenHeight;
        lp.width = screenWidth;
        video.setLayoutParams(lp);
    } else {
        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) video.getLayoutParams();
        lp.height = screenWidth * 9 / 16;
        lp.width = screenWidth;
        video.setLayoutParams(lp);
    }
    setScreenRate(currentSize);
}

4.5播放進度

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    ....
    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
         video.seekTo(seekBar.getProgress()*video.getDuration()/100);
         ...
    }
});
//視頻開始播放時使用handle.sendMessageDelayed更新時間顯示
private void refreshTime(){
    int totalSeconds = video.getCurrentPosition() / 1000;
    int seconds = totalSeconds % 60;
    int minutes = (totalSeconds / 60) % 60;
    int hours = totalSeconds / 3600;
    String ti=hours > 0 ? String.format("%02d:%02d:%02d", hours, minutes, seconds):String.format("%02d:%02d", minutes, seconds);
    time.setText(ti);
}

5.相關資料

6.更新

方便大家使用物赶,提供編譯好的各平臺so文件白指,再引入“ijkplayer-java”就可以直接使用。
http://download.csdn.net/detail/u010987039/9800324
百度網(wǎng)盤下載地址:https://pan.baidu.com/s/1eSst88U
QQ:631344199

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酵紫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子错维,更是在濱河造成了極大的恐慌奖地,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赋焕,死亡現(xiàn)場離奇詭異参歹,居然都是意外死亡,警方通過查閱死者的電腦和手機隆判,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門犬庇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人侨嘀,你說我怎么就攤上這事臭挽。” “怎么了咬腕?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵欢峰,是天一觀的道長。 經(jīng)常有香客問我涨共,道長纽帖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任举反,我火速辦了婚禮懊直,結果婚禮上,老公的妹妹穿的比我還像新娘火鼻。我一直安慰自己室囊,他們只是感情好雕崩,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著波俄,像睡著了一般晨逝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上懦铺,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天捉貌,我揣著相機與錄音,去河邊找鬼冬念。 笑死趁窃,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的急前。 我是一名探鬼主播醒陆,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼裆针!你這毒婦竟也來了刨摩?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤世吨,失蹤者是張志新(化名)和其女友劉穎澡刹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耘婚,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡罢浇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了沐祷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嚷闭。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖赖临,靈堂內(nèi)的尸體忽然破棺而出胞锰,到底是詐尸還是另有隱情,我是刑警寧澤思杯,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布胜蛉,位于F島的核電站,受9級特大地震影響色乾,放射性物質(zhì)發(fā)生泄漏誊册。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一暖璧、第九天 我趴在偏房一處隱蔽的房頂上張望案怯。 院中可真熱鬧,春花似錦澎办、人聲如沸嘲碱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽麦锯。三九已至恕稠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扶欣,已是汗流浹背鹅巍。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留料祠,地道東北人骆捧。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像髓绽,于是被迫代替她去往敵國和親敛苇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容