nrd*_*dxp 5 youtube ffmpeg twitch vaapi
设置是 Linux,ffmpeg 使用 kabylake iGPU。
我正在使用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
Run Code Online (Sandbox Code Playgroud)
在当下,这可能是不可能的。
ffmpeg它看起来像是vaapi 后端的限制。我注意到英特尔的 QuickSync 后端有一个overlay_qsv过滤器,但没有等效的overlay_vaapi。
理论上,可能存在一种机制,一旦编码完毕,就可以使用过滤器将硬件表面下载到软件缓冲区,以便在编码的最后阶段利用软件过滤器进行叠加。我暂时将其保留,看看是否有人可以帮助实现这一目标或了解有关该主题的更多信息。hwdownloadhevc_vaapioverlay
关于快速同步的注意事项:
在使用 QuickSync 支持进行构建并尝试使用它后,它似乎缺乏从设备导出表面的能力,kmsgrab从而导致function not implemented错误ffmpeg。