【发布时间】:2016-09-08 10:48:58
【问题描述】:
我正在使用MediaCodec API 播放通过以太网端口接收的视频流(H.264)。
从官方文档和各种示例中了解到,我需要执行以下操作。
- 根据mimetype创建
MediaCodec实例(video/avcforH.264) - 使用 SPS 帧数据馈送“csd-0”。 SPS 帧应以 0x00000001 开头
- 为“csd-1”缓冲区提供 PPS 帧数据。 PPS 帧应以 0x00000001 开头
- 致电
decoder.configure()和decoder.start()。如果一切顺利,说明解码器配置正确,没有异常。 - 配置
MediaCodec后,我们可以向解码器提供所有其余帧(解包的 NAL 单元)。 - 成功出列操作后,解码后的缓冲区可以按如下方式呈现到屏幕上。
outputBufferId = decoder.dequeueOutputBuffer(info, 1000);
decoder.releaseOutputBuffer(outputBufferId, true);
问题
decoder.dequeueOutputBuffer() 在 android 6.0 上返回 -3。
官方文档说,如果在dequeueOutputBuffer() 期间出现任何错误,只会返回 -1 (INFO_TRY_AGAIN_LATER) 和 -2 (INFO_OUTPUT_FORMAT_CHANGED) 并且 -3 (INFO_OUTPUT_BUFFERS_CHANGED) 已弃用。那么为什么我会收到 -3?
我应该如何纠正这个问题?
代码片段:
String mimeType = "video/avc";
decoder = MediaCodec.createDecoderByType(mimeType);
mformat = MediaFormat.createVideoFormat(mimeType, 1920, 1080);
while (!Thread.interrupted()) {
byte[] data = new byte[size];
bin.read(data, 0, size);
if (data is SPS frame) {
mformat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 0);
mformat.setByteBuffer("csd-0", ByteBuffer.wrap(data));
continue;
}
if (data is PPS frame) {
mformat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 0);
mformat.setByteBuffer("csd-1", ByteBuffer.wrap(data));
decoder.configure(mformat. surface, null, 0);
decoder.start();
is_decoder_configured = true;
continue;
}
if (!is_decoder_configured)
continue;
index = decoder.dequeueInputBuffer(1000);
if (index < 0) {
Log.e(TAG, "Dequeue in put buffer failed..\n");
continue;
}
buf = decoder.getInputBuffer(index);
if (buf == null)
continue;
buf.put(data);
decoder.queueInputBuffer(index, 0, data.length, 0, 0);
int outputBufferId = decoder.dequeueOutputBuffer(info, 1000);
switch (outputBufferId) {
case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED:
Log.i("DecodeActivity", "New format " + decoder.getOutputFormat());
break;
case MediaCodec.INFO_TRY_AGAIN_LATER:
Log.i("DecodeActivity", "dequeueOutputBuffer timed out!");
break;
default:
Log.i(TAG, "Successfully decoded the output : " + outputBufferId);
decoder.releaseOutputBuffer(outputBufferId, true);
break;
}
}
if (is_decoder_configured()) {
decoder.stop();
decoder.release();
}
如果您发现任何其他错误,请告诉我。将不胜感激!
【问题讨论】:
标签: android h.264 android-mediacodec