简述
我需要将使用FFmpeg在iOS设备上写入的fMP4片段转换为TS分段(用于HLS)。
为什么?
我想在iOS上实现实时上传,同时保持本地高清无缝拷贝。
我尝试了什么
使用滚动的AVAssetWriter,每个AVAssetWriter写入8秒,然后通过FFmpeg连接MP4。
发生了什么错误 - 音频和视频有时会出现故障。我已经确定3个原因。
1)AAC编码器为音频编写的预热帧创建间隙。
2)由于视频帧长为33.33毫秒,而音频帧长为0.022毫秒,因此它们有可能在文件末尾不对齐。
3)Mac OS上缺乏帧精确编码,但在iOS上不可用详细信息请查看此处
使用FFmpeg混合大型仅视频的MP4文件和原始音频到TS分段。该工作基于Kickflip SDK
发生了什么错误 - 时不时地会上传仅音频的文件,完全没有视频。我们无法在内部再现它,但当用户没有记录他们认为他们做到了的内容时,这对他们来说是相当沮丧的。最终分段中也存在精准寻找的问题,几乎像是TS分段时间戳设置不正确。
我现在的想法
苹果在2016年的WWDC上推出了fMP4,我之前并没有仔细研究过。由于fMP4文件可以在写入时读取和播放,因此我认为只要在文件中的每个片段完成后再将字节发送给FFmpeg,就可以让FFmpeg在写入时进行转码。
但是,我对FFmpeg C API不够熟悉,我只在第二次尝试中简单使用了它。
我需要你提供的帮助
- 这是可行的解决方案吗?是否有人熟悉fMP4并知道我是否能实现这个功能?
- 我如何知道
AVFoundation
已经完成了文件中的一个片段的写入,以便我可以将其传输到FFmpeg? - 我如何逐块从磁盘上的文件中提取数据,传递给FFmpeg,并让它输出TS分段?
AVAssetWriter
作为中间人,转而使用VideoToolbox
(文档非常差)在内存中转换帧。代码基于这个例子 https://github.com/twinenginelabs/kickflip-ios-sdk - bclymer