冲洗在FFMPEG中创建碎片MP4的延迟问题 [英] Flush & Latency Issue with Fragmented MP4 Creation in FFMPEG

查看:653
本文介绍了冲洗在FFMPEG中创建碎片MP4的延迟问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用以下命令创建一个用于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  -  




  1. -​​ 我rtsp://172.20.28.52:554 / h264,因为来源是从ip摄像机的rtp数据包流中的h264。
    为了测试,相机设置为GOP 1(即所有帧都是关键帧)

  2. -​​ vcodec copy,因为我不需要转码,

  3. -​​ movflags empty_moov + default_base_moof + frag_keyframe根据媒体源扩展规范创建分片mp4。

  4. - 在结尾为了输出mp4到stdout。我正在抓住输出,并通过网络套接字发送到网络终端。

一切都运行良好,期待延迟问题我正在努力解决X-45454545 X- 20045 X- 20045 X- 20045 X- 20045 X- 20045 X- 20045 X- 200 X- 20045 X- 20045 X- 20045 X- p> 16/06/2015 15:40:45.239 get data size = 24



16/06/2015 15:40:45.240 got data size = 7197



16/06/2015 15:40:45.241获取数据大小= 32768



16/06/2015 15:40新评新新新新新新新旗新新新新旗新新旗新新旗旗新新旗新旗旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新旗新新旗新旗2001-45新新新新新新旗新新新新旗新新新新旗新新旗旗哨派旗新新新新旗新新旗新新旗200新新200 200 200新新新新旗新新旗200新新200新200人新200新新200人新200新新200人新200新新200人面200 Chanoloom旗新新新新旗新新新200新新新新200新200新新200新新新200新新旗200 200新新新200新新新200新新新200新新旗新200新新200新新新新200新新200新新新新200新新新新旗新新200新新旗2001-新新新新新200新新旗新新新200新新旗新200新新旗新新新200新新旗新新新200新新新新旗新新200新新旗新新200新新旗2001-新新新新新新新新新新新款200新新款旗新>

16/06/2015 15:40:45.242获取数据大小= 6336



16/06/2015 15:40 :45.242获取数据大小= 6361



16/06/2015 15:40:45.242获取数据大小= 6337



16/06/2015 15:40:45.242 got data size = 6331



16/06/2015 15:40:45.242 got data size = 6359



16/06/2015 15:40:45.243获取数据大小= 63 46



16/06/2015 15:40:45.243获取数据大小= 6336



16/06 / 2015 15:40:45.243获取数据大小= 6338



16/06/2015 15:40:45.243获取数据大小= 6357



16/06/2015 15:40:45.243获取数据大小= 6357



16/06/2015 15:40:45.243获取数据大小= 6322



16/06/2015 15:40:45.243获取数据大小= 6359



16/06 / 2015 15:40:45.244获取数据大小= 6349



16/06/2015 15:40:45.244获取数据大小= 6353



16/06/2015 15:40:45.244获取数据大小= 6382



16/06/2015 15:40:45.244 got data size = 6403



16/06/2015 15:40:45.304获取数据大小= 6393



16/06 / p454545454545新新新新新新新新新新旗新新新新旗新新新新旗新新旗新新旗新新新新旗新新旗新新旗旗新新新新新旗新新旗旗新新新新新旗新新200新新新新旗新新旗2001-新新新新旗新新旗新新旗2001-新新新新新新新新新新旗新新200新新旗新新旗2001-新新新新新新新新旗新新200新新200新新旗2001-新新新新新新新新200新名。 b $ b

16/06/2015 15:40:45.504获取数据大小= 6352



16/06/2015 15:40:45.571获取数据大小= 6340



16/06/2015 15:40:45.637获取数据大小= 6331



16/06 / 2015 15:40:45.704获取数据大小= 6326



16/06/2015 15:40:45.771获取数据大小= 6360



16/06/2015 15:40:45.838获取数据大小= 6294



16/06/2015 15:40:45.904获取数据大小= 6328



16/06/2015 15:40:45.971获取数据大小= 6326



16/06 / 2015 15:40:46.0​​38获取数据大小= 6326



16/06/2015 15:40:46.105获取数据大小= 6340



16/06/2015 15:40:46.171获取数据大小= 6341



16/06/2015 15:40:46.238获取数据大小= 6332


正如你所看到的,前23行(包含大约1.5秒的视频数据)几乎立即到达,然后每2条连续线之间的延迟为〜70ms,这是有意义的,因为视频是每秒15帧。
这个行为引入了大约1.5秒的延迟。



它看起来像一个潮红的问题,因为我没有看到任何理由ffmpeg需要持有前23帧在内存中,特别是因为每个帧是mp4内部自己的一个片段。 200新X- 200 200 -40 200 200 -40 200 200 -40 200 200 200 -40 200 200 200 -40 200 200 200 -40 200 200 200 -40 200 200 200 -40 200 200:
$ b

