如何使来自 iOS 应用程序的 MP4 录制视频可在 Chrome 上播放?

Posted

技术标签:

【中文标题】如何使来自 iOS 应用程序的 MP4 录制视频可在 Chrome 上播放?【英文标题】:How to make an MP4 recorded video from an iOS app playable on Chrome? 【发布时间】:2021-07-28 08:20:06 【问题描述】:

我有一个 ios 应用程序,用户可以在其中将自拍视频上传到我的服务器上。之后,审阅者在后台网站上看到该视频,然后接受/拒绝它。

问题是我从 iOS 客户端应用上传 MP4 视频文件。当我在我的网站的<video> 标签中加载文件 url 时,chrome 不会加载视频(控制台中没有显示错误)。在 Safari 中,一切正常。

经过一些研究,我发现 有时,Chrome 无法播放 mp4 视频。奇怪的是,我尝试在我的笔记本电脑上用 chrome 播放其他一些 mp4 视频,而且效果很好。好像有几种“种类”的 MP4 编码,而我的客户端应用程序用来编码的一种不受 Chrome 支持。

我看到 Chrome 可以处理 .webm 格式,但是我需要很长时间才能将我的服务器从 MP4 转换为 WEBM(100% CPU 时需要 4 整分钟...)。

我的问题是:

(1) 为什么有的mp4可以用Chrome播放,有的不能?如何使 Swift AVFoundation 模块以“正确”的 mp4 编码对录制的视频进行编码?

(2) 如果不可能,我想在客户端对用户设备中的 2 个文件(webm 和 mp4)进行编码(我真的想避免由我的服务器处理这些计算,因为它们看起来非常长履行)。问题是 Apple 没有在文档中提供 webm 作为可能的可翻译格式:https://developer.apple.com/documentation/avfoundation/avfiletype。有什么方法可以在 Swift 中将 mp4 翻译成 webm 吗?

(3) 如果 (2) 是不可能的,那么在服务器端将用户视频转换为不同格式的操作通常是作为管理视频文件并使其在所有平台上可用的“最佳实践”吗?我的意思是,我只是错过了一些让 mp4 视频在任何地方都可以播放的客户端技巧,还是在处理跨平台视频以预算来自 AWS 的整个 CPU 机器或处理服务器端转换的任何东西时这是否​​正常?

【问题讨论】:

下载 MediaInfo 以检查您输入视频的编解码器。 MP4 格式可以包含 H264 和 H265 编解码器的视频,但 Chrome 仅支持 H264。 【参考方案1】:

无论出于何种原因,Swift 编码错误。为了以正确的编码进行编码,以便它可以在 Chrome 中的 <video> 标签中使用,我在我的 iOS 应用程序中使用:

if movieFileOutput.availableVideoCodecTypes.contains(.h264) 
    // Use the H.264 codec to encode the video.
    movieFileOutput.setOutputSettings([AVVideoCodecKey: AVVideoCodecType.h264], for: connection!)

【讨论】:

以上是关于如何使来自 iOS 应用程序的 MP4 录制视频可在 Chrome 上播放?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 录制视频MOV格式转MP4

在iOS中,摄像头录制的视频是mov格式的,虽然mov兼容mp4,但是有些需求需要用到mp4格式的视频文件。

以 mp4 格式录制、保存和/或转换视频?

mediarecorder 如何暂停和恢复录制视频

在 mp4 中使用 gstreamer h264 + aac 录制只会产生部分可播放的文件

iOS 视频录制压缩上传