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

bcl*_*mer 57 ffmpeg avfoundation http-live-streaming ios fmp4

TL; DR

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

为什么?

我正在尝试在iOS上实现实时上传,同时在本地保持无缝的高清副本.

我试过的

  1. 滚动AVAssetWriters,每次写入8秒,然后通过FFmpeg连接MP4.

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

    1)为AAC编码器写入的音频启动帧,从而产生间隙.

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

    3)Mac OS上缺少帧精确编码,但iOS 详细信息不适用于此

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

    什么是错的 - 每隔一段时间,只有一个音频文件会上传,没有任何视频.永远不能在内部重现它,但当他们没有记录他们认为他们做的事情时,它对我们的用户来说非常令人沮丧.在最后一段上也存在准确搜索的问题,几乎就像TS段的时间戳错误一样.

我现在在想什么

苹果公司今年(2016年)正在WWDC推动fMP4,在此之前我还没有对它进行太多调查.由于fMP4文件可以在写入读取和播放,我认为FFmpeg也可以在写入时对文件进行转码,只要我们阻止将字节发送到FFmpeg直到每个片段内文件完成了.

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

我需要你什么

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

Tij*_*ter 3

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

沃特。对齐 (1.2) 我想这一切都取决于您的编码器设置(帧速率、采样率和 GOP 大小)。当然可以确保音频和视频在片段边界处精确对齐(例如参见此表)。如果您的目标是 iOS,我建议使用HLS 协议版本 3(或 4),以便更准确地表示时间。这还允许您单独传输音频和视频(非复用)。

我相信 ffmpeg 应该能够推送实时 fmp4 流(即使用长时间运行的 HTTP POST),但播放需要原始软件对其执行一些有意义的操作(即流到 HLS)。