Вопрос или проблема
Я пытаюсь записать экран удаленной Windows VM, к которой я получаю доступ через ssh. Я выполняю эту команду ffmpeg -f gdigrab -framerate 30 -i desktop -t 00:00:10 output.mp4
, которая возвращает следующую ошибку:
ffmpeg version 7.1-essentials_build-www.gyan.dev Copyright (c) 2000-2024 the FFmpeg developers
built with gcc 14.2.0 (Rev1, Built by MSYS2 project)
configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --en
able-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-zlib --enable-libsrt --enable-libss
h --enable-libzmq --enable-avisynth --enable-sdl2 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-lib
aom --enable-libopenjpeg --enable-libvpx --enable-mediafoundation --enable-libass --enable-libfreetype --enable-libfribidi --enabl
e-libharfbuzz --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-dxva2
--enable-d3d11va --enable-d3d12va --enable-ffnvcodec --enable-libvpl --enable-nvdec --enable-nvenc --enable-vaapi --enable-libgme
--enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libtheora --enable-libvo-amrwbenc --enable-libgsm --en
able-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-librubberband
libavutil 59. 39.100 / 59. 39.100
libavcodec 61. 19.100 / 61. 19.100
libavformat 61. 7.100 / 61. 7.100
libavdevice 61. 3.100 / 61. 3.100
libavfilter 10. 4.100 / 10. 4.100
libswscale 8. 3.100 / 8. 3.100
libswresample 5. 3.100 / 5. 3.100
libpostproc 58. 3.100 / 58. 3.100
[gdigrab @ 000001a87f3af600] Захват всего рабочего стола 1024x768x32 на (0,0)
[gdigrab @ 000001a87f3af600] Не удалось захватить изображение (ошибка 5)
[gdigrab @ 000001a87f3af600] Не удалось найти параметры кодека для потока 0 (Видео: bmp, none, 754987 kb/s): не указан размер
Рекомендуется увеличить значение параметров 'analyzeduration' (0) и 'probesize' (5000000)
Вход #0, gdigrab, из 'desktop':
Продолжительность: N/A, битрейт: 754987 kb/s
Поток #0:0: Видео: bmp, none, 754987 kb/s, 30 fps, 1000k tbr, 1000k tbn
Выход #0, mp4, в 'output.mp4':
[out#0/mp4 @ 000001a87f3aeec0] Выходной файл не содержит потоков
Ошибка открытия выходного файла output.mp4.
Ошибка открытия выходных файлов: Неверный аргумент
Если я подключаюсь к удаленному рабочему столу и использую ту же команду, то она отлично работает.
Я также пробовал выполнить ffmpeg.exe -f lavfi -i color=c=black:s=800x600:r=30:d=60 out.mp4
, который записывает что-то, но это просто черный экран.
Кто-нибудь знает, что может происходить? Я в недоумении, так как не смог найти больше информации онлайн.
Ответ или решение
Проблема, с которой вы столкнулись, связана с использованием инструмента ffmpeg
для захвата экрана удаленной машины Windows через SSH. Давайте разберем вашу ситуацию более подробно и предложим возможные решения.
Подробный анализ ситуации
-
Команда FFmpeg:
Вы используете команду:ffmpeg -f gdigrab -framerate 30 -i desktop -t 00:00:10 output.mp4
Эта команда предназначена для захвата всего рабочего стола и записи его в файл
output.mp4
. Однако, как вы заметили, возникает ошибка, связанная с отсутствием потоков в выходном файле. -
Ошибка захвата:
Из сообщения об ошибке:[gdigrab @ ...] Failed to capture image (error 5)
следует, что
ffmpeg
не может захватить изображение с вашего рабочего стола. Код ошибки 5 указывает на проблемы с доступом или правами на запись экрана. Обычно это происходит из-за особенностей работы GDI (Graphics Device Interface) в Windows, которые могут не поддерживаться при удаленном подключении по SSH. -
Проблема с RDP:
Вы упомянули, что команда работает, если вы используете удаленное рабочее стол (RDP). Это объясняется тем, что при использовании RDP видеопоток обрабатывается и разрешения экранов адаптируются иначе, чем при использовании SSH. GDI иногда требует активного десктопа, что и вызывает проблему при SSH. -
Альтернативное решение:
Вы также пробовали использовать команду:ffmpeg.exe -f lavfi -i color=c=black:s=800x600:r=30:d=60 out.mp4
Эта команда генерирует черный экран, что указывает на то, что
ffmpeg
не может захватить контент с рабочего стола.
Рекомендации по решению проблемы
-
Используйте RDP:
Наиболее простое решение, если это возможно, — использовать подключение по RDP вместо SSH для выполнения вашей команды. Это обеспечит корректную работу GDI и позволитffmpeg
захватывать изображение рабочего стола. -
Смена параметров:
Если использование RDP недоступно, вы можете попробовать изменить параметры вашей команды, например:ffmpeg -f gdigrab -framerate 30 -draw_mouse 0 -i desktop -t 00:00:10 output.mp4
Параметр
-draw_mouse 0
отключает захват курсора мыши, что может помочь в ряде случаев. -
Увеличение параметров анализа:
Также согласно сообщениям об ошибке, рассмотрите возможность увеличения значений дляanalyzeduration
иprobesize
:ffmpeg -f gdigrab -framerate 30 -i desktop -t 00:00:10 -analyzeduration 1000000 -probesize 5000000 output.mp4
-
Проверка прав доступа:
Убедитесь, что у вас есть необходимые права воздействия на графическую подсистему удаленной системы. Иногда может потребоваться дополнительная конфигурация безопасности. -
Установка дополнительных библиотек:
Проверьте, установлены ли все необходимые кодеки и библиотеки для работыffmpeg
с видео. Возможно, некоторые из них могут быть недоступны или не совместимы в вашей текущей среде.
Заключение
Проблема, с которой вы сталкиваетесь, связана с захватом экрана через SSH в Windows. Оптимальным решением будет использование RDP для удаленного доступа или корректировка параметров ffmpeg
, чтобы попытаться улучшить захват. Если проблемы сохраняются, возможно, стоит ознакомиться с альтернативными инструментами для захвата экрана, которые могут быть более эффективными для удаленных сценариев.
Если у вас есть дополнительные вопросы или вам нужна помощь в дальнейшем, не стесняйтесь обращаться!