Android Mediacodec (OMX.ST.VFM.H264Enc)



我有一个Samsung Galaxy S3 mini(GT-I8190 @ 4.1.1),我无法将原始视频帧编码到H.264中。我已经在其他几个具有不同编码器供应商的设备上进行了测试,并且我能够获得添加一些供应商/版本的特定疑问的工作。

通常,通常的嫌疑犯(对齐缓冲区等),我在几个自定义ROM上找到了奇数输入像素格式的修复程序:示例。这给了我一些进展,直到我无法配置媒介物,从而导致主张:

CHECK(def.nBufferSize >= size) failed.

我挖了更多东西,并找到了解决此问题的文章。因此,我能够创建并启动MediaCodec,但是现在我面临一个缓冲区问题,因为编码器只为每个输入缓冲区提供12分,这很奇怪。

关于什么问题的任何提示?

示例代码:

MediaFormat format = MediaFormat.createVideoFormat("video/avc", width, height);
format.setInteger(MediaFormat.KEY_WIDTH, width);
format.setInteger(MediaFormat.KEY_HEIGHT, height);
format.setInteger(MediaFormat.KEY_BIT_RATE, bitrate);
format.setInteger(MediaFormat.KEY_FRAME_RATE, fps);
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, capabilities.getH264EncoderPixelFormat());
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1);
format.setInteger("stride", stride);
format.setInteger("slice-height", sliceHeight);
format.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 0);
codec = MediaCodec.createEncoderByType("video/avc");
codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
codec.start();
ByteBuffer[] inputBuffers = codec.getInputBuffers();
ByteBuffer[] outputBuffers = codec.getOutputBuffers();

编辑1:

MediaFormat内容,就在 codec.configure(...)之前:

{max-input-size = 0,frame-rate = 31,高度= 180,slice-height = 192, color-format = 2141192192,宽度= 320,bitrate = 64000,mime = video/avc, 步幅= 320,i-frame Interval = 1}

编辑2:

内容 bytebuffer [] inputbuffers codec.getInputBuffers()

[java.nio.ReadWritedirectByteBuffer,状态:容量= 12位置= 0 限制= 12,java.nio.ReadWritedirectByteBuffer,状态:容量= 12 位置= 0限制= 12]

看起来您已经选择了特定于供应商的颜色格式。根据注释链接的补丁,0x7fa00000为OMX_STE_COLOR_FormatYUV420PackedSemiPlanarMB。从仅给您12个字节缓冲区的事实来看,我希望这实际上是将手柄传递给缓冲区而不是缓冲区内容(类似于COLOR_FormatSurface)。

由于您正在尝试输入原始数据的缓冲区,因此您可能无法使其工作起作用)。

我建议从一组已知格式中选择输入格式。您可以在selectColorFormat()方法中在 CC_5方法中看到一个示例。为了在API> = 18的所有设备上提供支持,您只需要处理两种情况:平面和半平面YUV420。

在与此问题进行了很多战斗之后,我无法解决问题,看来没有解决此特定问题的解决方案。

最新更新