使用mp4box直播短划线内容

gal*_*arm 12 ffmpeg video-streaming html5-video media-source mpeg-dash

我正在尝试使用媒体源扩展API将H.264内容直播到HTML5.

以下方法效果很好:

ffmpeg -i rtsp://10.50.1.29/media/video1 -vcodec copy -f mp4 -reset_timestamps 1 -movflags frag_keyframe+empty_moov -loglevel quiet out.mp4

然后: mp4box -dash 1000 -frag 1000 -frag-rap out.mp4

我可以使用MP4Box输出(out_dashinit.mp4)并通过Web Sockets(块大块)将其发送到将客户端提供给媒体源API的JavaScript客户端.

但是,这对于实时内容来说不是一个好方法.

我现在要做的是创建一个单独的管道,以便以最小的可能延迟实时完成.使用FFmpeg,可以将输出重定向到stdout而不是out.mp4抓取内容.我无法弄清楚是否可以将MP4Box组合到管道中.

  1. MP4Box可以从非文件源获取输入数据吗?
  2. MP4Box可以在实时到达时逐步(从文件或其他来源)获取这样的内容吗?即如果流停止1秒钟等待并自动恢复.
  3. 同样的问题,但输出:它可以输出到不是文件(如stdout)的东西,并可以逐步这样做,以便每当输出数据准备好,我将能够采取它并将其传输到Web客户端,基本上生成一个永无止境的虚线MP4.

Pab*_*lla 11

您不需要MP4Box来生成所需的输出,但是您需要自己在内容中查找生成的文件中的框.

基本上你会生成一个fMP4with H264,并向浏览器发送moov初始化框和moof+mdat你生成的每个MP4片段的框.你必须用JavaScript编写播放器代码,你可能无法使用标准的DASH播放器.

要生成正确的碎片MP4,您需要将其传递给ffmpeg : -movflags empty_moov+omit_tfhd_offset+frag_keyframe+default_base_moof.

请务必使用最新版本.

  • @Silvia正如Pablo建议的那样,我不再使用MP4box,因为我用ffmpeg设置了所有内容.我仍然在努力解决延迟问题,但除此之外,它运行良好.ffmpeg命令是:"ffmpeg -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 - "我抓住了ffmpeg输出通过stdout并使用Web套接字将其流式传输到Web (3认同)
  • @gelbarm当你通过websocket发送帧时,你需要以任何方式分割帧(例如,每帧只有一个MP4片段)吗?或者任何数量的字节都可以工作,因为视频/ MediaSource正确地重建了片段?我试图做同样的事情,但它只有10%的时间. (3认同)
  • @PhilippeCayouette你需要在片段级别进行.基本上你可以在框边界解析编码字节流并发送一个`moof` +`mdat`框.一旦你正确地初始化它(使用"moov"框),媒体源对象就可以解析它. (3认同)
  • @PabloMontilla你能分享一种方法来分割moov/moof + dat片段中的流,将它们正确地发送给客户端吗? (2认同)