我尝试将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的编解码器,则会有相同的文字)。
答案 0 :(得分:1)
有多种方法可以将YUV 420存储在缓冲区中;您需要检查您选择的单个像素格式。 MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar
和MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420PackedPlanar
实际上是相同的,简称平面或I420,而其他MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar
,MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420PackedSemiPlanar
和MediaCodecInfo.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行)有关如何填充半平面格式的缓冲区的示例。