gpt4 book ai didi

facebook - 从 ffmpeg 流式传输到 Facebook Live 被终止

转载 作者:行者123 更新时间:2023-12-04 23:11:21 25 4
gpt4 key购买 nike

我正在尝试在浏览器(canvas.captureStream)上捕获 Canvas ,添加音频(使用 getUserMedia 捕获并使用 canvasStream.addTracks 添加到流中)并将其发送到服务器。服务器使用 ffmpeg 将流(使用 H264 编码后)发送到 facebook live。然而,流并不稳定,并在几分钟内断开连接。
如果直接(没有 canvas.captureStream)发送视频和音轨(使用 getMediaUser),它可以正常工作。我怀疑它与音轨不正确有关,因此 facebook 拒绝它(ffmpeg 没有特别错误,它只是因 IO 错误而退出)。需要帮助找出将 Canvas 流与音频一起发送的正确方法。
当前的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>
注意:在上面的命令中 被替换为实际的 url(包括所需的 session key )
我在浏览器上捕获 Canvas 和音频的设置如下

canvasStream = canvas.captureStream(30);
audioTrack = stream.getTracks().filter( (track) => {
return track.kind === 'audio';
})[0];
canvasStream.addTrack(audioTrack);

注意:getUserMedia 中给出的音频约束如下
audio: {
sampleRate: 44100,
echoCancellation: true
}
退出时ffmpeg给出的错误如下
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!
感谢您对此的任何帮助。

最佳答案

I am suspecting it has to do with the audio track not being proper and hence facebook rejecting it


是的,这是正确的。 Facebook 需要一个音轨,如果它不存在,它将丢弃您的流。
对于初学者,请删除 -ar 96000从你的 FFmpeg 命令。这将设置 96 kHz 的采样率,这是 Facebook 不想要的。无论如何,你真的不想在 FFmpeg 上重新采样......只要让它使用它从浏览器获得的任何采样率。
接下来,在 getUserMedia 上将音频采样率设置为 48 kHz 而不是 44.1 kHz约束。 Facebook 不能很好地处理 RTMP 摄取上的 44.1 kHz 音频。 (通常现在,您希望对所有内容都使用 48 kHz,除非您的目标是 CD 音频,即 44.1 kHz。)
接下来,您的 FFmpeg 音频命令将输出到两个 RTMP URL。如果一个失败了,他们都会失败。如果一个人落后,他们都会停滞不前。这可能不是你想要的。 :-) 放弃其中之一。
现在,确保你有一个体面和一致的帧速率。 Facebook 对此非常挑剔,并且会丢弃您的信息流。
要测试/调试,请将您的 RTMP URL 输出替换为磁盘上的简单 FLV 文件,以确保从浏览器到 FFmpeg 一切正常。一旦一切顺利并正常工作,您就可以重新连接到 Facebook 并从那里开始。

关于facebook - 从 ffmpeg 流式传输到 Facebook Live 被终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67239143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com