通过Android的MediaCodec为Qualcomm的AVC编码器输入缓冲区编码

时间:2016-10-10 13:07:34

标签: android encoding codec mediacodec qualcomm

我尝试将Android views捕获为位图并将其另存为.mp4文件。

我使用MediaCodec编码位图,MediaMuxer将其复制到.mp4。

使用YUV420p颜色格式我希望MediaCodec的输入缓冲区的大小为resWidth * resHeight * 1.5,但Qualcomm的OMX.qcom.video.encoder.avc给了我更多(无论我选择什么分辨率)。我相信它希望我在输入字节流中做一些对齐,但我不知道如何找出它希望我做什么。

这是我使用Qualcomm的编解码器在Nexus 7(2013)的输入缓冲区中紧紧打包数据时得到的结果:https://www.youtube.com/watch?v=JqJD5R8DiC8

此视频是由在Nexus 10(编解码器OMX.Exynos.AVC.Encoder)上运行的相同应用制作的:https://www.youtube.com/watch?v=90RDXAibAZI

所以看起来luma飞机在错误的视频中是好的,但色度平面发生的事情对我来说是一个谜。

我准备了最小的(2个类)工作代码示例,揭露了这个问题:https://github.com/eeprojects/MediaCodecExample

只需运行此应用即可获得上面显示的视频(如果您的设备使用Qualcomm的编解码器,则会有相同的文字)。

1 个答案:

答案 0 :(得分:1)

有多种方法可以将YUV 420存储在缓冲区中;您需要检查您选择的单个像素格式。 MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420PlanarMediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420PackedPlanar实际上是相同的,简称平面或I420,而其他MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanarMediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420PackedSemiPlanarMediaCodecInfo.CodecCapabilities.COLOR_TI_FormatYUV420PackedSemiPlanar称为半平面或NV12

在semiplanar中,您不必为U和V分隔平面,但是您有一个单独的平面,其中包含交错的U,V对。

请参阅 https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java(第925-949行)有关如何填充半平面格式的缓冲区的示例。