使用FFmpeg在iOS上写入时将fMP4转换为HLS TL;博士

使用FFmpeg在iOS上写入时将fMP4转换为HLS TL;博士,ios,ffmpeg,avfoundation,http-live-streaming,fmp4,Ios,Ffmpeg,Avfoundation,Http Live Streaming,Fmp4,我想将fMP4片段转换为TS片段(用于HLS),因为这些片段是在iOS设备上使用FFmpeg编写的 为什么? 我试图在iOS上实现实时上传,同时在本地维护无缝的高清拷贝 我试过的 滚动AVAssetWriters,每个写入8秒,然后通过FFmpeg将MP4连接在一起 出了什么问题-音频和视频中有时会出现光点。我已经找出了三个原因 1) 为AAC编码器写入的音频启动帧,创建间隙 2) 由于视频帧的长度为33.33ms,音频帧的长度为0.022ms,因此它们可能不会在文件末尾对齐 3) Mac OS

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

为什么? 我试图在iOS上实现实时上传,同时在本地维护无缝的高清拷贝

我试过的
  • 滚动
    AVAssetWriter
    s,每个写入8秒,然后通过FFmpeg将MP4连接在一起

    出了什么问题-音频和视频中有时会出现光点。我已经找出了三个原因

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

    2) 由于视频帧的长度为33.33ms,音频帧的长度为0.022ms,因此它们可能不会在文件末尾对齐

    3) Mac OS上缺少帧精确编码,但iOS上不提供

  • FFmpeg将包含原始音频的大型纯视频MP4文件多路复用为TS段。这项工作是基于

    出了什么问题-每隔一段时间就会上传一个纯音频文件,而不会上传任何视频。从未能够在内部复制它,但当我们的用户没有记录他们认为他们做了什么时,这让他们非常不安。最后一段的精确搜索也存在问题,就像TS段的时间戳不正确一样

  • 我现在在想什么 苹果在今年(2016年)的WWDC上推出了fMP4,在此之前我根本没有对它进行过多的研究。由于fMP4文件可以在写入时读取和播放,因此我认为FFmpeg也可以在写入时对文件进行转码,只要我们在文件中的每个片段完成之前不将字节发送到FFmpeg

    但是,我对FFmpeg C API不太熟悉,我只是在第2次尝试中简单地使用了它

    我需要你做什么
  • 这是一个可行的解决方案吗?有谁对fMP4足够熟悉,知道我是否真的能做到这一点吗
  • 我怎么知道
    AVFoundation
    已经在文件中完成了一个片段的编写,这样我就可以将它导入FFmpeg了
  • 如何从磁盘上的文件中获取数据,一次分块,将其传递到FFmpeg中,并将其吐出TS段

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

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


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

    这个问题应该有助于如何提问。写得很好的问题。我放弃了这种方法,转而使用
    VideoToolbox
    (文档非常缺乏)来转换内存中的帧,而不是使用
    AVAssetWriter
    中间人。代码基于此示例