冲洗在FFMPEG中创建碎片MP4的延迟问题 [英] Flush & Latency Issue with Fragmented MP4 Creation in FFMPEG
问题描述
我正在使用以下命令创建一个用于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,因为我不需要转码,
- - movflags empty_moov + default_base_moof + frag_keyframe根据媒体源扩展规范创建分片mp4。
- - 在结尾为了输出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.038获取数据大小= 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 -
- "-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)
- "-vcodec copy" because I don't need transcoding, only remuxing to mp4.
- "-movflags empty_moov+default_base_moof+frag_keyframe" to create a fragmented mp4 according to the media source extensions spec.
- "-" 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屋!