【发布时间】:2014-03-15 06:52:08
【问题描述】:
数小时以来,我一直在努力让 FFMPEG 进行实时流式传输,因此举起白旗并在这里寻求帮助。
我的场景是我有一个 IP 安全摄像头,我可以通过 RTSP (h.264) 成功连接并将视频保存为文件段,它们可以通过 VLC 等独立应用程序或通过 node.js 正常播放发送“video/mp4”和 keep-alive 标头并将 FFMPEG 先前保存的 mp4 文件流式传输到 HTML5 视频客户端的 Web 服务器应用程序。
但是,我想获取相同的 RTSP 流并将其重新流式传输到 HTML5 客户端。我知道 HTML5 客户端位和 FFMPEG remuxing to 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 中作为 spawn 运行,我尝试使用与录制播放流相同的标头将 STDOUT 管道传输到节点 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 进行实时重新流式传输?谢谢。
【问题讨论】: