Захват экрана Windows с помощью ffmpeg
Ffmpeg - это кроссплатформенное и очень мощное программное обеспечение для обработки видео / аудио или потоковой передачи. В Linux ffmpeg может захватить экран X11 с помощью команды ниже:
ffmpeg -f x11grab -r 25 -s cif -i :0.0 out.mpeg
Но возможно ли получить рабочий стол Windows с помощью ffmpeg?
8 ответов
Используйте встроенный экранный граббер GDI (установка не требуется) следующим образом:
ffmpeg -f gdigrab -framerate 10 -i desktop [output]
Это захватит ВСЕ ваши дисплеи как один большой непрерывный дисплей.
Если вы хотите ограничить область и показать захваченную область:
ffmpeg -f gdigrab -framerate ntsc -offset_x 10 -offset_y 20 -video_size 640x480 \
-show_region 1 -i desktop [output]
Чтобы получить содержимое окна с именем "Калькулятор":
ffmpeg -f gdigrab -framerate 25 -i title=Calculator [output]
Я обнаружил, что частота кадров 10 хорошо подходит для захвата экрана (вы можете изменить его).
Я закодировал оба файла и потоковые выходы, и это работает довольно хорошо.
Это поможет для захвата рабочего экрана на окнах:
ffmpeg -y -rtbufsize 100M -f gdigrab -t 00:00:30 -framerate 30 -probesize 10M -draw_mouse 1 -i рабочий стол -c:v libx264 -r 30 -представить сверхбыструю настройку zerolatency -crf 25 -pix_fmt yuv420p c:/video_comapre2.mp4
* этот код успешно опробован в Windows XP Sp3 и ffmpeg (последняя версия 28/12/2012 для windows) -ffmpeg.exe должен быть скопирован в каталог c:\windows\system32 для доступа из любого места с вашего компьютера) ScreenCapture может быть скачать бесплатно (гугл). Установите его (файл MSI). Его регистрируется автоматически из файла (ScreenCapture.ax). Он также отправляется с файлом IscrenCapture.h.
-capture на экране видео и аудио (настройте аудио устройства, которое у вас есть - у меня RealTek AC97 Audio) Я не могу установить параметры UscreenCapture в реестре (пробовал даже в файле IscrenCapture.h). Он всегда обеспечивает только полный захват экрана. Ошибка в расположении реестра, в типах параметров (слова задаются автором, но установлен reg_binary)... затем я использовал функцию ffmpeg crop() для захвата любого региона на экране. Командная строка:
xwidth
, xheight
ширина и высота области, которую хотите захватить.xleft
, xtop
координата верхней левой точки захвата прямоугольника.
ffmpeg -f dshow -i video="UScreenCapture":audio="Realtek AC97 Audio" -vf crop=xwidth:xheight:xleft:xtop c:\output.flv
для захвата видео можно использовать только
ffmpeg -f dshow -i video="UScreenCapture" -vf crop=xwidth:xheight:xleft:xtop c:\output.flv
NB: x11grab не работает на Windows (это специально для Linux/X11) может использовать wscript.shell для кодирования командной строки без вывода сообщений. Я использовал формат вывода видео как FLV, потому что у меня лучший рендеринг и небольшая емкость. Я не добился успеха с mp4.
вы можете узнать ваши медиа устройства с помощью ffmpeg:
ffmpeg -list_devices true -f dshow -i dummy
-вы можете записать любой звук с вашего компьютера с помощью этой командной строки (адаптировать устройство, которое у вас есть):
ffmpeg -f dshow -i audio="Realtek AC97 Audio" -acodec libmp3lame "c:\out.mp3"
Ffmpeg windows static version 4.2.2, запись экрана со звуком
проверить свой микрофон
ffmpeg -list_devices true -f dshow -i dummy
затем скопируйте ваш audio="ВАШ МИКРОФОН ИЛИ СТЕРЕО МИКС", мой - "Микрофон (Realtek High Definition Audio)".
ffmpeg -rtbufsize 1500M -f dshow -i audio="Microphone (Realtek High Definition Audio)" -f -y -rtbufsize 100M -f gdigrab -t 00:00:30 -framerate 30 -probesize 10M -draw_mouse 1 -i desktop -c:v libx264 -r 30 -preset ultrafast -tune zerolatency -crf 25 -pix_fmt yuv420p "d:\ffmpeg_testing.mp4"
Патч для реализации этого был отправлен в список рассылки ffmpeg некоторое время назад. Это бы осуществило gdigrab
работать так же, как x11grab
,
Кроме того, на странице кодека ffmpeg говорится, что поддерживается захват видео "VfW" (Video for Windows или DirectShow?).
http://nerdlogger.com/2011/11/03/stream-your-windows-desktop-using-ffmpeg/
объясняет, как это сделать.
в основном, установите фильтр uscreencapture dshow, затем ffmpeg -f dshow -i video="UScreenCapture" out.mp4
Это можно сделать без использования x11grab/xcbgrab/gdigrab
с помощью следующих команд в linux
.
Чтобы записать видео,
ffmpeg -f x11grab -s 1366x768 -i :0.0 -r 25 -vcodec libx264 output.mkv
Чтобы записать кадр,
./ffmpeg -f fbdev -framerate 1 -i /dev/fb1 -frames:v 1 screenshot3.jpeg
Я хотел бы добавить команду, которую я использую для захвата экрана:
ffmpeg.exe -y ^
-vsync vfr ^
-f gdigrab ^
-indexmem 300M ^
-rtbufsize 1G ^
-probesize 7M ^
-max_probe_packets 50k ^
-draw_mouse 0 ^
-video_size 1280x720 ^
-offset_y 152 ^
-framerate 24 ^
-c:v bmp ^
-strict strict ^
-thread_queue_size 50k ^
-r 24 ^
-i desktop ^
-f dshow ^
-channel_layout stereo ^
-thread_queue_size 50k ^
-strict strict ^
-i "audio=Stereo-mix (Realtek High Definition Audio)" ^
-map 0:v ^
-max_muxing_queue_size 50k ^
-f mp4 ^
-movflags +faststart ^
-max_interleave_delta 0 ^
-c:v libx264 ^
-r 24 ^
-preset fast ^
-tune film ^
-strict strict ^
-crf 25 ^
-pix_fmt yuv422p ^
-map 1:a ^
-max_muxing_queue_size 50k ^
-max_interleave_delta 0 ^
-c:a aac ^
-strict strict ^
-ac 2 ^
screencapture.mp4
Значение probesize оказывает большое влияние на синхронизацию аудио/видео. Увеличение значения на несколько мегабайт может привести к рассинхронизации аудио/видео. Изменение на 1M или 500k, например, до 7500k за раз. Если вы не укажете параметр probesize, ffmpeg по умолчанию установит для параметра probesize значение 5M.
Параметр max_interleave_delta предотвращает принудительный вывод ffmpeg. Если ffmpeg принудительно выводит, в вашем журнале появится сообщение, например:[mp4 @ 00000199f7512040] Задержка между первым и последним пакетом в очереди мультиплексирования составляет 10007271 > 10000000: принудительный вывод
Если ffmpeg требует много процессорного времени, попробуйте изменить параметр -preset (сверхбыстрый, сверхбыстрый, очень быстрый, быстрее, быстрый, средний (по умолчанию), медленный, медленнее, очень медленный), больше -crf (коэффициент постоянной скорости), например, 32 или ниже частота кадров (параметры -framerate и -r в нескольких местах команды).