我想注意到,这是一个后续问题:
使用mp4box的直播短片内容

解决方案

删除新新p新新新新旗新新新新旗新新旗新新旗200新新200 200 200 200新新新旗200 200 200 200 200 200 200新新新旗200 200 200 X- 200新新200新新旗新新旗新200新新旗新200新新旗新新旗新200新新新旗新新旗新新旗新新款旗新新旗新新旗新新款旗新新旗新新款旗新新旗新新款旗新新旗新新款旗新新旗新新款旗新新旗新新款: >设置以字节为单位的探测大小,即
要分析的数据以获取流信息的大小。更高的价值将
启用检测更多信息,以防万一它分散到
流,但会增加延迟。必须是不小于
的整数32.默认情况下为5000000。


默认值为5,000,000字节相当于〜1.5秒的视频。
我能够几乎完全消除延迟,将值减少到20万。


I'm creating a fragmented mp4 for html5 streaming, using the following command:

-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 -

  1. "-i rtsp://172.20.28.52:554/h264" because the source is h264 in rtp packets stream from an ip camera. For the sake of testing, the camera is set with GOP of 1 (i.e. all frames are key frames)
  2. "-vcodec copy" because I don't need transcoding, only remuxing to mp4.
  3. "-movflags empty_moov+default_base_moof+frag_keyframe" to create a fragmented mp4 according to the media source extensions spec.
  4. "-" at the end in order to output the mp4 to stdout. I'm grabbing the ouput and sending it to the webclient through web sockets.

Everything is working well, expect for a latency issue which I'm trying to solve. If I'm logging every time a data is coming in from stdout, with the timestamp of arrival, I get this output:

16/06/2015 15:40:45.239 got data size = 24

16/06/2015 15:40:45.240 got data size = 7197

16/06/2015 15:40:45.241 got data size = 32768

16/06/2015 15:40:45.241 got data size = 4941

16/06/2015 15:40:45.241 got data size = 12606

16/06/2015 15:40:45.241 got data size = 6345

16/06/2015 15:40:45.241 got data size = 6339

16/06/2015 15:40:45.242 got data size = 6336

16/06/2015 15:40:45.242 got data size = 6361

16/06/2015 15:40:45.242 got data size = 6337

16/06/2015 15:40:45.242 got data size = 6331

16/06/2015 15:40:45.242 got data size = 6359

16/06/2015 15:40:45.243 got data size = 6346

16/06/2015 15:40:45.243 got data size = 6336

16/06/2015 15:40:45.243 got data size = 6338

16/06/2015 15:40:45.243 got data size = 6357

16/06/2015 15:40:45.243 got data size = 6357

16/06/2015 15:40:45.243 got data size = 6322

16/06/2015 15:40:45.243 got data size = 6359

16/06/2015 15:40:45.244 got data size = 6349

16/06/2015 15:40:45.244 got data size = 6353

16/06/2015 15:40:45.244 got data size = 6382

16/06/2015 15:40:45.244 got data size = 6403

16/06/2015 15:40:45.304 got data size = 6393

16/06/2015 15:40:45.371 got data size = 6372

16/06/2015 15:40:45.437 got data size = 6345

16/06/2015 15:40:45.504 got data size = 6352

16/06/2015 15:40:45.571 got data size = 6340

16/06/2015 15:40:45.637 got data size = 6331

16/06/2015 15:40:45.704 got data size = 6326

16/06/2015 15:40:45.771 got data size = 6360

16/06/2015 15:40:45.838 got data size = 6294

16/06/2015 15:40:45.904 got data size = 6328

16/06/2015 15:40:45.971 got data size = 6326

16/06/2015 15:40:46.038 got data size = 6326

16/06/2015 15:40:46.105 got data size = 6340

16/06/2015 15:40:46.171 got data size = 6341

16/06/2015 15:40:46.238 got data size = 6332

As you can see, the first 23 lines (which contain data of about 1.5 secs of video) are arriving almost instantly, and then the delay between each 2 consecutive lines is ~70ms which makes sense because the video is 15 frames per sec. This behavior introduces a latency of about 1.5 sec.

It looks like a flushing issue because I don't see any reason why would ffmpeg need to hold the first 23 frames in memory, especially since each frame is a fragment of it's own inside the mp4. I couldn't however, find any method that would cause ffmpeg to flush this data faster.

Has anyone got a suggestion?

I'd like to note that this is a follow up question to this one: Live streaming dash content using mp4box

解决方案

The key to removing the delay is to use the -probesize argument:

probesize integer (input)

Set probing size in bytes, i.e. the size of the data to analyze to get stream information. A higher value will enable detecting more information in case it is dispersed into the stream, but will increase latency. Must be an integer not lesser than 32. It is 5000000 by default.

By default the value is 5,000,000 bytes which was equivalent to ~1.5 sec of video. I was able to almost completely eliminate the delay by reducing the value to 200,000.

这篇关于冲洗在FFMPEG中创建碎片MP4的延迟问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