ffmpeg-python 从 x11grab 获取输入

ffmpeg-python take input from x11grab

我正在使用 FFmpeg-python 绑定来使用 FFmpeg。我必须从 x11grab 获取输入,为此我已经在 shell 中有一个等效命令,即

ffmpeg -nostdin -hide_banner -nostats -loglevel panic -video_size 1920x1080 -r 60 -framerate 30 -f x11grab -i :1 -f alsa -ac 2 -i pulse -preset fast -pix_fmt yuv420p file.mkv &

我已经浏览了 FFmpeg-Python 的文档来创建一个等效的命令,但是,我在文档中找不到 x11grab 的任何示例。

我想使用绑定来使代码更具可读性,该命令适用于 subprocess.call() / os.system()

语法类似于以下代码示例:

import ffmpeg

(
    ffmpeg
    .output(ffmpeg.input(':0', s='192x128', r=30, f='x11grab'),
            ffmpeg.input('sine=frequency=500', f='lavfi'),
            'file.mkv',
            vcodec='libx264', acodec='aac', preset='fast', pix_fmt='yuv420p', t=5)
    .global_args('-nostdin', '-hide_banner', '-nostats')
    .overwrite_output()
    .run()
)

备注:

  • 我的 Ubuntu 18.04 虚拟机不接受 1920x1080 分辨率,也不接受音频输入设备(我用合成音频替换了它)。
  • 您可以将 ffmpeg.input('sine=frequency=500', f='lavfi') 替换为:
    ffmpeg.input('pulse', f='alsa', ac=2),但我无法测试...
  • 示例选择视频和音频编解码器:vcodec='libx264', acodec='aac'(选择编解码器是一个很好的做法)。
  • 示例使用t=5仅录制5秒。
  • .overwrite_output()用于不询问就覆盖输出。

抓取样本: