最有用的操作须知:https://github.com/bilibili/ijkplayer
问题
问题一:./compile-ffmpeg.sh
提示 error: ‘y0000000’ undeclared (first use in this function)
原因:termbits.h里面定义了#B0 0000000
,所以ffmpeg里面的B0就会变成000000.
解决方法一:将ffmpeg里面所有的B0改成小写
解决方法二:将系统文件里面的#B0注释掉之后再编译
目前使用方法一,编译和使用正常,暂时没看到其他问题。具体改了
\ijkplayer-master\android\contrib\ffmpeg-arm64\libavcodec的opus_pvq.c和hevc_mvs.c,将B0
替换成b0
。
参考:
http://alientechlab.com/how-to-build-ffmpeg-for-android/
https://www.cnblogs.com/bbqzsl/p/7851356.html
问题二:修改ijkplayer的源码后重新编译没有更改成功的感觉
原因:为了缩短编译时间,编译的时候没有编译全版本,是指定了特殊版本来编译的。具体指令:
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all
cd ..
./compile-ijk.sh arm64
问题就出在最后一句,arm64。确实成功编译了arm64版本,但我是在安卓上进行测试,安卓通用版本是armv7a
,前面编译的时候会有提示可以支持的版本。
FF_ALL_ARCHS = armv5 armv7a arm64 x86 x86_64
FF_ACT_ARCHS = armv5 armv7a arm64 x86 x86_64
解决方法:以后不熟系的情况下还是全编译妥当,不然浪费调试时间。另外编译的时候最好增加一些日志,通过日志判断是否真的修改成功,另外可以看app调用的so包的修改时间得知。
编译后的so包路径:
例程实际调用so包的路径:
从两张图片可以看出我弄错了so包的版本,安卓调用的是armv7a,我编译的是arm64,so包的更新时间也不是一致的。正确的情况下,ijkplayer-example会复制对应版本的so包到当前目录下。
另外,写日志判断的话,可以加在ff_play.c文件read_thread函数下,下面两种形式的日志都能显示。
/* this thread gets the stream from the disk or the network */
static int read_thread(void *arg)
{
av_log(NULL, AV_LOG_ERROR, "test.\n");
ALOGI("test ALOGI");
问题三:使用module-default.sh编译下,./compile-ffmpeg.sh
后提示:fallfatal error: linux/perf_event.h: No such file or directory
原因:linux/perf_event.h是linux平台的效能优化工具,有些Linux没有,禁用即可,没有影响。在module-lite.sh里面已经禁用了。
解决方法:在ijkplayer-master\config\module-default.sh
里加入
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --disable-linux-perf"
然后再次执行前面的操作
cd config
rm module.sh
ln -s module-default.sh module.sh
cd android/contrib
./compile-ffmpeg.sh clean
./compile-ffmpeg.sh all
cd ..
./compile-ijk.sh arm64
参考:https://github.com/Bilibili/ijkplayer/issues/4043
https://www.jianshu.com/p/be622d6ad865