我必须使用Android MediaCodec
API解码H.264流。问题是我此时不知道输出流的大小(我的意思是帧的分辨率:640x360?1280x720?1920x1080?...)。我使用自己的访问/解复用程序代码将输入流作为ByteBuffer
对象获取。创建我的MediaCodec
的第一步是:
MediaCodec mediaCodec = MediaCodec.createDecoderByType("video/avc");
然后,要配置它,我希望有正确的MediaFormat
信息来配置我的MediaCodec
对象。目前,我这样做:
MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", 1280, 720);
但是大小并不总是1280x720而我的MediaFormat
需要更多信息(在某些测试设备上,解码器会产生奇怪的结果,但在其他测试设备上工作正常)。我阅读了文档,但我发现我们可以使用MediaFormat
和MediaExtractor
获得正确的getTrackFormat(/* idx */);
。但是如何将MediaExtractor
用于我的原始ByteBuffer
(setDataSource(...)
只能处理文件描述符或uris)?还有其他方法可以处理吗?
谢谢!
编辑:我从我的流中提取了SPS和PPS,并在配置步骤(通过MediaFormat
)执行时将其提供给编解码器:
mediaFormat.setByteBuffer("csd-0", bufferSPS);
mediaFormat.setByteBuffer("csd-1", bufferPPS);
/*...*/
mediaCodec.configure(mediaFormat, null, null, 0);