在 ffmpeg 中正确使用 thread_queue_size

Correct usage of thread_queue_size in ffmpeg

我正在做一个截屏视频,我正在录制屏幕上发生的事情以及来自外部 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

我认为为 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    

两件事我不明白:

  1. 为什么x11grabthread_queue_size8,而我却把它设为1024
  2. 仍然是 ALSA buffer xrun error/warning,尽管 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

两个问题,两个答案:

  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

  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