IjkPlayer For Android实现ffplay
背景说明
由于PC端浏览器要能看直播,需要在手机端再开发一个RTMP协议的播放器。具体要求如下:
- 实时。秒开视频,延迟要尽可能地低:3秒内
- 流畅不卡顿,要一直播放。即使是马赛克也要显示,不能因为不清晰而停止播放
PS:
- VLC for Androd 太慢了,打开几十秒,播放缓存也巨大
准备
源码 Github:Bilibili/ijkplayer
环境:Mac Book(源码要在Linux编译)
编译
-
安装homebrew、git、yasm(请自行百度或谷歌)
-
下载andriod studio ,Android SDK、NDK
-
配置Android SDK、NDK环境变量,在.bash_profile增加如下两行
export ANDROID_SDK=/your/sdk/pathexport
export ANDROID_NDK=/your/ndk/path -
安装gradle
-
下载源码
git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-androidcd ijkplayer-androidgit checkout -B latest -
初始化
./init-android.sh -
编译ffmpegcd android/contrib./compile-ffmpeg.sh clean./compile-ffmpeg.sh all
-
编译IjkPlayercd .../compile-ijk.sh all
到此为止,完成了对源码的编译,ijkplayer-android的目录结构如图
图:工程结构
-
更改project配置
最后的配置如下,其中第10,24,25,27行要更改跟gradle一致:
屏幕快照 2017-05-26 04.59.19 PM.png
运行
调整延时
ffplay在打开rtmp串流视频时,大多数都会遇到5~10秒的延迟,在ffplay播放时,如果加上-fflags nobuffer可以缩短播放的rtmp视频延迟在1s内,而在ijkVideoView中加入(PLDroidPlayer当中也可以设置):
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);