1

主要遵循MediaCodec 示例的代码不会生成视频。
与其问一个笼统的问题,不如问一个具体的问题:如果 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);
}
4

1 回答 1

3

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

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

如果您没有配置 a Surface,您应该在出列的每个输出缓冲区中看到非零数据量。

聊天会话更新:OP 在SurfaceView. SurfaceView实际上是一个透明窗口,其后有 Surface 分层,因此使其不透明会遮挡视频。

于 2013-11-01T05:05:18.123 回答