我将MediaExtractor的输出传递给MediaCodec解码器,然后将解码器的输出缓冲区传递给编码器的输入缓冲区。我遇到的问题是,当编码器出来时,我需要将解码器的1920x1080输出分辨率降低到1280x720。我可以使用Surface来做到这一点,但我试图以Android 4.1为目标,因此需要以另一种方式实现。有没有人知道如何使用MediaCodec改变视频文件的分辨率,但是以与4.1兼容的方式?
答案 0 :(得分:1)
您可以使用libav / ffmpeg或libyuv中的libswscale或任何其他YUV处理库,或编写自己的缩减例程 - 实际上并不是很难。
基本上,当您将解码器输出缓冲区的输出提供给编码器输入缓冲区时,您已经不能假设您可以进行纯文本复制,因为这两者可能使用不同的颜色格式。因此,为了灵活,您的复制数据代码已经需要能够将任何支持的解码器输出颜色格式转换为任何支持的编码器输入颜色格式。在此复制步骤中,您可以缩小数据。一个简单的最近邻居缩减很容易实现;更好看的缩放需要更多的工作。
您不需要进行完整的SW解码/编码,您只需使用SW来调整中间复制步骤中的数据。但正如fadden指出的那样,MediaCodec在4.3之前并不完全稳定,所以它可能仍无法在所有设备上运行。