FFMPEG中创建碎片MP4的刷新和延迟问题

gal*_*arm 8 mp4 ffmpeg video-streaming media-source mpeg-dash

我正在使用以下命令为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 -
Run Code Online (Sandbox Code Playgroud)
  1. "-i rtsp://172.20.28.52:554/h264"因为源是来自ip camera的rtp数据包流中的h264.为了测试,摄像机的GOP设置为1(即所有帧都是关键帧)
  2. "-vcodec copy"因为我不需要转码,只能转换到mp4.
  3. "-movflags empty_moov + default_base_moof + frag_keyframe"根据媒体源扩展规范创建一个分段的mp4.
  4. " - "最后为了输出mp4到stdout.我抓住了输出并通过网络套接字将其发送到webclient.

一切都运行良好,期待我试图解决的延迟问题.如果我每次从stdout进入数据时都会记录,并且到达时间戳,我得到这个输出:

16/06/2015 15:40:45.239数据大小= 24

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

16/06/2015 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

16/06/2015 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

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

2015年6月16日15:40:45.242得到数据大小= 6359

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

16/06/2015 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

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

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

2015年6月16日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得到的数据大小= 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

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

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

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

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

2015年6月16日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

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

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

它看起来像一个冲洗问题,因为我没有看到任何理由为什么ffmpeg需要在内存中保存前23帧,特别是因为每个帧都是它在mp4内部的一个片段.但是,我无法找到任何会导致ffmpeg更快地刷新此数据的方法.

有没有人有建议?

我想请注意,这是对此问题的后续问题: 使用mp4box直播短划线内容

gal*_*arm 5

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

探测整数(输入)

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

默认情况下,该值为 5,000,000 字节,相当于大约 1.5 秒的视频。通过将该值减小到 200,000,我几乎完全消除了延迟。