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

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

问题描述

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

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" 因为源是来自网络摄像机的 rtp 数据包流中的 h264.为了测试起见,相机设置了 GOP 为 1(即所有帧都是关键帧)
  2. "-vcodec copy" 因为我不需要转码,只需要重新混音到 mp4.
  3. -movflags empty_moov+default_base_moof+frag_keyframe"根据媒体源扩展规范创建一个碎片化的mp4.
  4. "-" 以将 mp4 输出到标准输出.我正在获取输出并通过网络套接字将其发送到网络客户端.

一切正常,期待我正在尝试解决的延迟问题.如果我每次从标准输出输入数据时都进行日志记录,并带有到达时间戳,我会得到以下输出:

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 得到数据大小 = 24

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

16/06/2015 15:40:45.240 得到数据大小 = 7197

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

16/06/2015 15:40:45.241 得到数据大小 = 32768

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

16/06/2015 15:40:45.241 得到数据大小 = 4941

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

16/06/2015 15:40:45.241 得到数据大小 = 12606

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

16/06/2015 15:40:45.241 得到数据大小 = 6345

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

16/06/2015 15:40:45.241 得到数据大小 = 6339

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

16/06/2015 15:40:45.242 得到数据大小 = 6336

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

16/06/2015 15:40:45.242 得到数据大小 = 6361

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

16/06/2015 15:40:45.242 得到数据大小 = 6337

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

16/06/2015 15:40:45.242 得到数据大小 = 6331

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

16/06/2015 15:40:45.242 得到数据大小 = 6359

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

16/06/2015 15:40:45.243 得到数据大小 = 6346

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

16/06/2015 15:40:45.243 得到数据大小 = 6336

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

16/06/2015 15:40:45.243 得到数据大小 = 6338

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

16/06/2015 15:40:45.243 得到数据大小 = 6357

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

16/06/2015 15:40:45.243 得到数据大小 = 6357

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

16/06/2015 15:40:45.243 得到数据大小 = 6322

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

16/06/2015 15:40:45.243 得到数据大小 = 6359

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

16/06/2015 15:40:45.244 得到数据大小 = 6349

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

16/06/2015 15:40:45.244 得到数据大小 = 6353

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

16/06/2015 15:40:45.244 得到数据大小 = 6382

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

16/06/2015 15:40:45.244 得到数据大小 = 6403

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

16/06/2015 15:40:45.304 得到数据大小 = 6393

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

16/06/2015 15:40:45.371 得到数据大小 = 6372

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

16/06/2015 15:40:45.437 得到数据大小 = 6345

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

16/06/2015 15:40:45.504 得到数据大小 = 6352

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

16/06/2015 15:40:45.571 得到数据大小 = 6340

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

16/06/2015 15:40:45.637 得到数据大小 = 6331

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

16/06/2015 15:40:45.704 得到数据大小 = 6326

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

16/06/2015 15:40:45.771 得到数据大小 = 6360

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

16/06/2015 15:40:45.838 得到数据大小 = 6294

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

16/06/2015 15:40:45.904 得到数据大小 = 6328

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

16/06/2015 15:40:45.971 得到数据大小 = 6326

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

16/06/2015 15:40:46.038 得到数据大小 = 6326

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

16/06/2015 15:40:46.105 得到数据大小 = 6340

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

16/06/2015 15:40:46.171 得到数据大小 = 6341

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

16/06/2015 15:40:46.238 得到数据大小 = 6332

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

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

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.

这看起来像是一个刷新问题,因为我看不出有任何理由为什么 ffmpeg 需要将前 23 帧保存在内存中,尤其是因为每一帧都是它自己在 mp4 中的一个片段.但是,我找不到任何可以使 ffmpeg 更快地刷新此数据的方法.

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.

有人有什么建议吗?

我想指出,这是这个问题的后续问题:使用 mp4box 直播 dash 内容

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

推荐答案

消除延迟的关键是使用 -probesize 参数:

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

探测整数(输入)

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

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.

默认情况下,该值为 5,000,000 字节,相当于约 1.5 秒的视频.通过将值降低到 200,000,我几乎可以完全消除延迟.

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天全站免登陆