我在使用MediaCodc时非常困难。我以前用它来解码原始h.264流并学到了很多。至少我以为我有。
我的流是附件B格式的h.264。查看原始数据,我的NAL数据包代码类型的结构如下:
[0x09][0x09][0x06] and then 8 packets of [0x21].
[0x09][0x09][0x27][0x28][0x06] and then 8 packets of [0x21].
这不是我收到它们的方式。我试图从这些原始NAL单元类型构建一个完整的访问单元。
我首先感到奇怪的是双[0x09]是访问单元分隔符包。我很确定h.264文件每个访问单元只能指定1澳元。顺便说一句,我能够记录原始数据并使用ffmpeg播放它,有没有额外的AUD。目前,我正在检测此消息并在将整个访问单元发送到MediaCodec之前剥离第一个消息。
第二件事是,我已经硬编码了SPS / PPS字节数组消息[0x27 / 0x28],我在用于初始化MediaCodec的MediaFormat中设置这些消息,类似于:
format.setByteBuffer("csd-0", ByteBuffer.wrap( mySPS ));
format.setByteBuffer("csd-1", ByteBuffer.wrap( myPPS ));
我的视频流提供商供应商告诉我视频是1280 x 720,但是,当我将其转换为mp4文件时,元数据显示为960 x 720.另一个奇怪。
更改这些不同的参数,我仍然无法在我的Thread中获得处理解码器输出的有效缓冲区索引(dequeueOutputBuffer返回-1)。我也改变了超时,但无济于事。如果我手动将SPS / PPS设置为不使用上述示例的第一个数据包,我确实得到-3“输出缓冲区已更改”,这是没有意义的,因为我使用的是API 20.但是我返回的其他所有内容都是-1。
我已经阅读了h.264的Emulation Prevention Byte编码。我能够删除此字节并发送到MediaCodec。似乎没有什么区别。此外,MediaCodec的文档没有明确说明代码是否期望剥离EPB ......?
除了视频帧分辨率之外,唯一与我之前的成功不同的是SEI数据包类型[0x06]的存在。我不确定我是否应该做一些与众不同的事情?
我知道有很多使用过MediaCodec的人都遇到过问题,主要是因为文档不是很好。任何人都可以就我可能做错的事情提出任何其他建议吗?