首页 > 解决方案 > 使用 ffmpeg 创建实时更新的视频流

问题描述

我已经使用MediaSourceapi 从我的网络摄像头设置了一个数据流,并将其设置为每 4 秒以 webm 格式从我的网络摄像头发送数据。然后我在节点服务器上抓取它,createWriteStream用于设置管道并开始流式传输!

我坚持将媒体从 webm 转换为live m3u8。下面是我正在运行的 ffmpeg 命令(它经历了无数次迭代,因为我尝试了文档中的内容)。

const cmd = `ffmpeg
    -i ${filepath}
    -profile:v baseline
    -level 3.0
    -s 640x360 -start_number 0
    -hls_time 10
    -hls_list_size 0
    -hls_flags append_list
    -hls_playlist_type event
    -f hls ${directory}playlist.m3u8`

  const ls = exec(cmd.replace(/(\r\n|\n|\r)/gm," "), (err, stdout, stderr) => {
    if(err) {
      console.log(error);
    }

  })

我无法移除#EXT-X-ENDLIST播放列表末尾的

谢谢

更新

这可能是质量/速度问题。当我将质量降低到;

const cmd = `ffmpeg
    -i ${filepath}
    -vf scale=w=640:h=360:force_original_aspect_ratio=decrease
    -profile:v main
    -crf 51
    -g 48 -keyint_min 48
    -sc_threshold 0
    -hls_time 4
    -hls_playlist_type event
    -hls_segment_filename ${directory}720p_%03d.ts
    ${directory}playlist.m3u8

我能够获得像素化的实时视频。然而,它很快就崩溃了……也许这在 Node/Web 浏览器中是不可能的?

标签: node.jsffmpeg

解决方案


马特,

我正在做一个类似的项目。我正在将 NODE 转换为 FLV,然后使用api.video将 FLV 转换为 HLS。我的代码在Github上,它托管在livestream.streamclarity.com上(并且是 WIP)。

如果我在本地运行我的节点服务器,并从浏览器获取流 - FFMPEG 永远不会崩溃并永远运行。但是,当它被远程托管时,FFMPEG 会运行一段时间然后崩溃——所以我很确定问题出在 websocket(或者可能是我的网络)上。降低我上传到服务器的视频大小会有所帮助(有点)。

我发现您在 FFMPEG 中进行的任何视频重新缩放或音频处理都会增加处理延迟,并且往往会导致更多崩溃。我的解决方法是限制来自摄像机的视频,因此 FFMPEG 所要做的就是更改格式。

要考虑的其他 FFMPEG 选项:(替换 CRF 51)-preset ultrafast,-tune zerolatency


推荐阅读