您的位置:首页 > 移动开发 > Android开发

IJKPlayer问题集锦之不定时更新

2017-12-05 16:59 316 查看
文章转自:https://juejin.im/post/58475f5da22b9d007aaad45c

大家吼,不知名程序猿小郭同学又冒泡啦,今天是主角是:业界知名,天朝最大异(tong)性交友平台,BILIBILI开源的视频播放器项目,基于FFMPEG的IJKPlayer<( ̄ˇ ̄)/···的问题集锦!好吧,相信刚刚脱离周末,工作两天进入状态的大家,没有什么心情扯蛋,因为···扯多了真的好痛Σ( ° °|||)︴,我们还是开始吧。

 
1、IJKPlayer 不像系统播放器会给你旋转视频角度,所以你需要通过
onInfo
what == IMediaPlayer.MEDIA_INFO_VIDEO_ROTATION_CHANGED
去获取角度,自己旋转画面;或者开启硬解硬解码,不过硬解码容易造成黑屏无声,诸位慎重啊O__O "…。

mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 1);

mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-auto-rotate", 1);

mediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec-handle-resolution-change", 1);

 
2、 IJKPlayer 出现黑色有声音没图像,看看你的视频编码是不是H264,pixel format是否存在,音频编码是不是AAC?默认IJKPlayer是不支持3pg(支持它干啥(・-・*)?),不支持mepg4(比如这个库RecordVideoDemo ),不支持AMR。所以如果你真的想要支持,那么参考这个#1961,打开mpeg4支持,重新编ffmpeg,然后通过硬解码播放mpeg4;或者通过系统的录制VideoRecord;或者选另外的JAVACV录制封装FFmpegRecorder

ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 1);

ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec_mpeg4", 1);
 
3、 快进和慢放接口,只支持API23以上,23以下的支持,是需要自己配置ffmpeg支持
avfilter
,不过可能会出现声音颤抖等问题,官方说不稳定,参考#1690

Tryavfilter but the audio sounds shaking = =
For avfilter, only support software decoder.
[/code] 
4、暂停的时候,退到后台再回到前台,画面黑了?这时候个人处理方式是,可以在暂停的时候,通过
TextureView.getBitmap(point.x, point.y);
获取到暂停的画面,用ImageView显示它,在
onSurfaceTextureUpdated
的时候隐藏ImageView,来实现画面的衔接。

5、一些视频返回码

int MEDIA_INFO_VIDEO_RENDERING_START = 3;//视频准备渲染

int MEDIA_INFO_BUFFERING_START = 701;//开始缓冲

int MEDIA_INFO_BUFFERING_END = 702;//缓冲结束

int MEDIA_INFO_VIDEO_ROTATION_CHANGED = 10001;//视频选择信息

int MEDIA_ERROR_SERVER_DIED = 100;//视频中断,一般是视频源异常或者不支持的视频类型。

int MEDIA_ERROR_IJK_PLAYER = -10000,//一般是视频源有问题或者数据格式不支持,比如音频不是AAC之类的

int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = 200;//数据错误没有有效的回收

6、某些视频在SeekTo的时候,会跳回到拖动前的位置,这是因为视频的关键帧的问题,通俗一点就是FFMPEG不兼容,视频压缩过于厉害,seek只支持关键帧,出现这个情况就是原始的视频文件中i 帧比较少,播放器会在拖动的位置找最近的关键帧,目前么,IJKPlayer无解。

7、下载速度可以通过IjkMediaPlayer的
getTcpSpeed
获取。

8、高分辨率开启硬解码,不支持的话会自动切换到软解,就算开启mediacodec,如果设备不支持,显示的解码器也是avcodec软解。

9、ijkMediaPlayer.setOption可配置的对应头文件参考:ff_ffplay_options

10、缓冲进度条不到100,官方表示我就不保证都100,所以一般我都是:

//95这个数值可能不准确,有些时候可能还需要低一些

if (secProgress > 95) secProgress = 100;

11、上面1、2、6的问题,在IJK封装的EXOPlayer和MediaPlayer都不会有问题,兼容上确实强过IJKPlayer,但是它们在细节上,却没有IJK处理的好,如EXOPlayer:退到后再回到前台、切换渲染控件的黑屏一段时间问题,除了用seekto之外目前没发现其他办法,这样的体验让我最后还是选择IJKPlayer。

总的来说,兼容上还是谷歌的强,但是细节上还是IJKPlayer处理的好,一个是播放器兼容视频,一个是视频兼容播放器,看个人喜好吧︿( ̄︶ ̄)︿!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息