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

Posted

技术标签:

【中文标题】将 h.264 流包装在 mp.4 容器中并使用 nodejs 流式传输【英文标题】:wrap h.264 stream in mp.4 container and stream it with nodejs 【发布时间】:2017-08-24 03:20:13 【问题描述】:

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

`

【问题讨论】:

【参考方案1】:

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

【讨论】:

谢谢!您建议使用什么容器 insted..? Dash 需要 mpd 文件 - 我如何从我的原始 h.264 数据生成一个? staxk overflow 不是传统的留言板。它的问题-> 答案。不是对话。如果您有新问题,请发布新帖子。 好的,我发布了以下问题 (***.com/questions/43180020/…)。非常感谢您的帮助

以上是关于将 h.264 流包装在 mp.4 容器中并使用 nodejs 流式传输的主要内容,如果未能解决你的问题,请参考以下文章

在android中解码原始H264流?

Android WebView 播放 HTML5/h.264/mp​​4 视频,如何进入 MediaPlayer

如何将 H.264 UDP 数据包转换为可播放的媒体流或文件(碎片整理)

如何将 RTP/H264 流写入文件

使用 FFmpeg 通过 RTMP 发送 H.264 编码流

音视频学习--H264解析渲染