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

时间:2017-03-30 09:31:36

标签: node.js video ffmpeg stream rtp

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

最终目标是将此流转换为虚拟网络摄像头。环顾四周后,我发现很多可能的解决方案 - 因此我想在MP4格式的本地IP上提供h.264数据。

两个问题:

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

当我处理静态文件(不是流)时,一切都运行良好。 e.g.`

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

`

但是当我尝试提供一个流时 - 它会抛出一个错误“ffmpeg退出代码1:无法为输出文件写标题..” `

var wrtieMp4 = fs.createWriteStream('./vid.mp4')
var proc = ffmpeg(readH264).clone().toFormat('mp4').output(wrtieMp4).run()`

如何添加标题..?

第二次,我对传输层(rtp,rtsp等)感到有点困惑。创建mp4流后 - 用MIME类型video / 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)

`

1 个答案:

答案 0 :(得分:2)

您不能将MP4用于此目的。关闭流后,MP4必须在文件开头写入标题。你得到"不能写标题"错误,因为ffmpeg知道它将无法回滚流并稍后写入标头。不,你不能使用rtsp eaither。浏览器只能做http。使用专为此目的设计的DASH格式。