ijkplayer从编译到使用来播放rtsp过程小结

来源:互联网 发布:纯网络综艺节目 编辑:程序博客网 时间:2024/05/01 19:57

前言:项目有个需求是用手机监控摄像头,播放格式是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/78350324ijkMediaPlayer.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

后面发现播放过程中还有其他小问题,这个自己再慢慢调吧。