58

TL;博士

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

为什么?

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

我试过的

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

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

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

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

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

  2. FFmpeg 将带有原始音频的大视频 MP4 文件混合到 TS 段中。这项工作基于Kickflip SDK

    出了什么问题 - 每隔一段时间就会上传一个只有音频的文件,没有任何视频。永远无法在内部重现它,但是当我们的用户没有记录他们认为自己做了什么时,这让他们非常沮丧。最终片段的准确搜索也存在问题,几乎就像 TS 片段被错误地标记了时间戳一样。

我现在在想什么

Apple 在今年(2016 年)的 WWDC 上推出了 fMP4,在那之前我并没有过多地研究它。由于 fMP4 文件可以在写入时被读取和播放,我认为 FFmpeg 也可以在文件写入时对其进行转码,只要我们推迟将字节发送到 FFmpeg 直到其中的每个片段文件完成。

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

我需要你什么

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

1 回答 1

3

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

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

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

于 2017-07-12T09:33:01.163 回答