使用ffmpeg的kmsgrab设备和叠加的网络摄像头录制Linux Wayland / DRM屏幕

安装程序是Linux,使用kabylake iGPU的ffmpeg。

我正在使用sway设备捕获正在运行的kmsgrab实例,这需要使用硬件后端来一致地处理硬件上的图像。仅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
worinima1 回答:使用ffmpeg的kmsgrab设备和叠加的网络摄像头录制Linux Wayland / DRM屏幕

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

我似乎在ffmpeg的vaapi后端中有一个限制。我注意到英特尔的QuickSync后端有一个overlay_qsv过滤器,但是没有等效的overlay_vaapi

从理论上讲,一旦在hwdownload中进行了编码,就有可能使用hevc_vaapi过滤器将硬件表面下载到软件缓冲区的机制overlay的过滤器进行过滤,以在编码的最后阶段进行叠加。我现在暂时将其保持打开状态,以查看是否有人可以为此目的工作或对该主题有更多了解。

关于QuickSync的注释:

在通过QuickSync支持进行构建并尝试使用 it 之后,它似乎缺乏从kmsgrab设备派生表面的功能,从而导致{ {1}}。

本文链接:https://www.f2er.com/3142631.html

大家都在问