如何将.movpkg转换为mp4

Vin*_* TP 10 objective-c http-live-streaming ios swift

我正在通过使用流式传输视频(.m3u8) AVPlayer

let url = URL(string: "http:myUrl.m3u8")
let player = AVPlayer(url: url!)

let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = videoView.bounds
playerLayer.backgroundColor = UIColor.purple.cgColor
videoView.layer.addSublayer(playerLayer)

player.play()
Run Code Online (Sandbox Code Playgroud)

我需要将流视频保存到图库。我注意到在下面的委托中保存了缓存视频路径。

func urlSession(_ session: URLSession, assetDownloadTask: AVAssetDownloadTask, didFinishDownloadingTo location: URL) {
        // Do not move the asset from the download location
        UserDefaults.standard.set(location.relativePath, forKey: "assetPath")

    }
Run Code Online (Sandbox Code Playgroud)

当我尝试使用以下代码从UserDefaults获取网址路径时,

let path = UserDefaults.standard.value(forKey: "assetPath")
Run Code Online (Sandbox Code Playgroud)

结果是:

图书馆/com.apple.UserManagedAssets.s9Giec/video_streaming_title_3E90DD91830B8992.movpkg

我在此问题的答案中找到.movpkg文件夹结构

扩展名为“ '.movpkg' 如何将视频转换为mp4并保存到图库”。

注意

  • movpkg文件包含.frag文件。如果有任何答案可以将.frag文件转换为mp4文件,则可以接受。

  • 我可以AVAsset.movpkgURL 创建一个,因此问题“如何将AVAsset转换为mp4文件”的答案也可以接受。

对于想要帮助的人,我在这里创建了一个仓库

https://github.com/trungducc/stackoverflow/tree/movpkg-to-mp4

.movpkg下载完成后,您可以尝试将文件转换为mp4。请注意,模拟器不支持下载HLS流,因此请在真实设备上运行存储库。

Nad*_*'El 1

根据https://en.wikipedia.org/wiki/HTTP_Live_Streaming,这些“片段”是 MPEG-2 TS 片段。您可以简单地连接所有这些片段并在大多数视频播放器中播放结果,但它不会您想要的真正的 mp4 文件。但值得测试,也许生成的“.ts”视频文件足以满足您的需求。但它还不够好(例如,我最喜欢的流媒体对 mp4 文件的处理效果比对 MPEG-2 TS 的效果好得多),转换确实有意义。我通常在 Linux 中使用 ffmpeg 执行此操作:

ffmpeg -i all.ts -acodec copy -absf aac_adtstoasc -vcodec copy out.mp4
Run Code Online (Sandbox Code Playgroud)

其中“all.ts”是所有片段的串联(当然,按照正确的顺序,如 m3u8 中指定的或通常作为文件名的一部分),输出将转到“out.mp4”。此转换仅与容器一起播放,不需要重新编码视频,因此速度非常快。

这个答案可能并不完全是您正在寻找的(它不是 Objective-C 或 Swift 代码或您可以在 iPhone 上运行的任何代码),但也许它会提示您要寻找什么,或者至少是您可以测试的东西在您的桌面上。

  • 有趣的。也许苹果切换到“碎片 mp4” - 例如参见 https://bitmovin.com/hls-news-wwdc-2016/。根据我读过的一些资料(我自己没有看),你实际上可以将所有片段以正确的顺序连接在一起(例如,Linux 的猫),并最终得到一个有效的 mp4 文件。你尝试过吗? (2认同)