原始h.264的Android MediaCodec解码

原始h.264的Android MediaCodec解码,android,h.264,android-mediacodec,Android,H.264,Android Mediacodec,我和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单元类型构建一个完整的访问单元 我首先感到奇

我和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单元类型构建一个完整的访问单元

我首先感到奇怪的是double[0x09],它是访问单元分隔符数据包。我很确定h.264文档只指定了每个访问单元1 AUD。顺便说一句,我能够记录原始数据,并使用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。另一个奇怪之处

更改这些不同的参数后,我仍然无法在处理解码器输出的线程中获得有效的缓冲区索引(dequeueOutputBuffer返回-1)。我也改变了超时时间,但没有用。如果我手动将SPS/PPS设置为不使用上述示例的第一个数据包,我会得到-3“output buffers have changed”(输出缓冲区已更改),这是毫无意义的,因为我使用的是API 20。但我得到的其他东西都是-1

我读过h.264的字节编码。我能够去掉这个字节并发送到MediaCodec。似乎没有什么不同。此外,MediaCodec的文档没有明确说明代码是否希望剥离EPB

除了视频帧分辨率之外,与我之前的成功不同的是SEI数据包类型[0x06]的存在。我不确定我是否应该用这个做些特别的事情


我知道有很多使用过MediaCodec的人都有问题,主要是因为文档不是很好。有人能就我可能做错的地方提供任何其他建议吗?

可能需要@lajosmolnar()来解决这个问题。考虑到额外的AUD,如果视频提供商没有提供正确的数据,我不会感到惊讶,根据规范。我想知道我是否需要查看切片帧编号,看看它们是否跨越NAL AUD数据包。@fadden也许你可以帮我一个问题?我现在正在分析访问单元分隔符。当我查看完整访问单元的大小时,它们比我的视频供应商的前一版本小得多。我确信我正确地解析了它们,因为我的缓冲区/解析代码是相同的。以前的版本(有效)分辨率更小。您是否见过AUD数据包之间的解析不构成完整帧的情况?帧编号标记在AUD之间相同。。也许我需要查看另一个变量并将多个数据包排队?对不起,我对H.264不太了解。