MediaCodec 和输出格式

roi*_*ola 2 android android-mediacodec

我正在尝试使用 MediaDecoder 类编写视频播放器,我遇到了一个问题,它阻止了我的开发,

这是一个代码片段

extractor = new MediaExtractor();
extractor.setDataSource(filename);

MediaFormat format = extractor.getTrackFormat(i);
extractor.selectTrack(0);

MediaCodec decoder = MediaCodec.createDecoderByType(mime);
decoder.configure(format, null, null, 0);

decoder.start();

ByteBuffer[] inputBuffers = decoder.getInputBuffers();
ByteBuffer[] outputBuffers = decoder.getOutputBuffers();

Log.d(TAG, " "+decoder.getOutputFormat());
Run Code Online (Sandbox Code Playgroud)

问题是每个设备打印的输出格式都会发生变化,因此无法将其打印到 Open GL 纹理。

有没有办法强制解码器始终输出相同的格式?如果没有,有没有人知道任何可以进行转换的库?

非常感谢您的任何见解

fad*_*den 5

无法设置解码器的输出格式。事实上,您可能甚至不应该检查它,直到您收到更新MediaFormatdequeueOutputBuffer()——在返回第一个数据块之前,您会得到一个MediaCodec.INFO_OUTPUT_FORMAT_CHANGED结果。

如果您想从 OpenGL ES 访问解码的帧,您应该Surface从 a创建一个SurfaceTexture并将其传递到解码器configure()调用中。它更有效,并且不需要您了解有关数据格式的任何信息。

有关示例,请参阅DecodeEditEncodeTest.java CTS 测试,并特别注意OutputSurface类及其在checkVideoFile().