无法使用FFMPEG重新流式传输到MP4 HTML5视频

3

我一直在尝试让FFMPEG进行实时流传输,但已经困扰了我数小时,现在向这里求助。

我的情况是我有一台IP安全摄像头,可以通过RTSP(h.264)成功连接,并将视频保存为文件片段。无论是通过像VLC这样的独立应用程序还是通过一个node.js web服务器应用程序回放,它们都可以播放正常,该node.js应用程序发送“video/mp4”和保持连接头,并向HTML5视频客户端流式传输以前由FFMPEG保存的mp4文件。

但是,我想将相同的RTSP流重新流式传输到HTML5客户端。我知道HTML5客户端的位和FFMPEG混流到MP4的工作,因为MP4录制/流式传输有效。

我尝试了以下操作:

1)将输出设置为HTTP字符串。我认为FFMPEG不支持此功能,因为我收到“输入/输出错误”的提示,并且FFMPEG文档谈到了另一个名为FFSERVER的应用程序,但该应用程序不支持Windows。

ffmpeg -i rtsp://admin:12345@192.168.1.234:554 -vcodec copy -f mp4 -movflags frag_keyframe+empty_moov http://127.0.0.1:8888

2) 由于ffmpeg在node.js中作为子进程运行,因此我尝试使用与录制播放流相同的标头将STDOUT传输到node http服务器。 我可以在VLC中查看此流,这是一个好迹象,但我无法让HTML客户端识别流并显示为空白或偶尔静态图像。

var liveServer = http.createServer(liveStream); 
var liveStream = function (req, resp) {                                            // handle each client request by instantiating a new FFMPEG instance
    resp.writeHead(200, {"Content-Type": "video/mp4", "Connection": "keep-alive"});
        var xffmpeg = child_process.spawn("ffmpeg", [
            "-i", "rtsp://admin:12345@192.168.1.234:554" , "-vcodec", "copy", "-f", "mp4", "-movflags", "frag_keyframe+empty_moov", "-"   // output to stdout
            ],  {detached: false});

            xffmpeg.stdout.pipe(resp);

            xffmpeg.on("exit", function (code) {
                 console.log("Xffmpeg terminated with code " + code);
            });

            xffmpeg.on("error", function (e) {
                  console.log("Xsystem error: " + e);
            });

            xffmpeg.stdout.on("data",function(data) {
                  console.log('Xdata rcv ' + data);
            });

            xffmpeg.stderr.on("data", function (data) {
                  console.log("XFFMPEG -> " + data);
    }
}

我已经尝试了IE11和Chrome的HTML5客户端。我怀疑发送流的格式可能不太正确,这会阻止HTML5视频客户端,但不足以停止VLC。令人困扰的是,上面的代码可以正常播放已记录的MP4流。有什么想法可以让FFMPEG通过直播重流正常工作吗?谢谢。
1个回答

0

只是好奇,你解决了吗?我正在做基本相同的事情,除了它是屏幕录制...我已经切换到使用播放完美的webm格式...然而视频会比实际操作慢几秒钟...这对我来说很糟糕,但可能适合你


你好,感谢回复。不幸的是我仍在寻找解决方案,webM 不可行,因为它需要转码(由于 IP 摄像头发送的是 H.264,可以轻松地将其重新混流为 MP4 流,并且 CPU 使用率很低)。我已经确定 HTML5 浏览器需要对流进行分块处理,否则它会等待视频完全加载(即使有一个空的 moov 原子),所以我正在探索如何编写一个 Node HTTP 服务器来分块响应。 - deandob
我已经使其工作了,请参考这里的相关问题:https://dev59.com/6WEh5IYBdhLWcg3w3muK - deandob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接