node.js - 使用 ffmpeg 创建实时更新的视频流
问题描述
我已经使用MediaSource
api 从我的网络摄像头设置了一个数据流,并将其设置为每 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 转换为 FLV,然后使用api.video将 FLV 转换为 HLS。我的代码在Github上,它托管在livestream.streamclarity.com上(并且是 WIP)。
如果我在本地运行我的节点服务器,并从浏览器获取流 - FFMPEG 永远不会崩溃并永远运行。但是,当它被远程托管时,FFMPEG 会运行一段时间然后崩溃——所以我很确定问题出在 websocket(或者可能是我的网络)上。降低我上传到服务器的视频大小会有所帮助(有点)。
我发现您在 FFMPEG 中进行的任何视频重新缩放或音频处理都会增加处理延迟,并且往往会导致更多崩溃。我的解决方法是限制来自摄像机的视频,因此 FFMPEG 所要做的就是更改格式。
要考虑的其他 FFMPEG 选项:(替换 CRF 51)-preset ultrafast,-tune zerolatency
推荐阅读
- java - 如何在 Java/GWT Web 应用中实现 Log4j-audit
- ios - 对 AVCapturePhotoOutput 的影响 preparePhotoSettingsArray
- c++ - 如何通过柯南使用 gtest
- javascript - Node.js:条带错误未找到与有效负载的预期签名匹配的签名
- python - 从文件名列表中分配多个变量
- java - 从主类或启动侦听器中运行一个短暂的 Spring Boot 应用程序?
- android - Kivy 屏幕背景在屏幕切换期间不加载
- python - 刚开始在这里编码的神经科学家,试图在 pandas 中分析一个具有非标准格式的大型 CSV 表?
- node.js - npm 脚本的参数
- c# - 在记录器中检测异常