如何在没有 MediaExtractor 的情况下为 H264 使用 MediaCodec

编程入门 行业动态 更新时间:2024-10-09 23:17:19
本文介绍了如何在没有 MediaExtractor 的情况下为 H264 使用 MediaCodec的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我需要在没有 MediaExtractor 的情况下使用 MediaCodec,并且我正在使用 FileInputStream 读取文件.目前它不工作,它在屏幕上显示一个绿色的乱码图像.

I need to use MediaCodec without the MediaExtractor and I'm reading the file using a FileInputStream. Currently it is not working, it is showing a greenish scrambled image on the screen.

这是完整的源代码:

FileInputStream in = new FileInputStream("/sdcard/sample.ts"); String mimeType = "video/avc"; MediaCodec decoder = MediaCodec.createDecoderByType(mimeType); MediaFormat format = MediaFormat.createVideoFormat(mimeType, 1920, 1080); byte[] header_sps = { 0, 0, 0, 1, 103, 100, 0, 40, -84, 52, -59, 1, -32, 17, 31, 120, 11, 80, 16, 16, 31, 0, 0, 3, 3, -23, 0, 0, -22, 96, -108 }; byte[] header_pps = { 0, 0, 0, 1, 104, -18, 60, -128 }; format.setByteBuffer("csd-0", ByteBuffer.wrap(header_sps)); format.setByteBuffer("csd-1", ByteBuffer.wrap(header_pps)); format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 1920 * 1080); format.setInteger("durationUs", 63446722); decoder.configure(format, surface, null, 0); decoder.start(); ByteBuffer[] inputBuffers = decoder.getInputBuffers(); ByteBuffer[] outputBuffers = decoder.getOutputBuffers(); BufferInfo info = new BufferInfo(); boolean isEOS = false; long startMs = System.currentTimeMillis(); while (!Thread.interrupted()) { if (!isEOS) { int inIndex = decoder.dequeueInputBuffer(1000); if (inIndex >= 0) { byte buffer2[] = new byte[18800 * 8 * 8 * 8]; ByteBuffer buffer = inputBuffers[inIndex]; int sampleSize; sampleSize = in.read(buffer2, 0, 18800 * 4); buffer.clear(); buffer.put(buffer2, 0, sampleSize); buffer.clear(); if (sampleSize < 0) { decoder.queueInputBuffer(inIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM); isEOS = true; } else { decoder.queueInputBuffer(inIndex, 0, sampleSize, 0, 0); } } } int outIndex = decoder.dequeueOutputBuffer(info, 10000); switch (outIndex) { case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED: Log.d("DecodeActivity", "INFO_OUTPUT_BUFFERS_CHANGED"); outputBuffers = decoder.getOutputBuffers(); break; case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED: Log.d("DecodeActivity", "New format " + decoder.getOutputFormat()); break; case MediaCodec.INFO_TRY_AGAIN_LATER: Log.d("DecodeActivity", "dequeueOutputBuffer timed out! " + info); break; default: ByteBuffer buffer = outputBuffers[outIndex]; Log.v("DecodeActivity", "We can't use this buffer but render it due to the API limit, " + buffer); while (info.presentationTimeUs / 1000 > System.currentTimeMillis() - startMs) { try { sleep(10); } catch (InterruptedException e) { e.printStackTrace(); break; } } decoder.releaseOutputBuffer(outIndex, true); break; } if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) { Log.d("DecodeActivity", "OutputBuffer BUFFER_FLAG_END_OF_STREAM"); break; } } decoder.stop(); decoder.release();

如果我使用 MediaExtractor,一切正常.我在使用 MediaExtractor 时通过查看 MediaFormat 获得了 SPS/PPS 值.如果我删除下面的部分,屏幕上不会显示任何内容.

If I use the MediaExtractor, everything works fine. I got the SPS/PPS values by looking at the MediaFormat when using MediaExtractor. If I remove the section below, nothing is shown on the screen.

byte[] header_sps = { 0, 0, 0, 1, 103, 100, 0, 40, -84, 52, -59, 1, -32, 17, 31, 120, 11, 80, 16, 16, 31, 0, 0, 3, 3, -23, 0, 0, -22, 96, -108 }; byte[] header_pps = { 0, 0, 0, 1, 104, -18, 60, -128 }; format.setByteBuffer("csd-0", ByteBuffer.wrap(header_sps)); format.setByteBuffer("csd-1", ByteBuffer.wrap(header_pps)); format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 1920 * 1080); format.setInteger("durationUs", 63446722);

我错过了什么?如何在没有 MediaExtractor 的情况下以编程方式获取 SPS/PPS 值?

What I am missing? How can I get the SPS/PPS values programatically without MediaExtractor?

推荐答案

我假设您正在阅读原始 H.264 基本流而不是 MP4 文件.

I'm assuming you're reading a raw H.264 elementary stream and not an MP4 file.

看起来您正在向解码器提供固定大小的数据块.那行不通.您需要将一个访问单元放入每个缓冲区.

It looks like you're feeding fixed-size blocks of data to the decoder. That doesn't work. You need to put a single access unit into each buffer.

更多推荐

如何在没有 MediaExtractor 的情况下为 H264 使用 MediaCodec

本文发布于:2023-10-29 00:31:55,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1538204.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:情况下   如何在   MediaCodec   MediaExtractor

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!