可以使用MediaCodec.releaseOutputBuffer()来评估解码的成功与否

时间:2013-11-01 02:26:43

标签: android mediacodec

主要遵循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);
}

1 个答案:

答案 0 :(得分:3)

缓冲区的内容告诉您解码是否正常。释放缓冲区只会告诉系统您已完成查看。

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

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

聊天会话中的

更新:OP正在SurfaceView设置不透明背景。 SurfaceView实际上是一个透明窗口,其背后有Surface分层,因此使其不透明会遮挡视频。