- ffmpeg/
- 同花顺及;FFMPEG中碎片化MP4创建的延迟问题
同花顺及;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”错误,但它似乎没有任何功能上的影响。这里是客户机代码的要点,我相信它会对您有所帮助:谢谢您的支持