使用FFmpeg

时间:2016-07-06 15:00:54

标签: ios ffmpeg avfoundation hls fmp4

TL; DR

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

为什么?

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

我尝试了什么

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

    出了什么问题 - 音频和视频中有时会出现问题。我已经确定了3个原因。

    1)为AAC编码器写入的音频启动帧,创建间隙。

    2)由于视频帧长33.33ms,音频帧长0.022ms,因此它们不能在文件末尾排列。

    3)Mac OS上缺少帧精确编码,但不适用于iOS Details Here

  2. FFmpeg将具有原始音频的大视频MP4文件复制到TS段。这项工作基于Kickflip SDK

    错误的内容 - 每隔一段时间就会上传一个仅限音频的文件,而不会播放任何视频。永远无法在内部重现它,但当我们的用户没有记录他们认为他们所做的事情时,这对我们的用户来说非常令人沮丧。在最终细分市场上也存在准确搜索的问题,几乎就像TS细分时间标记不正确一样。

  3. 我现在在想什么

    Apple今年(2016年)正在WWDC推动fMP4,在此之前我还没有对它进行过多次调查。由于fMP4文件可以被读取,并且正在写入时播放,我认为FFmpeg可以对文件进行转码,因为它也被写入,只要我们阻止将字节发送到FFmpeg,直到文件中的每个片段都完成。

    但是,我对FFmpeg C API不够熟悉,我只在尝试#2中简单地使用过它。

    我需要你

    1. 这是一个可行的解决方案吗?是否有人对fMP4足够熟悉,知道我是否能真正实现这一目标?
    2. 我怎么知道AVFoundation已经完成了在文件中写一个片段,以便我可以将它传输到FFmpeg?
    3. 如何从磁盘上的文件中获取数据,一次一块,将其传递给FFmpeg并让它吐出TS段?

1 个答案:

答案 0 :(得分:2)

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

WRT。对齐(1.2)我想这一切都取决于您的编码器设置(帧速率,采样率和GOP大小)。当然可以确保音频和视频完全对齐片段边界(例如参见:this table)。如果您的目标是iOS,我建议使用HLS protocol版本3(或4),以便更准确地表示时间。这也允许您单独流式传输音频和视频(非多路复用)。

我相信ffmpeg应该能够推送一个实时的fmp4流(即使用长时间运行的HTTP POST),但是playout需要origin software来做一些有意义的事情(即流到HLS)。