сделать запись экрана Linux Wayland / DRM с помощью устройства ffmpeg kmsgrab с наложенной веб-камерой - PullRequest
0 голосов
/ 07 ноября 2019

Настройка - Linux, ffmpeg с использованием kabylake iGPU.

Я фиксирую работающий экземпляр 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

1 Ответ

0 голосов
/ 10 ноября 2019

в момент , это может быть невозможно.

Я выгляжу как ограничение в ffmpeg бэкэнде vaapi. Я заметил, что бэкэнд Intel QuickSync имеет фильтр overlay_qsv, но нет эквивалента overlay_vaapi.

Теоретически может существовать механизм загрузки поверхности аппаратного обеспечения в программный буфер с использованием фильтра hwdownload после его кодирования в hevc_vaapi, чтобы использоватьПрограммный overlay фильтр для наложения на последнем этапе кодирования. Я пока оставлю это открытым, чтобы узнать, может ли кто-то помочь в этом направлении или что-то еще знает по этой теме.

примечание по QuickSync:

После сборки сПоддержка QuickSync и попытка использовать it , похоже, не хватает возможности получить поверхность из устройства kmsgrab, что приводит к ошибке function not implemented из ffmpeg.

...