1.问题发现
播放有声音无画面

2.问题分析
2.1 错误解析
- 组件: amlogic.avc.decoder.awesome - 这是Amlogic平台上的H.264硬件解码器
- 参数: OMX.google.android.index.storeMetaDataInBuffers(0x7f000002) - 试图设置元数据存储参数
- 端口: Output:1 - 输出端口1
- 错误码: BadPortIndex(0x8000101b) - 无效的端口索引
继续从其它方面分析
2.2 对比ijk
从日志中可以看到,错误信息ERROR: BadPortIndex(0x8000101b)
使用的解码器是OMX.amlogic.avc.decoder.awesome ,再来看下ijkplayer设置硬解时播放的情况
ini
selected codec: OMX.amlogic.avc.decoder.awesome rank=800
也是使用的该解码器,出现了同样的有声音无画面的问题。设置ijkplayer使用软解
Java
//对于ijkPlayer的设置,有如下两种视频格式,0为软解,1为硬解
ijkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "mediacodec", 0);
发现可以播放正常了!可能和这个解码器有关。
2.3 对比sys
系统播放器可以正常播放,但是看到了一些奇怪的日志
sh
amffmpeg mediaserver I [av_find_stream_info:5268] st 0, para: 1, codec_info_nb_frames: 1,
amffmpeg mediaserver I [av_find_stream_info:5268] st 1, para: 1, codec_info_nb_frames: 3,
amplayer mediaserver I [audio_type_convert]audio codec_id=0x15002 format=2
日志中出现的amffmpeg ,av_find_stream_info等信息明显来自FFmpeg,表明该Android系统播放器扩展FFmpeg的能力 。
3.问题处理
硬件解码器初始化成功,解码的时候有问题也没有通知上层,无法触发解码器回滚机制,扩展ffmpeg能力,并根据盒子型号配置优先使用ffmpeg软解
Java
DefaultRenderersFactory renderersFactory = new DefaultRenderersFactory(this);
//根据条件设置扩展解码能力优先
if(isNotSupportHardwareDecoding()){
renderersFactory.setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER);
}
player = new ExoPlayer.Builder(this,renderersFactory)
.build();