我有来自远程网络摄像头的 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/