MediaCodec sample之后的大部分代码不会生成视频。
让我问一个具体的问题,而不是提出一个一般性的问题:这是否表示如果MediaCodec.releaseOutputBuffer()成功返回而没有生成异常,则解码工作正常。我正在尝试确定问题是否归因于解码器或表面设置。

MediaCodec.BufferInfo bi = new MediaCodec.BufferInfo();
int iOutputBufferIndex = _mcDecoder.dequeueOutputBuffer(bi, TIMEOUT_USEC);
if (iOutputBufferIndex == MediaCodec.INFO_TRY_AGAIN_LATER) {
    // no output available yet
} else if (iOutputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
    _bbDecoderOutputBuffers = _mcDecoder.getOutputBuffers();
 } else if (iOutputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
    MediaFormat newFormat = _mcDecoder.getOutputFormat();
} else if (iOutputBufferIndex < 0) {
    //log error;
} else {
    //Can the following statement be used to assess the success of the decoding?
    _mcDecoder.releaseOutputBuffer(iOutputBufferIndex, true);
}

最佳答案

缓冲区的内容告诉您解码是否有效。释放缓冲区只是告诉系统您已经看完了。

如果为输出配置了Surface,则似乎将获得零字节的数据缓冲区。设置Surface标志(您似乎已完成)后,实际数据将呈现给render。除非Surface以某种方式绑定到UI,否则您将看不到实际内容。 (请注意,当前的示例集基本上不会尝试显示任何内容。)

如果未配置Surface,则应该在出队的每个输出缓冲区中看到非零数量的数据。

从聊天会话更新:OP在SurfaceView上设置了不透明的背景。 SurfaceView实际上是一个透明的窗口,表面位于其后,因此使它不透明,从而使视频模糊。

关于android - MediaCodec.releaseOutputBuffer()可以用于评估解码是否成功,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19719887/

10-12 01:24