我正在尝试使用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());
问题是每个设备的输出格式打印更改都无法将其打印到Open GL纹理。
有没有办法强制解码器输出始终相同的格式? 如果不是,是否有人知道任何可用于转换的库?
非常感谢任何见解
答案 0 :(得分:4)
无法设置解码器的输出格式。事实上,在您从MediaFormat
收到更新的dequeueOutputBuffer()
之前,您可能不应该检查它 - 在返回第一个数据块之前,您将获得MediaCodec.INFO_OUTPUT_FORMAT_CHANGED
结果。
如果您想从OpenGL ES访问已解码的帧,您应该从Surface
创建SurfaceTexture
并将其传递到解码器configure()
。它效率更高,并且不需要您了解数据格式。
有关示例,请参阅DecodeEditEncodeTest.java CTS test,并特别注意OutputSurface类及其在checkVideoFile()
中的使用方式。