【发布时间】:2022-03-11 13:16:55
【问题描述】:
我正在尝试使用 NodeJS 创建一个直播网络应用程序。我目前拥有的代码使用套接字 IO 从客户端上的网络摄像头发出原始(webm 格式)二进制流,节点服务器接收此原始数据。使用 fluent-ffmpeg,我想将此二进制流编码为 mpegts 并将其实时发送到 RTMP 服务器,而不创建任何中间文件。但是,当尝试在 ffmpeg 中转换 blob 时,出现以下错误:
Error while decoding stream #0:1: Invalid data found when processing input
[NULL @ 000001b15e67bd80] Invalid sync code 61f192.
[libvpx @ 000001b15e6c5000] Failed to decode frame: Bitstream not supported by this decoder
我的相关前端客户端代码:
navigator.mediaDevices.getUserMedia(constraints).then(function(stream) {
video_show(stream);//only show locally, not remotely
socket.emit('config_rtmpDestination',url);
socket.emit('start','start');
var options = {mimeType: 'video/webm;codecs=h264'};
mediaRecorder = new MediaRecorder(stream, options);
mediaRecorder.start(2000);
mediaRecorder.onstop = function(e) {
stream.stop();
}
mediaRecorder.ondataavailable = function(e) {
//var arraybuffer = Uint8Array.from(e.data).buffer;
socket.emit("binarystream", blob);
//chunks.push(e.data);
}
}).catch(function(err) {
console.log('The following error occured: ' + err);
show_output('Local getUserMedia ERROR:'+err);
});
相关NodeJS服务器代码:
socket.on('binarystream',function(m){
feedStream(m);
});
socket.on('start',function(m){
...
var ops=[
'-vcodec', socket._vcodec,'-i','-',
'-c:v', 'libx264', '-preset', 'veryfast', '-tune', 'zerolatency',
'-an', '-bufsize', '1000',
'-f', 'mpegts', socket._rtmpDestination
];
ffmpeg_process=spawn('ffmpeg', ops);
feedStream=function(data){
ffmpeg_process.stdin.write(data);
}
...
}
【问题讨论】:
-
原始二进制流的格式是什么?
-
@szatmary 格式为 webm。我在 mediaRecorder 中使用这些选项: var options = {mimeType: 'video/webm;codecs=h264'};
-
查看“[libvpx @ 000001b15e6c5000] 无法解码帧”libvpx 不应被调用。我猜 ffmpeg 假设您的接收流是 VP8 或 VP9。
标签: node.js ffmpeg video-streaming webrtc mediarecorder