主要遵循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);
}
答案 0 :(得分:3)
缓冲区的内容告诉您解码是否正常。释放缓冲区只会告诉系统您已完成查看。
如果为输出配置了Surface
,您将看到获得零字节数据缓冲区。设置Surface
标志(您似乎已经完成)后,实际数据将呈现给render
。除非Surface
以某种方式绑定到UI,否则您将看不到实际内容。 (注意当前的一组示例在很大程度上不会尝试显示任何内容。)
如果您未配置Surface
,则应在每个输出缓冲区中看到非零数量的数据。
更新:OP正在SurfaceView
设置不透明背景。 SurfaceView
实际上是一个透明窗口,其背后有Surface分层,因此使其不透明会遮挡视频。