使用ffmpeg进行视频转换,以定位Android和iOS移动设备

Lee*_*ley 7 video android ffmpeg node.js ios

我正在为Android和IOS构建一个react本机应用程序,后端API是用NodeJS编写的.

用户可以从手机上传视频,一旦上传用户,他们的朋友就可以观看视频 - 因此视频需要以可在Android和IOS上播放的格式存储.

我的问题涉及用户上传的视频转换.几年前我开发了一个类似的应用程序; 我使用了repo node-fluent-ffmpeg,它提供了一个很好的API来与FFmpeg进行交互.

在之前的项目(这是一个Web应用程序)中,我将上传的视频转换为两个文件,一个.mp4和一个.webm - 如果用户上传了mp4,那么我会跳过mp4步骤,同样如果他们上传了一个. WEBM.

这有点慢.现在我几年后遇到了同样的要求,经过一些研究后我认为将视频转换为最后一个项目是错误的.

我已经读过,我可以简单地使用FFmpeg来改变视频的容器格式,这比从头开始转换它们要快得多.

我上次使用的视频转换代码有以下几点:

var convertVideo = function (source, format, output, success, failure, progress) {

    var converter = ffmpeg(source);

    var audioCodec = "libvorbis";

    if (format.indexOf("mp4") != -1) {
        audioCodec = "aac";
    }

    converter.format(format)
        .withVideoBitrate(1024)
        .withAudioCodec(audioCodec)
        .on('end', success)
        .on('progress', progress)
        .on('error', failure);

    converter.save(output);
};
Run Code Online (Sandbox Code Playgroud)

用法:

转换为mp4:

convertVideo("PATH_TO_VIDEO", "mp4", "foo.mp4", () => {console.log("success");});
Run Code Online (Sandbox Code Playgroud)

转换为webm:

convertVideo("PATH_TO_VIDEO", "webm", "foo.webm", () => {console.log("success");});
Run Code Online (Sandbox Code Playgroud)

任何人都可以在这里指出有关此操作性能的代码味道吗?这个代码是否比它应该实现IOS和Android之间的跨平台兼容性要多得多?

可能值得一提的是,在这个项目中,对旧操作系统版本的支持并不是什么大问题.

slh*_*hck 8

编解码器和容器/格式有什么区别?

您应该了解编解码器(例如 H.264、VP9)和容器格式(例如 MP4、WebM)之间的区别。容器只存储编码的视频和音频信息。通常,您可以通过流复制 ( ffmpeg -i input -c copy output)在容器之间切换,但是由于历史原因,您会发现某些容器不接受某些编解码器,或者某些播放器可能无法处理容器内的编解码器(例如,只有最近的软件才会能够读取 MP4 格式的 VP9 视频)。查看此容器格式概述以了解支持哪些编解码器。

不同的移动操作系统有哪些限制?

对于针对 iOS 和 Android 平台,您需要检查给定的视频文件是否与支持的编解码器/格式兼容:

当然,你可能会随着时间而改变,但一般来说,共同点是:

  • H.264 视频
  • MP4 容器
  • 主要简介
  • 最大分辨率为 1920×1080 – 虽然如果设备支持分辨率可能会更高,但移动设备很少需要超过全高清,因为人们无法察觉它与 4K/UHD 之间的区别,除非它很大药片。
  • 帧速率不应超过某个最大值(例如 60 Hz)
  • 色度子采样应为 4:2:0。
  • AAC-LC 音频

具体的限制显然取决于设备和安装的操作系统版本。iOS/Android 文档中并未提及所有这些细节。您绝对应该进行一些试验,如果不确定,请重新编码视频。

那么,我应该使用什么编解码器/格式进行编码?

苹果在MPEG生态系统上投入了大量资金,传统上对H.264和H.265(HEVC)的支持较好;他们不支持 WebM 中的 VP8 和 VP9。因此,如果您有一个 VP8/VP9 视频,并且希望它可以跨平台观看,请将其重新编码为 H.264。

我应该如何进行实际编码?

确保您使用足够高的比特率,以免向已经有损的视频添加更多伪影。您不应该现在那样只进行一次目标比特率编码。相反,进行两次编码以提高编码的质量和效率(尽管需要更长的时间)。如果您不关心特定文件大小(例如libx264 的 CRF),您也可以使用恒定质量模式。阅读FFmpeg H.264 编码指南了解更多信息。

未来呢?

请注意,几乎所有科技行业的大玩家(Apple 除外)都加入了开放媒体联盟。他们正在开发 VP9 的后继产品,称为“ AV1 ”,它将获得所有主要浏览器供应商(Chrome、Firefox、Edge)和 Android 的支持。

H.265 / HEVC 似乎也是一个不错的选择,但与最流行的开源 H.264 编码器x265相比x264,例如,编码目前仍然非常慢。