同花顺及;FFMPEG中碎片化MP4创建的延迟问题

同花顺及;FFMPEG中碎片化MP4创建的延迟问题,ffmpeg,video-streaming,mp4,mpeg-dash,media-source,Ffmpeg,Video Streaming,Mp4,Mpeg Dash,Media Source,我正在使用以下命令为html5流媒体创建一个片段化mp4: -i rtsp://172.20.28.52:554/h264 -vcodec copy -an -f mp4 -reset_timestamps 1 -movflags empty_moov+default_base_moof+frag_keyframe -loglevel quiet - “-我rtsp://172.20.28.52:554/h264“因为源是来自ip摄像机的rtp数据包流中的h264。 为便于测试,摄像机的GOP

我正在使用以下命令为html5流媒体创建一个片段化mp4:

-i rtsp://172.20.28.52:554/h264 -vcodec copy -an -f mp4 -reset_timestamps 1 -movflags empty_moov+default_base_moof+frag_keyframe -loglevel quiet -
  • “-我rtsp://172.20.28.52:554/h264“因为源是来自ip摄像机的rtp数据包流中的h264。 为便于测试,摄像机的GOP设置为1(即所有帧均为关键帧)
  • “-vcodec copy”因为我不需要转码,只需要重新升级到mp4
  • “-movflags empty_moov+default_base_moof+frag_keyframe”,根据媒体源扩展规范创建碎片化mp4
  • “-”以将mp4输出到标准输出。我正在抓取输出并通过web套接字将其发送到webclient
  • 一切都很好,除了我试图解决的延迟问题。 如果每次从stdout输入数据时都记录到达时间戳,则会得到以下输出:

    2015年6月16日15:40:45.239获取的数据大小=24

    2015年6月16日15:40:45.240获取的数据大小=7197

    2015年6月16日15:40:45.241获取的数据大小=32768

    2015年6月16日15:40:45.241获取的数据大小=4941

    2015年6月16日15:40:45.241获取的数据大小=12606

    2015年6月16日15:40:45.241获取的数据大小=6345

    2015年6月16日15:40:45.241获取的数据大小=6339

    2015年6月16日15:40:45.242获取的数据大小=6336

    2015年6月16日15:40:45.242获取的数据大小=6361

    2015年6月16日15:40:45.242获取的数据大小=6337

    2015年6月16日15:40:45.242获取的数据大小=6331

    2015年6月16日15:40:45.242获取的数据大小=6359

    2015年6月16日15:40:45.243获取的数据大小=6346

    2015年6月16日15:40:45.243获取的数据大小=6336

    2015年6月16日15:40:45.243获取的数据大小=6338

    2015年6月16日15:40:45.243获取的数据大小=6357

    2015年6月16日15:40:45.243获取的数据大小=6357

    2015年6月16日15:40:45.243获取的数据大小=6322

    2015年6月16日15:40:45.243获取的数据大小=6359

    2015年6月16日15:40:45.244获取的数据大小=6349

    2015年6月16日15:40:45.244获取的数据大小=6353

    2015年6月16日15:40:45.244获取的数据大小=6382

    2015年6月16日15:40:45.244获取的数据大小=6403

    2015年6月16日15:40:45.304获取的数据大小=6393

    2015年6月16日15:40:45.371获取的数据大小=6372

    2015年6月16日15:40:45.437获取的数据大小=6345

    2015年6月16日15:40:45.504获取的数据大小=6352

    2015年6月16日15:40:45.571获取的数据大小=6340

    2015年6月16日15:40:45.637获取的数据大小=6331

    2015年6月16日15:40:45.704获取的数据大小=6326

    2015年6月16日15:40:45.771获取的数据大小=6360

    2015年6月16日15:40:45.838获取的数据大小=6294

    2015年6月16日15:40:45.904获取的数据大小=6328

    2015年6月16日15:40:45.971获取的数据大小=6326

    2015年6月16日15:40:46.038获取的数据大小=6326

    2015年6月16日15:40:46.105获取的数据大小=6340

    2015年6月16日15:40:46.171获取的数据大小=6341

    2015年6月16日15:40:46.238获取的数据大小=6332

    如您所见,前23行(包含约1.5秒视频数据)几乎立即到达,然后每2行之间的延迟约为70毫秒,这是有意义的,因为视频为每秒15帧。 此行为会导致大约1.5秒的延迟

    这看起来像是一个刷新问题,因为我看不出ffmpeg需要在内存中保存前23帧的任何原因,特别是因为每个帧都是mp4中自己的片段。 然而,我找不到任何能使ffmpeg更快地刷新这些数据的方法

    有人有什么建议吗

    我想指出的是,这是这个问题的后续问题:

    我通过使用-g选项设置组中的帧数来解决延迟问题。在我的例子中,我使用了
    -g2
    。我怀疑,如果您不将其显式化,片段要么等待源提供关键帧,要么在关闭片段并将其转储到stdout之前使用非常大的默认值生成关键帧。

    通常,在控制台输出的情况下,stdout的缓冲被禁用。如果从代码运行ffmpeg,则会启用缓冲,因此只有在缓冲区已满或命令结束时才能获取数据


    您必须消除操作系统的标准缓冲。在windows上是不可能的,但在ubuntu for ex上是不可能的。消除延迟的关键是使用-probesize参数:

    probesize整数(输入)

    以字节为单位设置探测大小,即 要分析以获取流信息的数据。更高的值将 启用检测更多信息,以防信息分散到 流,但会增加延迟。必须是不小于的整数 32默认为5000000

    默认情况下,该值为5000000字节,相当于约1.5秒的视频。
    通过将值减少到200000,我几乎可以完全消除延迟。

    我突然想到,您可以控制用于缓冲输出的
    块大小。检查并查看调整该值是否有帮助。@PabloMontilla我尝试使用blocksize的一些不同值,虽然它以某种方式影响了输出,但没有解决初始延迟问题。您好@galbarm!我无法使用您的
    ffmpeg
    参数在页面上运行视频,总是跳过无法识别的顶级框:ftyp
    。(h264 ip凸轮)。我还尝试将
    -vcodec
    更改为
    libx264
    ,在这种情况下,我会跳过无法识别的顶级框:mdat。你能更详细地描述一下你的代码吗?最有趣的部分是
    .addSourceBuffer
    参数,即编解码器字符串。提前谢谢!嗨,@zarkone我也看到了“跳过ftyp”错误,但它似乎没有任何功能上的影响。这里是客户机代码的要点,我相信它会对您有所帮助:谢谢您的支持