Трубопровод XPra к ffmpeg
Я пытаюсь записать безголовый дисплей XPRA. (Я пробовал оба варианта xvfb и Xdummy).
Проблема связана с "x11grab" в ffmpeg. Используемая команда:
/usr/bin/ffmpeg -y -framerate 2 -video_size 1920x1080 -f x11grab -i :102 -vcodec libx264 -crf 0 -preset ultrafast /output.mkv
Проблема в том, что это просто записывает пустой экран. Он полностью белый, за исключением черного X, который вы узнаете в системе Linux.
Ffmpeg отлично работает для записи "реальных" дисплеев, и я могу подключиться к сеансу xpra и увидеть, что на самом деле на дисплее есть окна. Кроме того, передача вывода xwd в xwud показывает те же окна.
Я потратил весь день на это! Кто-нибудь знает какие-нибудь хаки, которые я могу сделать, чтобы заставить работать x11grab?
2 ответа
Xpra - это оконный менеджер композитинга, цитирую: оконный менеджер объединяет оконные буферы в изображение, представляющее экран, и записывает результат в память дисплея., В случае xpra память дисплея находится на клиенте, и до тех пор, пока вы не подключите свой клиент, она не существует, и поэтому на vfb ничего не отображается. Вот как работает xpra.
Если вы хотите использовать xpra и по-прежнему передавать vfb в ffmpeg с помощью x11grab, вы можете запустить vfb отдельно, а затем использовать xpra shadow
для доступа к существующему VFB через XPRA. (теневой режим xpra гораздо менее эффективен... потому что он не использует композитирование, он использует скрапбукинг, как x11grab)
Начиная с версии 0.16, появилась новая опция sync-xvfb (в миллисекундах), которая также может использоваться для рисования виртуального экрана, который затем можно захватить.
Так что после некоторой тяжелой работы я решил, что это связано с тем, как xpra управляет активными окнами.
Для передачи xwd в xwud требуется указать идентификатор дочернего окна для xwd, в противном случае он просто отображает пустую рамку окна. Визуально это очень отличается от пустой белой рамки, которую я получаю от ffmpeg, но я думаю, что это указывает на то же самое.
Если бы я должен был догадаться, это как-то связано с самолетами, о чем свидетельствует
444 req->planeMask = (unsigned int)AllPlanes;
445 req->format = ZPixmap;
^ код ffmpeg для x11grab, с https://ffmpeg.org/doxygen/trunk/x11grab_8c_source.html
Я решил отказаться от xpra и использовать автономный xvfb. Это позволяет мне использовать ffmpeg