android - 使用 ffmpeg 进行视频转换以针对 Android 和 iOS 移动设备

标签 android ios node.js video ffmpeg

我正在为 Android 和 IOS 构建一个 React Native 应用程序,后端 API 是用 NodeJS 编写的。

用户可以从他们的手机上传视频,上传后用户和他们的 friend 将能够观看视频 - 因此视频需要以可在 Android 和 IOS 上播放的格式存储。

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

在之前的项目(这是一个网络应用程序)中,我将上传的视频转换为两个文件,一个 .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);
};

用法:

转换为 mp4:

convertVideo("PATH_TO_VIDEO", "mp4", "foo.mp4", () => {console.log("success");});

转换为 webm:

convertVideo("PATH_TO_VIDEO", "webm", "foo.webm", () => {console.log("success");});

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

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

最佳答案

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

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

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

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

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

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

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

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

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

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

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

future 呢?

请注意,几乎所有科技行业的大公司——除了 Apple——都加入了 Alliance for Open Media .他们正在开发 VP9 的后继产品,名为“AV1 ”,这将获得所有主要浏览器供应商(Chrome、Firefox、Edge)和 Android 的支持。

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

关于android - 使用 ffmpeg 进行视频转换以针对 Android 和 iOS 移动设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45617510/

相关文章:

javascript - Passportjs 回调,理解参数

node.js - 如何使用sails在控制台日志中显示查询?

android - 如何设置 RelativeLayout 中 LinearLayout 的宽度与屏幕分辨率无关?

ios - 解析崩溃报告不起作用

html - 在HTML页面中通过iframe加载HTTPS URL

android - 地理围栏、iBeacons 以及在人们走进餐厅时发送通知

python - 生成和发送 MS Outlook 任务

android - 在 Android 中为 Web 服务编码表情符号时出现问题

android - AJAX 请求 Cordova/PhoneGap 2.1.0 Android 应用程序中的自签名 HTTPS 资源

java - 如何在特定条件下隐藏 toast ?