在Mac OS上编译ijkplayer,并加入MPEG-4解码支持

compile 'tv.danmaku.ijk.media:ijkplayer-java:0.7.8.1'
compile 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.7.8.1'

需求:项目中gradle里引入的ijkplayer默认可以支持播放avcodec编码的mp4格式的视频,但是不支持播放mp4格式MPEG-4编码的视频(现象为视频出现黑屏,可听到声音,说明音频能被解码)

解决办法:通过修改配置,并重新编码出SO,以达到支持播放MPEG-4编码的视频

编译环境:(在Linux上也相似)

  • macOS 10.12.4
  • Android
  • NDK 13.1
  • Android Studio 2.2
  • Gradle 2.14.1

1.下载Git上的源码

通过git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-androidclone源码到本地,当然也可用sourcetree等工具拉取下来

拉取下来后这就是里面的目录文件结构

2.配置

1.配置NDK:

先进入自己的用户下面,然后再更改配置文件,一般是.bash_profile或者.profile。这里以.bash_profile为例子说明

cd ~
vi .bash_profile

进入到vi编译模式后,再把export ANDROID_NDK=<your ndk path>此行写入。(vi用法请自行查阅)
然后使用source ~/.bash_profile命令让其生效

注:对命令不熟悉可以在Finder中,先按住shif + command +
.
显示隐藏文件,接着进入到自己用户目录,找到隐藏的.bash_profile,再文本编辑打开,来配置上述环境

2.配置FFMPEG的需要支持的视频格式等

在clone下来项目里的config目录里提供了三个配置文件。这里先以配置文件module-default.sh作为例子编译一次

cd config
rm module.sh    //如果已经存在,必须先移除,否则不能生成新的
ln -s module-default.sh module.sh   //生成一个module.sh的连接指向module-default.sh

3.创建分支

git checkout -B latest k0.8.0

创建并切换到一个最新的分支latest来作为我们自己编译的分支,不直接在master上修改。我这里是在0.8.0上的基础上重新编译的,版本号可在ijkplayer-android目录下的version.sh找到

注意:如果是直接下载压缩包下来的,这样的话不是一个Git仓库,Git命令会无效,可忽略此步骤

3.下载并编译FFMPEG

./init-android.sh

找到init-android.sh所在目录下执行此命令(一般是在项目根目录),根据命令行的内容,推测是在拉取FFMPEG各个CPU平台下的源码。下图是已经拉取完,执行上面命令后的结果

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

./compile-ffmpeg.sh clean此命令用来清除上一次编译后生成的文件,执行结果如下,因为清除的文件较多,这里只截取了一部分

./compile-ffmpeg.sh all用来编译生成FFMPEG所有平台的库,如果需要指定只编译某一个平台,可把all改成armv7ax86等平台。生成的文件都会在android/contrib下面的build目录里,这里依然只截取一部分图,由于生成的文件较多,这一步会稍微比较久

注意:太高的NDK版本可能会生成失败,参考此issue:https://github.com/Bilibili/ijkplayer/issues/3840

编译完了之后,build目录下生成的文件

4.编译ijkplayer

cd ..
./compile-ijk.sh all

切换回上一级目录,即回到ijkplayer-android/android,然后执行编译。这里的all同上面,也可改成自己想要编译的平台。

执行完了之后,在Demo里面的各个module下的libs就会生成对应的so了,如armv7a的module下的路径ijkplayer-android/android/ijkplayer/ijkplayer-armv7a/src/main/libs

想要查看Demo,只需把ijkplayer-android/android/ijkplayer导入进去Android Studio里面

注意:如果编译的时候出现./libavutil/timer.h:38:31: fatal error: linux/perf_event.h: No such file or directory等头文件找不到的话,请参考:https://github.com/Bilibili/ijkplayer/issues/4043

5.定制自己需要的解码器

上面编译的是module-default.sh配置的SO,libijkffmepg.so大约有7MB左右,实际上对于大多数手机端上的视频来说,我们并不需要用到那么多解码器,这无疑增大了包的体积。

再回到我们一开始的需求,我们只需要在原来compile进来的 so基础上增加对MEPG-4视频编码的支持就行了。

打开config目录下的module-lite.sh,在#./configure --list-decoders末尾加入下面这行

export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mpeg4"

然后在上面第二步ln -s module-default.sh module.sh创建module.sh时,修改成下面,其他不变

ln -s module-lite.sh module.sh

最后生成的libijkffmepg.so大概2MB,比compile导入的so大概多了300~400KB。

如果想要增加更多的格式或是控制so的体积,只保留自己需要的解码,则可在配置里disable那个解码器

一些支持的文件格式或者视频流可以参考FFmpeg里面的avcodec.h头文件:

把自己编译好的项目放入项目里后,遇到如下问题:

java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad in "/data/app/com.p1.mobile.putong-1/lib/arm/libijksdl.so"

1.保证ijkplayer-java这个库跟so的库版本一致

2.在proguard-rules.pro加入-keep class tv.danmaku.** {*;}不被混淆

参考资料:

1.https://github.com/Bilibili/ijkplayer

2.ijkplayer 编译so库过程

3.iOS使用IJKPlayer播放编码mpeg视频无画面

4.IJKPlayer问题集锦之不定时更新

5.ijkplayer开启rtsp与MJPEG的支持

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ijkplayer 的动态库v7a 和v8a,支持海康摄像头RTSP h264协议,源码来自最新版本ijkplayer k0.8.0 使用原DEMO即可支持RTSP mp4文件等播放,首画面500ms显示. module-lite-rtsp.sh的内容如下: #! /usr/bin/env bash #-------------------- # Standard options: export COMMON_FF_CFG_FLAGS= # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --prefix=PREFIX" # Licensing options: export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-gpl" # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-version3" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-nonfree" # Configuration options: # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-static" # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-shared" # export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-small" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-runtime-cpudetect" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-gray" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-swscale-alpha" # Program options: export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-programs" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffmpeg" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffplay" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffprobe" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-ffserver" # Documentation options: export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-doc" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-htmlpages" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-manpages" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-podpages" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-txtpages" # Component options: export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-avdevice" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avcodec" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avformat" export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-avutil" export COMMON_FF_CF

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值