【问题标题】:Android MediaCodec change resolutionAndroid MediaCodec 更改分辨率
【发布时间】:2015-04-29 00:47:37
【问题描述】:

我将 MediaExtractor 的输出传递给 MediaCodec 解码器,然后将解码器的输出缓冲区传递给编码器的输入缓冲区。我遇到的问题是,当它从编码器出来时,我需要将分辨率从解码器输出的 1920x1080 降低到 1280x720。我可以使用 Surface 来做到这一点,但我正在尝试以 Android 4.1 为目标,因此需要以另一种方式实现这一目标。有谁知道如何使用 MediaCodec 以与 4.1 兼容的方式更改视频文件的分辨率?

【问题讨论】:

  • 如果没有 Surface 输入,您需要在软件中进行。 MediaCodec 在 4.3 (API 18) 之前有些不稳定。如果您使用 ffmpeg,或许通过 NDK,您将拥有一个仅适用于任何 Android 设备的纯软件解决方案。
  • 由于 GPL 许可,我希望避免使用 ffmpeg。从我所看到的情况来看,我不太可能定位
  • FFmpeg 是 LGPL 2.1 或更高版本,除非您使用配置选项来更改许可证,例如 --enable-gpl
  • 我需要编码为 h264,所以我不认为 LGPL 是一种选择。我在想的一件事可能是以目标分辨率从解码器渲染到表面,然后将表面的每一帧作为位图输入编码器。不过,我还不知道这是否可行。

标签: android ffmpeg video-encoding android-mediacodec


【解决方案1】:

您可以使用来自 libav/ffmpeg、libyuv 或任何其他 YUV 处理库的 libswscale,或者编写自己的缩减例程 - 实际上并不难。

基本上,当您将解码器输出缓冲区的输出馈送到编码器输入缓冲区时,您已经不能假设您可以进行纯副本,因为两者可能使用不同的颜色格式。因此,为了灵活,您用于复制数据的代码已经需要能够将任何支持的解码器输出颜色格式转换为任何支持的编码器输入颜色格式。在此复制步骤中,您可以缩小数据。一个平凡的最近邻缩小是很容易实现的;更好看的缩放需要更多的工作。

您无需进行完整的 SW 解码/编码,只需在中间复制步骤中使用 SW 调整数据即可。但正如fadden 指出的那样,MediaCodec 在 4.3 之前并不完全稳定,因此它可能仍然无法在所有设备上运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 2014-05-31
    相关资源
    最近更新 更多