我是用MediaCodec进行H264的硬编码,PS标准封装流:
Android多媒体--MediaCodec 中文API文档
原因:
视频流编码时,魅族手机无法断点到I帧的标识,因此没有封装I帧,因此P帧也无法封装(我的代码流程逻辑是这样),因此整个推的流中就没有视频流,因此只有声音,没有图像.
找到原因就好办了,解决方法:
我们是在对待编码数据进行while循环中,通过bufferInfo.flags来判断编码后的当前数据是否是关键帧数据(就是I帧数据),从而决定是否进行I帧封装,如下图:
在安卓原生的MediaCodec中,关键帧的标识如图:
也就是说,当bufferInfo.flags=1时,认为该条数据是已编码过后的I帧.然后进入该判断,并进行I帧的PS封装.
在我使用魅族手机debug断点时,发现他首个关键帧标识值bufferInfo.flags=9.
因此我们以if (bufferInfo.flags == BUFFER_FLAG_SYNC_FRAME) {……}判断是永远进不去的,所以不会封装I帧,随之就没有P帧,因此整个视频流PS封装失败,推的流中便没有视频流.
因此,我修改了if判断,如下:
并将项目跑起来,推流,再拉流播放,图像出来啦,完美此问题解决!
提醒:我不确定所有魅族手机的关键帧标识值都 =9,这个得自己去debug断点.
疑问:其他手机的关键帧标识值都是按照安卓原生的规则定义为2,我不知道是魅族手机自己封装的=9,还是说魅族手机摄像头的硬件中封装=9.希望有知道的大佬能留言告诉在下,感激不尽.
网友评论