在自己的工程中使用ijkplayer的功能
最近在做一个软解视频叠加硬解视频的方案,网上看了很多教程,始终不得要领.虽然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<br />buildToolsVersion "26.0.2"<br /><br />defaultConfig {<br /> minSdkVersion 23<br /> targetSdkVersion 26<br /> versionCode 1<br /> versionName "1.0"<br />}
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<br /> android:id="@+id/video_view"<br /> android:layout_width="match_parent"<br /> android:layout_height="match_parent"<br /> /><br /><br />接下里就是要在代码中使用ijkplayer了,使用之间需要先加载下动态库
IjkMediaPlayer.loadLibrariesOnce(null);<br />然后获取控件,注册回调事件
videoView = (IjkVideoView)findViewById(R.id.video_view);<br />videoView.setOnCompletionListener(new IMediaPlayer.OnCompletionListener() {<br /> @Override<br /> public void onCompletion(IMediaPlayer iMediaPlayer) {<br /> /*play complete*/<br /> Log.d(TAG, "video play finished.");<br /> video_Index = (video_Index + 1) % 4;<br /> videoView.setVideoURI(Uri.parse(videoPath[video_Index]));<br /> videoView.start();<br /> }<br />});<br />videoView.setOnErrorListener(new IMediaPlayer.OnErrorListener() {<br /> @Override<br /> public boolean onError(IMediaPlayer iMediaPlayer, int errorNo, int extra) {<br /> Log.d(TAG, "ijkMedia: error occur, error no = " + errorNo);<br /> return false;<br /> }<br />});<br />设置播放的uri,最后播放
videoView.setVideoURI(Uri.parse(videoPath[video_Index]));<br />videoView.start();<br />至此一个最简答的视频播放的ijkplayer功能移植成功,ijkplayer还有很多功能的,有需要的小伙伴可以去研究下ijkplayer给的demo中的ijkplayer-example工程