使用FFmpeg在iOS上书写时,将fMP4转码为HLS

TL; DR

在iOS设备上使用FFmpeg编写片段时,我想将fMP4片段转换为TS片段(用于HLS)。

为什么?

我试图在iOS上实现实时上传,同时在本地维护一个无缝的高清副本。

我试过了

  1. 滚动AVAssetWriter s每个写8秒,然后通过FFmpeg将MP4连接在一起。

    出了什么问题 – 有时audio和video中会出现闪烁的声音。 我已经确定了3个原因。

    1)为由AAC编码器写入的audio起始帧创build间隙。

    2)由于video帧长度为33.33ms,audio帧长度为0.022ms,因此在文件末尾可能不排队。

    3)在Mac OS上缺less帧精确的编码,但不适用于iOS 细节

  2. FFmpeg将一个只有MP4video的原始audio文件转换成TS段。 该工作基于Kickflip SDK

    什么错了 – 每隔一段时间只有一个audio文件将上传,没有任何video。 永远不能在内部重现它,但是当我们的用户没有logging他们认为他们做了什么的时候,它是非常令人不快的。 在最后的细分市场上也存在着准确的寻找问题,就像TS细分市场的时间戳错误一样。

我现在在想什么

苹果公司今年(2016年)在WWDC上推出了fMP4,在此之前我没有多less关注过它。 由于fMP4文件可以被读取,并且在写入的时候被播放所以我认为FFmpeg也可以在文件被写入的时候进行转码,只要我们不要发送字节到FFmpeg,直到每个片段该文件完成。

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

我需要你的东西

  1. 这是一个可行的解决scheme? 是否有人熟悉fMP4知道我能否真的做到这一点?
  2. 我将如何知道AVFoundation已经完成在文件中写入一个片段,以便我可以将其pipe理到FFmpeg?
  3. 我怎样才能从磁盘上的文件,一次一块,传递到FFmpeg,并吐出TS段?

严格地说,如果包含h264 + aac,则不需要对fmp4进行转码,只需要将样本数据重新打包为TS即可。 (使用ffmpeg -codec copy或gpac )

WRT。 alignment(1.2)我想这一切都取决于您的编码器设置(帧率,采样率和GOP大小)。 确实可以确保audio和video在片段边界处完全alignment(例如,参见本表 )。 如果您的目标是iOS,我会build议使用HLS协议版本3(或4),以便更准确地表示计时。 这也允许您分开stream式传输audio和video(非复用)。

我相信ffmpeg应该能够推送一个活的fmp4stream(即使用一个长时间运行的HTTP POST),但是播放需要起源软件对它做一些有意义的事情(即stream向HLS)。