在 iOS 上使用 FFmpeg 将 fMP4 转码为 HLS 时的编写方法

58

简述

我需要将使用FFmpeg在iOS设备上写入的fMP4片段转换为TS分段(用于HLS)。

为什么?

我想在iOS上实现实时上传,同时保持本地高清无缝拷贝。

我尝试了什么

  1. 使用滚动的AVAssetWriter,每个AVAssetWriter写入8秒,然后通过FFmpeg连接MP4。

    发生了什么错误 - 音频和视频有时会出现故障。我已经确定3个原因。

    1)AAC编码器为音频编写的预热帧创建间隙。

    2)由于视频帧长为33.33毫秒,而音频帧长为0.022毫秒,因此它们有可能在文件末尾不对齐。

    3)Mac OS上缺乏帧精确编码,但在iOS上不可用详细信息请查看此处

  2. 使用FFmpeg混合大型仅视频的MP4文件和原始音频到TS分段。该工作基于Kickflip SDK

    发生了什么错误 - 时不时地会上传仅音频的文件,完全没有视频。我们无法在内部再现它,但当用户没有记录他们认为他们做到了的内容时,这对他们来说是相当沮丧的。最终分段中也存在精准寻找的问题,几乎像是TS分段时间戳设置不正确。

我现在的想法

苹果在2016年的WWDC上推出了fMP4,我之前并没有仔细研究过。由于fMP4文件可以在写入时读取和播放,因此我认为只要在文件中的每个片段完成后再将字节发送给FFmpeg,就可以让FFmpeg在写入时进行转码。

但是,我对FFmpeg C API不够熟悉,我只在第二次尝试中简单使用了它。

我需要你提供的帮助

  1. 这是可行的解决方案吗?是否有人熟悉fMP4并知道我是否能实现这个功能?
  2. 我如何知道AVFoundation已经完成了文件中的一个片段的写入,以便我可以将其传输到FFmpeg?
  3. 我如何逐块从磁盘上的文件中提取数据,传递给FFmpeg,并让它输出TS分段?

6
这个问题应该属于“如何提问”的帮助类问题。需要撰写一个清晰明了、表述得当的问题。 - Somnath Muluk
4
我已经放弃使用AVAssetWriter作为中间人,转而使用VideoToolbox(文档非常差)在内存中转换帧。代码基于这个例子 https://github.com/twinenginelabs/kickflip-ios-sdk - bclymer
1个回答

3
严格来说,如果fmp4包含h264 + aac,则不需要对其进行转码,只需将样本数据重新封装为TS即可(使用ffmpeg -codec copygpac)。
关于对齐(1.2),我想这完全取决于编码器设置(帧率、采样率和GOP大小)。确实可以确保音频和视频在片段边界处完全对齐(例如,请参阅:此表)。如果你的目标是iOS,则建议使用HLS协议版本3(或4),以更准确地表示时间。这还允许您分别流式传输音频和视频(非复用)。
我相信ffmpeg应该能够推送实时fmp4流(即使用长时间运行的HTTP POST),但播放需要源软件才能对其进行有意义的处理(即流式传输到HLS)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接