Вопрос или проблема
Два разных пользователя (насколько мне известно) сообщили об этой ошибке, используя мое приложение на Electron, которое имеет возможность записывать игровой процесс и обрезать повторы в виде моментов:
У них 4060 и 3060. У меня также 3060 и (естественно) эта ошибка не возникает у меня.
Мы также проверили вывод nvidia-smi, и зарегистрировано только одно устройство NVidia. Один из них также попытался отключить встроенный GPU-адаптер от ЦП, но без успеха.
Ошибка конкретно следующая: “Существует 2 аппаратных устройства. устройство cuda0 типа cuda по умолчанию выбрано для фильтров. Установите аппаратное устройство явно с опцией filter_hw_device, если устройство cuda0 не может быть использовано для фильтров.“
Вот команда и лог выполнения ffmpeg:
[2024-12-18 00:46:10.210] [info] Выполнение ffmpeg.exe -nostats -hide_banner -hwaccel cuda -hwaccel_output_format cuda -init_hw_device d3d11va -filter_complex ddagrab=offset_x=0:offset_y=0:video_size=1920x1080:framerate=60 -f gdigrab -framerate 60 -i desktop -f dshow -i audio=@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{2EBD7673-1FDC-4624-B31B-E3850A00954A} -ar 44100 -f dshow -i audio=@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{2EBD7673-1FDC-4624-B31B-E3850A00954A} -ar 44100 -filter_complex [1:a][2:a]amerge=inputs=2[a] -map 0:v -map [a] -colorspace bt709 -color_trc bt709 -color_primaries bt709 -c:v h264_nvenc -b:v 2500k -preset p3 -rc:v vbr -cq 27 -profile:v high -tune hq -rc-lookahead 30 -spatial-aq 1 -bf 2 -g 60 -acodec aac -fps_mode passthrough -f mpegts -
[2024-12-18 00:46:10.472] [info] [info] [gdigrab @ 00000242f62ea540] Захват всего рабочего стола как 1920x1080x32 по координатам (0,0)
[2024-12-18 00:46:10.557] [info] [info] [gdigrab @ 00000242f62ea540] Поток #0: недостаточно кадров для оценки скорости; рассмотрите возможность увеличения probesize
[2024-12-18 00:46:10.559] [info] [info] Ввод #0, gdigrab, из 'desktop':
Продолжительность: Н/Д, начало: 1734482770.491128, битрейт: 3981337 кбит/с
Поток #0:0: Видео: bmp, bgra, 1920x1080, 3981337 кбит/с, 60 fps, 1000k tbr, 1000k tbn
[2024-12-18 00:46:11.649] [info] [info] [aist#1:0/pcm_s16le @ 00000242f62f2140] Предполагаемая конфигурация каналов: стерео
Ввод #1, dshow, из 'audio=@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{2EBD7673-1FDC-4624-B31B-E3850A00954A}':
Продолжительность: Н/Д, начало: 107919.758000, битрейт: 1411 кбит/с
Поток #1:0: Аудио: pcm_s16le, 44100 Гц, стерео, s16, 1411 кбит/с
[2024-12-18 00:46:12.271] [info] [info] [aist#2:0/pcm_s16le @ 00000242f6364f40] Предполагаемая конфигурация каналов: стерео
Ввод #2, dshow, из 'audio=@device_cm_{33D9A762-90C8-11D0-BD43-00A0C911CE86}\wave_{2EBD7673-1FDC-4624-B31B-E3850A00954A}':
Продолжительность: Н/Д, начало: 107920.393000, битрейт: 1411 кбит/с
Поток #2:0: Аудио: pcm_s16le, 44100 Гц, стерео, s16, 1411 кбит/с
[2024-12-18 00:46:12.467] [info] [info] Потоковое сопоставление:
Поток #1:0 (pcm_s16le) -> amerge (граф 1)
Поток #2:0 (pcm_s16le) -> amerge (граф 1)
ddagrab:default (граф 0) -> Поток #0:0 (h264_nvenc)
Поток #0:0 -> #0:1 (bmp (нативный) -> h264 (h264_nvenc))
amerge:default (граф 1) -> Поток #0:2 (aac)
[2024-12-18 00:46:12.469] [info] [info] Нажмите [q], чтобы остановить, [?], чтобы получить помощь
Существует 2 аппаратных устройства. устройство cuda0 типа cuda по умолчанию выбрано для фильтров. Установите аппаратное устройство явно с опцией filter_hw_device, если устройство cuda0 не может быть использовано для фильтров.
[2024-12-18 00:46:12.473] [info] [info] Сообщение повторено 1 раз
[Parsed_amerge_0 @ 00000242f62f0340] Нет конфигурации каналов для ввода 1
[2024-12-18 00:46:12.476] [info] [info] [Parsed_amerge_0 @ 00000242f62f0340] Конфигурации каналов ввода пересекаются: выходная конфигурация будет определяться количеством различных входных каналов
[Parsed_ddagrab_0 @ 00000242f62ef140] Не-D3D11VA входной hw_device_ctx
[Parsed_ddagrab_0 @ 00000242f62ef140] Не удалось настроить выходной пад на Parsed_ddagrab_0
[fc#0 @ 00000242f62e6200] Ошибка настройки графика фильтров: Неправильный аргумент
[fc#0 @ 00000242f62e6200] Задача завершена с кодом ошибки: -22 (Неправильный аргумент)
[fc#0 @ 00000242f62e6200] Завершение потока с кодом возврата -22 (Неправильный аргумент)
[2024-12-18 00:46:12.482] [info] [info] Существует 2 аппаратных устройства. устройство cuda0 типа cuda по умолчанию выбрано для фильтров. Установите аппаратное устройство явно с опцией filter_hw_device, если устройство cuda0 не может быть использовано для фильтров.
[2024-12-18 00:46:13.042] [info] [info] [vost#0:0/h264_nvenc @ 00000242fdaa6c80] [enc:h264_nvenc @ 00000242f634c280] Не удалось открыть кодер до EOF
[vost#0:0/h264_nvenc @ 00000242fdaa6c80] Задача завершена с кодом ошибки: -22 (Неправильный аргумент)
[vost#0:0/h264_nvenc @ 00000242fdaa6c80] Завершение потока с кодом возврата -22 (Неправильный аргумент)
[2024-12-18 00:46:13.092] [info] [info] [out#0/mpegts @ 00000242f62ef680] Ничего не было записано в выходной файл, потому что хотя бы один из его потоков не получил пакетов.
кадр= 0 fps=0.0 q=0.0 Lq=13.0 размер= 0KiB время=Н/Д битрейт=Н/Д скорость=Н/Д
[2024-12-18 00:46:13.212] [info] [info] [aac @ 00000242f6398bc0] Qavg: 116.716
[2024-12-18 00:46:13.286] [info] [info] Конвертация не удалась!
[2024-12-18 00:46:13.338] [info] Процесс FFmpeg завершился с кодом 4294967274
[2024-12-18 00:46:13.339] [error] ffmpeg закрылся с ошибкой 4294967274
Спасибо!
Ответ или решение
Ошибка, с которой сталкиваются пользователи вашего приложения на базе Electron, связана с неправильной конфигурацией оборудования и несовместимостью между устройствами CUDA и фильтром. Прежде всего, давайте разберем сообщение об ошибке, которое говорит: "Есть 2 аппаратных устройства. Устройство cuda0 типа cuda выбрано для фильтров по умолчанию. Установите аппаратное устройство явно с помощью параметра filter_hw_device, если устройство cuda0 не доступно для фильтров".
Понимание проблемы
-
Аппаратные устройства NVIDIA: Пользователи, столкнувшиеся с этой проблемой, имеют видеокарты NVIDIA 3060 и 4060. Ошибка указывает, что система обнаруживает два устройства CUDA, хотя
nvidia-smi
показывает только одно. Это может быть связано с тем, что приложение пытается использовать виртуальное или программное устройство вместо реального. -
Команда FFmpeg: Ваша команда использует аппаратное ускорение через CUDA, и происходит попытка конфигурирования графа фильтров с использованием этих устройств. Ошибка "Invalid argument" часто возникает из-за отсутствия необходимого устройства или его неправильной конфигурации.
Возможные решения
1. Явное указание устройства
Используйте параметр filter_hw_device
в вашем вызове FFmpeg, чтобы явно указать, какое устройство использовать. Это особенно полезно, если у вас есть более одного устройства CUDA:
-init_hw_device cuda=cuda0 ...
-filter_complex ... -filter_hw_device cuda=cuda0 ...
Это направит FFmpeg на использование конкретного устройства.
2. Проверка конфигурации драйвера
Убедитесь, что драйверы NVIDIA установлены и обновлены до последней версии. Иногда устаревшие или некорректные установки драйверов могут приводить к проблемам с обнаружением устройств.
3. Изоляция проблемы
- *Тестирование различных конфигураций:* Попробуйте запустить ваше приложение с различными настройками—отключив встроенное GPU, если это возможно, или тестируя на других системах.
- Обновление FFmpeg: Убедитесь, что используется последняя стабильная версия FFmpeg, так как возможны исправления ошибок, которые решают ваши проблемы.
4. Логи и документация
Проверьте дополнительные логи FFmpeg для получения подробной информации об ошибках. Возможно, есть другие подсказки, указывающие на неправильную конфигурацию.
5. Общение с пользователями
Регулярно обновляйте ваших пользователей о ходе решения их проблемы. Это может повысить уровень доверия к вашему приложению и увеличить их лояльность.
Выводы
Ошибки при использовании FFmpeg с аппаратным ускорением могут быть сложными для диагностики, особенно с несколькими устройствами. Явное указание на используемое устройство может помочь решить проблему, но важно также проводить комплексную проверку системы, включая обновление драйверов и использование последней версии FFmpeg. Помните о необходимости поддерживать связь с вашими пользователями и предоставлять им наряду с информацией о проблемах возможные решения.