node.js - 将 h.264 流包装在 mp.4 容器中并使用 nodejs 流式传输

标签 node.js video ffmpeg stream rtp

我有来自远程网络摄像头的 h.264 数据流。如果我将它保存到一个文件中,我可以在 VLC 中播放它(这意味着数据完好无损)。

最终目标是将这个流变成一个虚拟网络摄像头。环顾四周后,我发现 manyCam 作为一种可能的解决方案 - 因此我想以 MP4 格式在本地 IP 上提供 h.264 数据。

两个问题:

第一个 ,我正在尝试使用 ffmpeg 将 h.264 与 mp4 容器包装在一起(使用 fluent-ffmpeg npm 库,将 ffmpeg API 暴露给 Nodejs)。

当我处理静态文件(不是流)时,一切正常。例如`

var ffmpeg = rquire('fluent-ffmpeg')
var readH264 = fs.createReadStream('./vid.h264')
var proc = ffmpeg(readH264).clone().toFormat('mp4').output('./vid.mp4').run()

`

但是当我试图提供一个流时 - 它会抛出一个错误“ffmpeg exited with code 1: could not write header for output file..”
`
var wrtieMp4 = fs.createWriteStream('./vid.mp4')
var proc = ffmpeg(readH264).clone().toFormat('mp4').output(wrtieMp4).run()`

我怎样才能将它添加到标题..?

第二 ,我对传输层(rtp,rtsp等)有点困惑。创建 mp4 流之后 - 使用 MIME 类型的视频/mp4 提供流还不够吗?它似乎适用于静态文件。
`
let read = fs.createReadStream('./vid.mp4')
let server = http.createServer(function (req, res) {
        res.writeHead(200, {'Content-type': "video/mp4"})
        read.pipe(res)
}).listen(9000)

`

最佳答案

您不能为此目的使用 MP4。 MP4 必须在流关闭后将 header 写入文件的开头。您会收到“无法写入 header ”错误,因为 ffmpeg 知道它将无法倒带流并稍后写入 header 。不,您也不能使用 rtsp。浏览器只能做http。使用为此目的设计的格式,如 DASH。

关于node.js - 将 h.264 流包装在 mp.4 容器中并使用 nodejs 流式传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43113805/

相关文章:

node.js - 考虑背压,将数据从 Cassandra 流式传输到文件

javascript - Require 在 NodeJS 应用程序中无法识别

javascript - 循环遍历数组,将数据传递给函数

javascript - 暂停视频时停止setInterval(Youtube播放器)

python - 将 matplotlib 动画加速到视频文件

javascript - Request.js 模拟文件上传(multipart/form-data)

delphi - 使用 FFMPEG 减慢视频的音频速度

iphone - Safari Web Apps 中 iPhone 和 iPod 上的 HTML5 视频播放器行为

linux - FFmpeg忽略输出像素格式

python - 使用 FFMPEG 命令读取帧并使用 opencv 中的 inshow 函数显示