ffmpeg中thread_queue_size的正确用法

Alf*_*Alf 14 ffmpeg alsa screencast

我正在做一个截屏视频,记录屏幕上发生的情况以及来自外部 USB 麦克风的同步音频评论。我正在使用以下命令:

ffmpeg -f x11grab -r 25 -s 1280x720 -i :0.0+320,236 -thread_queue_size 1024 -f alsa -thread_queue_size 1024 -i hw:1 -vcodec huffyuv screencast.mkv
Run Code Online (Sandbox Code Playgroud)

我认为使用如此高的值thread_queue_size应该让我处于安全站点,以避免buffer xrun我以前遇到的任何错误。然而,情况似乎并非如此。这是录制过程中出现的警告消息:

[x11grab @ 0x55ffe44e6a40] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
[alsa @ 0x55ffe44efe80] Thread message queue blocking; consider raising the thread_queue_size option (current value: 1024)
[alsa @ 0x55ffe44efe80] ALSA buffer xrun.B time=00:07:35.96 bitrate=203382.4kbits/s speed=0.994x    
[alsa @ 0x55ffe44efe80] ALSA buffer xrun.B time=00:20:18.76 bitrate=210805.7kbits/s speed=0.998x    
Run Code Online (Sandbox Code Playgroud)

有两件事我不明白:

  1. 为什么x11grab说的是thread_queue_sizeis 8,而我将其设置为1024
  2. 尽管有of ,但仍然是ALSA buffer xrun错误/警告,我可以在此处放置什么值 - 最大值是多少以及该值的确切含义是什么?thread_queue_size1024

任何意见将不胜感激!


版本:

ffmpeg version 3.4.6-0ubuntu0.18.04.1
Kernel 4.15.0-99-generic
xubuntu 18.04.4 LTS x86_64
Run Code Online (Sandbox Code Playgroud)

Alf*_*Alf 9

两个问题,两个答案:

  1. 正如@Gyan在评论中所说,thread_queue_size应用于其后指定的第一个输入。这意味着我ffmpeg在问题中给出的命令:

    ffmpeg -f x11grab -thread_queue_size 1024 -r 25 -s 1280x720 -i :0.0+320,236 \
           -f alsa -thread_queue_size 1024 -i hw:1 -vcodec huffyuv screencast.mkv
    
    Run Code Online (Sandbox Code Playgroud)
  2. 这里的问题似乎是我保存了一个未压缩的视频文件 - 这些文件会变得非常大非常快。我的磁盘似乎无法及时将所有内容写入其中。因此,我更改了录制方式以保存压缩视频,这对 CPU 提出了更多要求,大大减少了文件大小。我用于记录屏幕截图的新命令(这不会导致任何结果buffer xrun

    ffmpeg -f x11grab -thread_queue_size 4096 -r 25 -s 1280x720 -i :0.0+320,236 \
           -f alsa -thread_queue_size 4096 -i hw:1 -vcodec libx264 \
           -pix_fmt yuv420p -threads 0 -acodec aac screencast.mp4
    
    Run Code Online (Sandbox Code Playgroud)

  • 由于您首选的视频编码器是 huffyuv,我猜您打算稍后重新压缩录制的文件。您可以通过使用硬件加速视频编解码器之一(例如 h264-vaapi、h264_nvenc 及其 h265/hevc 等效项)来大大减少 CPU 负载,或者通过使用“-preset ultrafast”仍然可以减少 CPU 负载,两者都具有一定的质量或比特率高于最终重新压缩步骤的值。 (3认同)