FFmpeg 错误:WebM 仅支持 VP8 或 VP9 或 AV1 视频以及 Vorbis 或 Opus 音频和 WebVTT 字幕且编解码器参数不正确

Not*_*Bot 6 video ffmpeg h.264

使用FFmpeg录制直播流。

实际上,它是一个平台,某人可以在其中进行直播(相机或屏幕),其他人可以以视图的形式加入流。

直播的人可以选择录制该直播。FFmpeg正在使用录制流。

正在以文件格式记录流WEBM

问题是 FFmpeg 抛出错误。

WebM 仅支持 VP8 或 VP9 或 AV1 视频以及 Vorbis 或 Opus 音频和 WebVTT 字幕。
无法为输出文件 #0 写入标头(编解码器参数不正确?):参数无效

记录流的命令如下。

ffmpeg -loglevel debug -protocol_whitelist pipe udp rtp 
-fflags+genpts -f sdp -i pipe:0 -map 0:v:0 -c:v copy 
-map 0:a:0 -strict -2 -c:a copy -flags +global_header 1234_VIDEO_1671647432529.webm  
Run Code Online (Sandbox Code Playgroud)
服务 版本
服务器(EC2) AWS Linux 2
FFmpeg版本 4.3.2-静态

注意:两周前,同一个命令正在运行。

Dai*_*Dai 4

  • 您的视频和音频标志均设置为copy

    • -c:v copy -c:a copy
  • ...这意味着ffmpeg将直接从(可能是管道输入的 RTP)获取视频和音频数据,并尝试将它们直接保存到输出 WebM 文件中。

    • ...所以这仅在输出文件格式实际上支持输入数据的编解码器时才有效。
  • ...在这种情况下,您的 RTP 流包含与 WebM 不兼容的视频或音频(或两者)轨道/流。

    • WebM 本身是一种容器格式(源自 Matroska),仅支持少量音频和视频编解码器(根据设计),而 MPEG-4、Matroska 和 AVI 等其他容器格式则支持更广泛的编解码器。
  • ffmpeg不会在启动时预先验证您的命令行,而是 ffmpeg 会盲目地遵循您的指示,因此您不会得到“WebM 仅支持 VP8 或 VP9 或 AV1 视频和 Vorbis 或 Opus 音频和 WebVTT 字幕”的信息。错误消息,直到您的输入流开始包含无法使用copy.

    • ffmpeg 文档中提到了这一点

      ffmpeg 不会验证指定的编码器是否可以转换选定的流,或者转换后的流是否在输出格式中可接受。这通常也适用:当用户手动设置编码器时,流选择过程无法检查编码流是否可以复用到输出文件中。如果不能,ffmpeg 将中止并且所有输出文件将无法处理。

  • 解决方案是为音频和视频指定与 WebM 兼容的编解码器。

    • 对于视频 ( -c:v),WebM 仅支持VP8VP9 -技术上 也 支持AV1 :
      • 对于 VP8,使用-c:v libvpx -crf 15 -b:v 1M
      • 对于 VP9,使用-c:v libvpx-vp9 -crf 30 -b:v 0
      • 对于 AV1,使用-c:v libaom-av1 -crf 30 -b:v 0
    • 对于音频,WebM 仅支持 Opus 和Vorbis
      • 对于 Opus,请使用-c:a libopus
      • 对于 Vorbis,使用-c:a libvorbis
  • 不幸的是,如果输入流已经使用与输出文件格式兼容的编解码器,似乎没有办法让 ffmpeg有条件地选择copy重新编码(使用等)。-c:v libvpx

    • 对于预先录制的文件来说这不是问题,因为您可以使用它ffprobe来检测文件的格式,然后ffmpeg根据该格式指定编解码器。
    • ...但是如果您从直播中进行管道传输,那么最糟糕的选择似乎就是始终使用 VP9(VP8 和 VP9似乎具有相似的支持级别,而Safari 上缺乏 AV1 的支持(iOS和 macOS)和 Edge。
  • ...因此,尝试这个命令行(为了可读性添加了换行符):

    ffmpeg
        -loglevel debug
        -protocol_whitelist pipe udp rtp 
        -fflags+genpts
        -f sdp
        -i pipe:0
        -map 0:v:0
        -c:v libvpx-vp9 -crf 30 -b:v 0
        -map 0:a:0
        -strict -2
        -c:a libvorbis
        -flags +global_header
        -f webm
        1234_VIDEO_1671647432529.webm 
    
    Run Code Online (Sandbox Code Playgroud)
  • 顺便说一句,我感觉-map 0:v:0-map 0:a:0选项可以被删除,因为 ffmpeg 默认情况下会选择第一个音频流和第一个视频流,并且-strict -2标志似乎是一个货物崇拜用途,用于强制将 Opus 音频放入 MPEG-4 容器中 -您可以使用它如果您使用 WebM 作为容器格式,则不需要...所以请考虑使用这个更简单的版本:

    ffmpeg
        -loglevel debug
        -protocol_whitelist pipe udp rtp 
        -fflags+genpts
        -f sdp
        -i pipe:0
        -c:v libvpx-vp9 -crf 30 -b:v 0
        -c:a libvorbis
        -flags +global_header
        -f webm
        1234_VIDEO_1671647432529.webm 
    
    Run Code Online (Sandbox Code Playgroud)