【问题标题】:record Linux Wayland/DRM screen using ffmpeg's kmsgrab device with superimposed webcam使用带有叠加网络摄像头的 ffmpeg 的 kmsgrab 设备记录 Linux Wayland/DRM 屏幕
【发布时间】:2019-11-07 17:46:20
【问题描述】:

设置是 Linux,ffmpeg 使用 kabylake iGPU。

我正在使用kmsgrab 设备捕获正在运行的sway 实例,这需要使用硬件后端来连贯地处理我硬件上的图像。只有 VA API 符合此要求。我想在编码期间覆盖右下角的网络摄像头。然而,试图操纵过滤器图来实现这一点的尝试并不成功。这最终适用于 Twitch/Tube 流。

现在,我实际上正在将网络摄像头捕获到一个 sdl 窗口,并使用 ffmpeg 的单独实例简单地记录屏幕。这实际上并不能解决我的问题,因为窗口很容易被工作区切换或其他窗口伪装。

这是解决方法:

#!/usr/bin/env zsh

# record webcam and open it in sdl window
ffmpeg -v quiet -hide_banner \
  -re -video_size 640X480 -hwaccel vaapi -vaapi_device /dev/dri/renderD128 -i /dev/video0 \
  -vf 'format=nv12,hwupload' -c:v hevc_vaapi -f hevc - \
  | ffmpeg -v quiet -i - -f sdl2 - &

# wait for webcam window to open
until swaymsg -t get_tree | grep 'pipe:' &>/dev/null; do
  sleep 0.5
done

# position webcam in the bottom right corner of screen using sway
swaymsg floating enable
swaymsg resize set width 320 height 240
swaymsg move position 1580 795
swaymsg focus tiling

#screencast
ffmpeg -format bgra -framerate 60 -f kmsgrab -thread_queue_size 1024 -i - \
  -f alsa -ac 2 -thread_queue_size 1024 -i hw:0 \
  -vf 'hwmap=derive_device=vaapi,scale_vaapi=w=1920:h=1080:format=nv12' \
  -c:v h264_vaapi -g 120 -b:v 3M -maxrate 3M -pix_fmt vaapi_vld -c:a aac -ab 96k -threads $(nproc) \
  output.mkv

kill %1

【问题讨论】:

  • 作为进一步的解决方法,您可以通过窗口管理器修复显示网络摄像头内容的窗口以始终保持在顶部
  • 谢谢,这是我尝试的第一件事。不幸的是,从我在手册页中可以找到的内容来看,sway 似乎没有这样的功能。我是 xmonad 的长期用户,但由于 qutebrowser 是原生的 Wayland,我最近改用 sway。

标签: ffmpeg youtube twitch vaapi


【解决方案1】:

瞬间,这可能是不可能的。

这看起来像是ffmpeg 的 vaapi 后端的限制。我注意到英特尔的 QuickSync 后端有一个overlay_qsv 过滤器,但没有等效的overlay_vaapi

理论上,一旦在hevc_vaapi 中编码后,可能有一种机制可以使用hwdownload 过滤器将硬件表面下载到软件缓冲区,以便使用软件@ 987654326@过滤器在编码的最后阶段做叠加。我将暂时保持开放状态,看看是否有人可以为此提供帮助或了解更多有关该主题的信息。

关于 QuickSync 的说明:

在使用 QuickSync 支持构建并尝试使用 it 后,它似乎缺乏从 kmsgrab 设备派生表面的能力,从而导致来自 ffmpegfunction not implemented 错误。

【讨论】:

  • 仅供参考,我对 x11grab 也有同样的问题。另外,我试图通过 vaapi decode + vaapi scaling + qsv encode 来欺骗它,但没有希望。不知何故,它无法解析 hwmap 过滤器
  • 你好@DrSensor你能在这里分享你的FFmpeg命令吗?我可以看看并处理它。
  • 在 FFmpeg 的 Vulkan 中有一个覆盖过滤器,让我看看有什么可以让这样的命令起作用。
猜你喜欢
  • 1970-01-01
  • 2020-05-29
  • 2018-07-11
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多