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



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

我正在使用kmsgrab设备捕获一个正在运行的sway实例,这需要使用硬件后端来连贯地处理硬件上的图像。只有弗吉尼亚州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

在momento中,这可能是不可能的。

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

理论上,一旦硬件表面在hevc_vaapi中编码,就可以使用hwdownload滤波器将硬件表面下载到软件缓冲器,以便在编码的最后阶段使用软件overlay滤波器进行叠加。我暂时不谈这个问题,看看是否有人能帮助实现这一目标,或者是否对这个话题有更多了解。

关于QuickSync的说明:

在使用QuickSync支持构建并尝试使用it后,它似乎缺乏从kmsgrab设备导出曲面的能力,导致ffmpeg出现function not implemented错误。

最新更新