我正在使用以下命令为 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 -
- “-i rtsp://172.20.28.52:554/h264”,因为源是来自 ip 摄像机的 rtp 数据包流中的 h264。为了测试起见,相机设置GOP为1(即所有帧都是关键帧)
- “-vcodec 复制”因为我不需要转码,只需要重新混合到 mp4。
- "-movflags empty_moov+default_base_moof+frag_keyframe" 根据媒体源扩展规范创建分段 mp4。
- 最后的“-”以便将 mp4 输出到标准输出。我正在获取输出并通过网络套接字将其发送到网络客户端。
一切运行良好,期待我试图解决的延迟问题。如果我每次从标准输出输入数据时都在记录,并带有到达的时间戳,我会得到以下输出:
16/06/2015 15:40:45.239 得到数据大小 = 24
16/06/2015 15:40:45.240 得到数据大小 = 7197
16/06/2015 15:40:45.241 得到数据大小 = 32768
16/06/2015 15:40:45.241 得到数据大小 = 4941
16/06/2015 15:40:45.241 得到数据大小 = 12606
16/06/2015 15:40:45.241 得到数据大小 = 6345
16/06/2015 15:40:45.241 得到数据大小 = 6339
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 得到数据大小 = 6331
16/06/2015 15:40:45.242 得到数据大小 = 6359
16/06/2015 15:40:45.243 得到数据大小 = 6346
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 得到数据大小 = 6403
16/06/2015 15:40:45.304 得到数据大小 = 6393
16/06/2015 15:40:45.371 得到数据大小 = 6372
16/06/2015 15:40:45.437 得到数据大小 = 6345
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 行连续行之间的延迟约为 70 毫秒,这是有道理的,因为视频是每秒 15 帧。此行为引入了大约 1.5 秒的延迟。
这看起来像是一个刷新问题,因为我看不出 ffmpeg 需要在内存中保存前 23 帧的任何理由,特别是因为每一帧都是它自己在 mp4 中的片段。但是,我找不到任何可以使 ffmpeg 更快地刷新这些数据的方法。
有人有建议吗?
我想指出,这是对此问题的后续问题: Live streaming dash content using mp4box