前言:项目有个需求是用手机监控摄像头,播放格式是rtsp,之前使用的播放器发现新版本不支持rtsp格式,旧版本可以播放,可是发现效果并不是很好,想来想去最终决定使用ijkplayer。于是花了两天时间搭了环境编译了ijkplayer。
编译环境是:
virtualbox下的ubuntu
jdk-8u112-linux-x64 .tar.gz
android-ndk-r13-linux-x86_64.zip
android-sdk_r24.4.1-linux.tgz
配置好这些后安装: install homebrew, git, yasm
搭建好环境后就可以编译了,开始我编译出了0.8.4版本,发现播放不了rtsp,播放就是黑屏,后来发现有人说新版本有这个问题,退回到旧版本就没有问题了,于是我使用了K0.7.6
编译过程:
1.切换到你想要保持的目录下(最终编译文件会比较大,注意空间要足够,我就吃亏了次)
2. git clone -b K0.7.6 –depth 1 https://github.com/Bilibili/ijkplayer.git ijkplayer-android
3.进入到ijkplayer-android目录,执行./init-android.sh 这个过程需要下ffmpeg文件,大概两三百MB。
4. 进入config目录,指定编译的格式与配置之类。
cd config
rm module.sh
ln -s module-default.sh module.sh
module-default.sh是默认配置,编译出来的so文件会比较大,可以使用修改了的module-little.sh:
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=rtp"//修改
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-protocol=tcp"//添加
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=rtsp"//添加
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-decoder=mjpeg"//添加
export COMMON_FF_CFG_FLAGS="$COMMON_FF_CFG_FLAGS --enable-demuxer=mjpeg"//添加
5 cd android/contrib 进入,执行:
./compile-ffmpeg.sh clean //清除旧的编译记录与文件
./compile-ffmpeg.sh all //执行ffmpeg,这个过程比较久,耐心点
6 编译so文件
cd .. //进入android目录
./compile-ijk.sh all //编译所有so文件
7 编译完成
测试过程
编译介绍,导入deme进行测试,发现可以播放rtsp了,可是打开很慢,可以通过以下配置进行秒开:
ijkMediaPlayer.setOption(1, "analyzemaxduration", 100L);
ijkMediaPlayer.setOption(1, "probesize", 10240L);
ijkMediaPlayer.setOption(1, "flush_packets", 1L);
ijkMediaPlayer.setOption(4, "packet-buffering", 0L);
ijkMediaPlayer.setOption(4, "framedrop", 1L);
配置后发现秒开看到界面了,可是发现会有绿屏,看官网issue,想想可能需要支持h264,于是在do-compile-ffmpeg.sh中加入以下进行重新编译:
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-demuxer=h264"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-protocol=udp"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-decoder=h264"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-parser=h264"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-hwaccel=h264_vaapi"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-hwaccel=h264_vaapi"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-hwaccel=h264_dxva2"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-demuxer=mjpeg"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-demuxer=rtsp"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-demuxer=rtp"
FF_CFG_FLAGS="$FF_CFG_FLAGS --enable-encoder=h264"
结果发现还是有绿屏,后面通过以下代码配置可以不会出现绿屏,只是不能进行秒开:
转载注明:http://blog.csdn.net/u014614038/article/details/78350324
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "framedrop", 60);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "max-fps", 0);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "fps", 30);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_CODEC, "skip_loop_filter", 48);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "overlay-format", IjkMediaPlayer.SDL_FCC_RV16);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "packet-buffering", 0);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "fflags", "nobuffer");
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "max-buffer-size", 1024);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "min-frames", 3);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 1);
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "probsize", "4096");
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "analyzeduration", "2000000");
转载注明:http://blog.csdn.net/u014614038/article/details/78350324
后面发现播放过程中还有其他小问题,这个自己再慢慢调吧。