从ffmpeg到Facebook Live的流媒体传输被终止
我正在尝试在浏览器上捕获画布(canvas.captureStream),添加音频(使用getUserMedia捕获并使用canvasStream.addTracks添加到流),然后将其发送到服务器。服务器使用ffmpeg将流(使用H264编码后)发送到facebook live。但是,流不稳定,在几分钟内断开连接。 如果直接(不带canvas.captureStream)发送视频和音频曲目(使用getMediaUser),则效果良好。我怀疑这与音轨不正确有关,因此facebook拒绝了它(ffmpeg没有特别的错误,只是存在IO错误)。需要帮助找出正确的方式发送画布流和音频 当前ffmpeg命令如下所示从ffmpeg到Facebook Live的流媒体传输被终止,facebook,audio,ffmpeg,streaming,live-streaming,Facebook,Audio,Ffmpeg,Streaming,Live Streaming,我正在尝试在浏览器上捕获画布(canvas.captureStream),添加音频(使用getUserMedia捕获并使用canvasStream.addTracks添加到流),然后将其发送到服务器。服务器使用ffmpeg将流(使用H264编码后)发送到facebook live。但是,流不稳定,在几分钟内断开连接。 如果直接(不带canvas.captureStream)发送视频和音频曲目(使用getMediaUser),则效果良好。我怀疑这与音轨不正确有关,因此facebook拒绝了它(ff
ffmpeg -i - -c:v libx264 -crf 23 -preset ultrafast \
-tune zerolatency -max_muxing_queue_size 1000 \
-vsync cfr -async 1 -bufsize 2M -r 30 -g 60 -keyint_min 30 \
-x264opts keyint=30 -pix_fmt yuv420p -level 3 \
-c:a aac -b:a 96k -ar 96000 \
-f tee -map 0:v -map 0:a [f=flv] <rtmp url 1> | [f=flv] <rtmp url 2>
FFMPEG:[flv @ 0x5626ecf0f7c0] Failed to update header with correct duration.
[flv @ 0x5626ecf0f7c0] Failed to update header with correct filesize.
FFMPEG:[tee @ 0x5626ec8550c0] Slave muxer #1 failed, aborting.
av_interleaved_write_frame(): Broken pipe
FFMPEG:[flv @ 0x5626ecbe8840] Failed to update header with correct duration.
FFMPEG:[flv @ 0x5626ecbe8840] Failed to update header with correct filesize.
FFMPEG:frame= 2378 fps= 22 q=22.0 Lsize=N/A time=00:01:21.17 bitrate=N/A dup=2202 drop=5 speed=0.745x
video:18916kB audio:959kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
FFMPEG:[libx264 @ 0x5626ec855b80] frame I:80 Avg QP:13.97 size:115968
[libx264 @ 0x5626ec855b80] frame P:2298 Avg QP:16.77 size: 4392
[libx264 @ 0x5626ec855b80] mb I I16..4: 100.0% 0.0% 0.0%
FFMPEG:[libx264 @ 0x5626ec855b80] mb P I16..4: 3.8% 0.0% 0.0% P16..4: 9.5% 0.0% 0.0% 0.0% 0.0% skip:86.7%
[libx264 @ 0x5626ec855b80] coded y,uvDC,uvAC intra: 26.3% 42.2% 13.6% inter: 2.9% 6.1% 0.1%
[libx264 @ 0x5626ec855b80] i16 v,h,dc,p: 34% 26% 23% 17%
[libx264 @ 0x5626ec855b80] i8c dc,h,v,p: 46% 27% 20% 7%
[libx264 @ 0x5626ec855b80] kb/s:1954.96
[aac @ 0x5626ec84d200] Qavg: 122.161
Conversion failed!
注意:getUserMedia中给出的音频约束如下
canvasStream = canvas.captureStream(30);
audioTrack = stream.getTracks().filter( (track) => {
return track.kind === 'audio';
})[0];
canvasStream.addTrack(audioTrack);
audio: {
sampleRate: 44100,
echoCancellation: true
}
退出时ffmpeg给出的错误如下
ffmpeg -i - -c:v libx264 -crf 23 -preset ultrafast \
-tune zerolatency -max_muxing_queue_size 1000 \
-vsync cfr -async 1 -bufsize 2M -r 30 -g 60 -keyint_min 30 \
-x264opts keyint=30 -pix_fmt yuv420p -level 3 \
-c:a aac -b:a 96k -ar 96000 \
-f tee -map 0:v -map 0:a [f=flv] <rtmp url 1> | [f=flv] <rtmp url 2>
FFMPEG:[flv @ 0x5626ecf0f7c0] Failed to update header with correct duration.
[flv @ 0x5626ecf0f7c0] Failed to update header with correct filesize.
FFMPEG:[tee @ 0x5626ec8550c0] Slave muxer #1 failed, aborting.
av_interleaved_write_frame(): Broken pipe
FFMPEG:[flv @ 0x5626ecbe8840] Failed to update header with correct duration.
FFMPEG:[flv @ 0x5626ecbe8840] Failed to update header with correct filesize.
FFMPEG:frame= 2378 fps= 22 q=22.0 Lsize=N/A time=00:01:21.17 bitrate=N/A dup=2202 drop=5 speed=0.745x
video:18916kB audio:959kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
FFMPEG:[libx264 @ 0x5626ec855b80] frame I:80 Avg QP:13.97 size:115968
[libx264 @ 0x5626ec855b80] frame P:2298 Avg QP:16.77 size: 4392
[libx264 @ 0x5626ec855b80] mb I I16..4: 100.0% 0.0% 0.0%
FFMPEG:[libx264 @ 0x5626ec855b80] mb P I16..4: 3.8% 0.0% 0.0% P16..4: 9.5% 0.0% 0.0% 0.0% 0.0% skip:86.7%
[libx264 @ 0x5626ec855b80] coded y,uvDC,uvAC intra: 26.3% 42.2% 13.6% inter: 2.9% 6.1% 0.1%
[libx264 @ 0x5626ec855b80] i16 v,h,dc,p: 34% 26% 23% 17%
[libx264 @ 0x5626ec855b80] i8c dc,h,v,p: 46% 27% 20% 7%
[libx264 @ 0x5626ec855b80] kb/s:1954.96
[aac @ 0x5626ec84d200] Qavg: 122.161
Conversion failed!
非常感谢您的帮助
我怀疑这与音轨不合适有关,因此facebook拒绝了它
是的,这是正确的。Facebook需要一个音频曲目,如果没有,它会删除你的流
对于初学者,从FFmpeg命令中删除-ar 96000
。这将设置一个96 kHz的采样率,这是Facebook不想要的。你真的不想在FFmpeg上重新采样。。。让它使用从浏览器获得的任何采样率
接下来,在getUserMedia
约束上,将音频采样率设置为48 kHz,而不是44.1 kHz。Facebook不能很好地处理RTMP上44.1 kHz的音频。(目前,除非您的目标是CD音频,否则一般情况下,您希望对所有内容使用48 kHz,即44.1 kHz。)
接下来,FFmpeg音频命令将输出到两个RTMP URL。如果一个失败了,他们两个都会失败。如果一个落后了,他们两个都会停滞不前。这可能不是您想要的。:-)放下其中一个
现在,确保你有一个体面和一致的帧速率。Facebook对此非常挑剔,会删除你的流
要进行测试/调试,请使用磁盘上的简单FLV文件替换RTMP URL输出,以确保从浏览器到FFmpeg都能正常工作。一旦你一切顺利,你可以重新连接到Facebook,从那里开始