在自己的工程中使用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工程

相关推荐