最近在做一個軟解視頻疊加硬解視頻的方案,網上看了很多教程,始終不得要領.雖然ijkplayer提供了ijkplayer-example這個示例工程,但對於初入安卓的人來說,要將ijkplayer整合到自己的工程中也是頗為不易的. 這裡要感謝giraffeplayer的作者,下麵是github地址 h ...
最近在做一個軟解視頻疊加硬解視頻的方案,網上看了很多教程,始終不得要領.雖然ijkplayer提供了ijkplayer-example這個示例工程,但對於初入安卓的人來說,要將ijkplayer整合到自己的工程中也是頗為不易的.
這裡要感謝giraffeplayer的作者,下麵是github地址
https://github.com/tcking/GiraffePlayer
giraffe的作者已經將將example中的幾個比較有有用的類給提取出來了,這個時候我們沿著前人的腳步繼續走下去就行了,下麵將下我的實現步驟:
1.import module
file->new->Import module
將giraffeplayer導入工程,編譯出classes.jar (這裡主要是要獲取ijkplayer的class),也可以下載ijkplayer-android的代碼,獲取該jar包,路徑:ijkplayer-android/android/ijkplayer/ijkplayer-java/build/intermediates/bundles/release/classes.jar
github路徑:https://github.com/Bilibili/ijkplayer.git ijkplayer-android
導入的時候需要修改build.gradle,下麵是我的build.gradle配置,根據app的build.gradle來配置的
compileSdkVersion 26
buildToolsVersion "26.0.2"
defaultConfig {
minSdkVersion 23
targetSdkVersion 26
versionCode 1
versionName "1.0"
}
2.將編譯出來的classes.jar放入我們的工程中,修改Android.mk
LOCAL_STATIC_JAVA_LIBRARIES := \
android-common \
android-support-v4 \
android-support-v13 \
glide_mtvplayer \
ijkplayer
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
glide_mtvplayer:lib/glide-3.7.0.jar \
ijkplayer:lib/ijkplayer.jar
我修改了名字,ijkplayer.jar就是我們上面說的classes.jar
3.將需要的功能類放入工程目錄,這裡我選擇瞭如下的類放入我的工程
IjkVideoView.java IMediaController.java IRenderView.java MeasureHelper.java SurfaceRenderView.java TextureRenderView.java
都是從giraffeplayer中拷貝過來的,修改了IjkVideoView的294行
- ijkMediaPlayer.native_setLogLevel(GiraffePlayerActivity.Config.isDebug()?IjkMediaPlayer.IJK_LOG_DEBUG:IjkMediaPlayer.IJK_LOG_ERROR);
+ ijkMediaPlayer.native_setLogLevel(IjkMediaPlayer.IJK_LOG_DEBUG);
4.將so文件拷貝到/system/lib64/目錄下麵,使用PRODUCT_COPY_FILES(使用32位系統的需要註意路徑是/system/lib)
#ijkplayer libraries
PRODUCT_COPY_FILES += \
$(DEVICE_SOURCES)/libraries/ffmpeg/libijkffmpeg.so:system/lib64/libijkffmpeg.so \
$(DEVICE_SOURCES)/libraries/ffmpeg/libijkplayer.so:system/lib64/libijkplayer.so \
$(DEVICE_SOURCES)/libraries/ffmpeg/libijksdl.so:system/lib64/libijksdl.so
5.在自己的工程中使用ijkplayer
首先,第一步就是xml中的佈局,這個很簡單,按照如下的方式來加就行了,路徑要根據自己的IjkVideoView.java的路徑來
<com.mstar.tv.tvplayer.ui.ijkVideo.IjkVideoView
android:id="@+id/video_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
接下里就是要在代碼中使用ijkplayer了,使用之間需要先載入下動態庫
IjkMediaPlayer.loadLibrariesOnce(null);
然後獲取控制項,註冊回調事件
videoView = (IjkVideoView)findViewById(R.id.video_view);
videoView.setOnCompletionListener(new IMediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(IMediaPlayer iMediaPlayer) {
/*play complete*/
Log.d(TAG, "video play finished.");
video_Index = (video_Index + 1) % 4;
videoView.setVideoURI(Uri.parse(videoPath[video_Index]));
videoView.start();
}
});
videoView.setOnErrorListener(new IMediaPlayer.OnErrorListener() {
@Override
public boolean onError(IMediaPlayer iMediaPlayer, int errorNo, int extra) {
Log.d(TAG, "ijkMedia: error occur, error no = " + errorNo);
return false;
}
});
設置播放的uri,最後播放
videoView.setVideoURI(Uri.parse(videoPath[video_Index]));
videoView.start();
至此一個最簡答的視頻播放的ijkplayer功能移植成功,ijkplayer還有很多功能的,有需要的小伙伴可以去研究下ijkplayer給的demo中的ijkplayer-example工程