【问题标题】:Streaming to Facebook Live from ffmpeg gets terminated从 ffmpeg 流式传输到 Facebook Live 被终止
【发布时间】:2021-07-18 04:53:57
【问题描述】:

我正在尝试在浏览器 (canvas.captureStream) 上捕获画布,添加音频(使用 getUserMedia 捕获并使用 canvasStream.addTracks 添加到流中)并将其发送到服务器。服务器使用 ffmpeg 将流(使用 H264 编码后)发送到 facebook live。然而,流并不稳定,并在几分钟内断开连接。 如果直接(没有 canvas.captureStream)发送视频和音轨(使用 getMediaUser),它工作正常。我怀疑它与音轨不正确有关,因此 facebook 拒绝它(ffmpeg 没有特别错误,它只是因 IO 错误而退出)。需要帮助找出将画布流与音频一起发送的正确方法。

当前的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(包括所需的会话密钥)

我在浏览器上捕获画布和音频的设置如下


    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!

感谢任何帮助。

【问题讨论】:

    标签: facebook audio ffmpeg streaming live-streaming


    【解决方案1】:

    我怀疑这与音轨不正确有关,因此 facebook 拒绝了它

    是的,这是正确的。 Facebook 需要音轨,如果不存在,它将丢弃您的流。

    对于初学者,请从您的 FFmpeg 命令中删除 -ar 96000。这将设置 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 并从那里开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 2019-06-13
      • 2020-06-05
      • 2020-12-14
      • 2017-07-16
      • 2021-04-12
      • 2018-08-06
      相关资源
      最近更新 更多