我想将fMP4片段转换为TS片段(用于HLS),因为片段是在iOS设备上使用FFmpeg编写的。
我尝试在iOS上实现实时上传,同时在本地维护无缝的高清副本。
滚动AVAssetWriter
每次写入8秒,然后通过FFmpeg将MP4连接在一起。
出了什么问题 - 音频和视频中有时会出现问题。我已经确定了3个原因。
1)为AAC编码器写入的音频启动帧,创建间隙。
2)由于视频帧长33.33ms,音频帧长0.022ms,因此它们不能在文件末尾排列。
3)Mac OS上缺少帧精确编码,但不适用于iOS Details Here
FFmpeg将具有原始音频的大视频MP4文件复制到TS段。这项工作基于Kickflip SDK
错误的内容 - 每隔一段时间就会上传一个仅限音频的文件,而不会播放任何视频。永远无法在内部重现它,但当我们的用户没有记录他们认为他们所做的事情时,这对我们的用户来说非常令人沮丧。在最终细分市场上也存在准确搜索的问题,几乎就像TS细分时间标记不正确一样。
Apple今年(2016年)正在WWDC推动fMP4,在此之前我还没有对它进行过多次调查。由于fMP4文件可以被读取,并且在正在写入时播放,我认为FFmpeg可以对文件进行转码,因为它也被写入,只要我们阻止将字节发送到FFmpeg,直到文件中的每个片段都完成。
但是,我对FFmpeg C API不够熟悉,我只在尝试#2中简单地使用过它。
AVFoundation
已经完成了在文件中写一个片段,以便我可以将它传输到FFmpeg?答案 0 :(得分:2)
严格来说,如果fmp4包含h264 + aac,则不需要对fmp4进行转码,只需将样本数据重新打包为TS即可。 (使用ffmpeg -codec copy
或gpac)
WRT。对齐(1.2)我想这一切都取决于您的编码器设置(帧速率,采样率和GOP大小)。当然可以确保音频和视频完全对齐片段边界(例如参见:this table)。如果您的目标是iOS,我建议使用HLS protocol版本3(或4),以便更准确地表示时间。这也允许您单独流式传输音频和视频(非多路复用)。
我相信ffmpeg应该能够推送一个实时的fmp4流(即使用长时间运行的HTTP POST),但是playout需要origin software来做一些有意义的事情(即流到HLS)。