Вопрос или проблема
Я пытаюсь транскодировать видео mp4 в hevc nvenc с помощью следующей команды:
ffmpeg -i test.mp4 -c:v hevc_nvenc output.mkv
Но я постоянно получаю ошибку, показанную в конце этого поста. Я использую ноутбук с графикой RTX 3060, который, как показано на этом сайте: https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new, поддерживает кодирование и декодирование HEVC.
Я пробовал транскодировать в h.264 nvenc, и в h.265 без nvenc, используя следующие команды:
ffmpeg -i test.mp4 -c:v h264_nvenc -c:a copy output.mkv
ffmpeg -i input.mp4 -c:v libx265 -c:a copy output.mkv
И обе команды сработали, так что, кажется, проблема только в hevc nvenc.
Вот вывод для hevc nvenc, любая помощь будет очень признательна:
собран с gcc 13.2.0 (Rev5, создано проектом MSYS2)
конфигурация: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libaribcaption --enable-libdav1d --enable-libdavs2 --enable-libopenjpeg --enable-libquirc --enable-libuavs3d --enable-libxevd --enable-libzvbi --enable-libqrencode --enable-librav1e --enable-libsvtav1 --enable-libvvenc --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxeve --enable-libxvid --enable-libaom --enable-libjxl --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-liblensfun --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-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libcodec2 --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
libavutil 59. 31.100 / 59. 31.100
libavcodec 61. 11.100 / 61. 11.100
libavformat 61. 5.101 / 61. 5.101
libavdevice 61. 2.100 / 61. 2.100
libavfilter 10. 2.102 / 10. 2.102
libswscale 8. 2.100 / 8. 2.100
libswresample 5. 2.100 / 5. 2.100
libpostproc 58. 2.100 / 58. 2.100
Вход #0, mov,mp4,m4a,3gp,3g2,mj2, из 'test.mp4':
Метаданные:
major_brand : isom
minor_version : 512
compatible_brands: isomiso2avc1mp41
encoder : Lavf59.16.100
Продолжительность: 00:02:06.60, начало: 0.000000, битрейт: 4153 кбит/с
Поток #0:0[0x1](und): Видеo: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 4014 кбит/с, 59.94 fps, 59.94 tbr, 60k tbn (по умолчанию)
Метаданные:
handler_name : ISO Media file produced by Google Inc.
vendor_id : [0][0][0][0]
Поток #0:1[0x2](eng): Аудио: aac (LC) (mp4a / 0x6134706D), 44100 Гц, стерео, fltp, 127 кбит/с (по умолчанию)
Метаданные:
handler_name : ISO Media file produced by Google Inc.
vendor_id : [0][0][0][0]
Сопоставление потоков:
Поток #0:0 -> #0:0 (h264 (native) -> hevc (hevc_nvenc))
Поток #0:1 -> #0:1 (aac (native) -> vorbis (libvorbis))
Нажмите [q], чтобы остановить, [?] для помощи
[hevc_nvenc @ 00000147092cb0c0] Кодек не поддерживается
[hevc_nvenc @ 00000147092cb0c0] Не найдено совместимых устройств
[vost#0:0/hevc_nvenc @ 000001470929e980] Ошибка при открытии кодировщика - возможно, неверные параметры, такие как битрейт, скорость, ширина или высота.
[vf#0:0 @ 00000147092cb440] Ошибка отправки кадров в потребителей: Обобщенная ошибка во внешней библиотеке
[vf#0:0 @ 00000147092cb440] Задача завершена с кодом ошибки: -542398533 (Обобщенная ошибка во внешней библиотеке)
[vf#0:0 @ 00000147092cb440] Завершение потока с кодом возврата -542398533 (Обобщенная ошибка во внешней библиотеке)
[vost#0:0/hevc_nvenc @ 000001470929e980] Не удалось открыть кодировщик до конца файла
[vost#0:0/hevc_nvenc @ 000001470929e980] Задача завершена с кодом ошибки: -22 (Недопустимый аргумент)
[vost#0:0/hevc_nvenc @ 000001470929e980] Завершение потока с кодом возврата -22 (Недопустимый аргумент)
[out#0/matroska @ 00000147090f37c0] Ничего не записано в выходной файл, потому что по крайней мере один из его потоков не получил пакетов.
frame= 0 fps=0.0 q=0.0 Lsize= 0KiB time=N/A bitrate=N/A speed=N/A
Конвертация не удалась!
Попробуйте эту команду:
ffmpeg -v 0 -encoders | findstr "nvenc"
На моем оборудовании я получаю такой вывод:
V....D av1_nvenc Кодировщик NVIDIA NVENC av1 (кодек av1)
V....D h264_nvenc Кодировщик NVIDIA NVENC H.264 (кодек h264)
V....D hevc_nvenc Кодировщик NVIDIA NVENC hevc (кодек hevc)
Это по крайней мере подтвердит, что ваш ffmpeg содержит эти кодировщики.
Ответ или решение
Проблема, с которой вы столкнулись, связана с конфигурацией вашей среды для использования NVIDIA NVENC для кодирования в HEVC (h.265). Хотя ваша видеокарта GeForce RTX 3060 действительно поддерживает HEVC, данный сбой может происходить по нескольким причинам. Рассмотрим возможные решения проблемы.
Шаги для решения проблемы
-
Проверьте версию драйвера NVIDIA:
Убедитесь, что у вас установлены последние драйвера для вашей видеокарты. Вы можете скачать актуальные версии драйверов с официального сайта NVIDIA. Обновление драйверов может помочь устранить проблемы совместимости с кодеком. -
Проверьте, поддерживается ли
hevc_nvenc
в текущей сборке FFmpeg:
Выполните команду:ffmpeg -encoders | findstr "nvenc"
Убедитесь, что в списке доступных кодеков присутствует
hevc_nvenc
. Если этого кодека нет, вам необходимо установить FFmpeg с поддержкой NVENC. Обычно, версии, скомпилированные с опцией--enable-nvenc
, поддерживают работу с NVENC. -
Проверьте параметры кодирования:
Возможно, параметры кодирования, такие как разрешение, битрейт или частота кадров, находятся за пределами допустимых значений для вашего GPU. Попробуйте указать явные значения:ffmpeg -i test.mp4 -c:v hevc_nvenc -b:v 5M -preset fast output.mkv
В данном примере мы устанавливаем битрейт на 5 Мбит/с и используем предустановку
fast
. -
Убедитесь в наличии необходимых библиотек и кодеков:
Иногда отсутствуют дополнительные софта для работы с NVENC. Убедитесь, что в вашей системе установлены необходимые зависимости для работы FFmpeg с NVIDIA NVENC. -
Переход на более новую версию FFmpeg:
Если проблема сохраняется, попробуйте обновить FFmpeg до последней версии. Новые версии могут содержать исправления и улучшения работы с NVENC. -
Проверка использования устройства:
Запустите следующую команду, чтобы проверить доступные устройства:ffmpeg -hwaccels
Это покажет, какие аппаратные ускорения доступны. Также можно использовать команду:
nvidia-smi
Это даст информацию о состоянии GPU и о том, используются ли ресурсы.
-
Перезагрузите систему:
Если после обновления драйверов и FFmpeg проблема persists, попробуйте перезагрузить систему. Иногда программное обеспечение может не корректно инициализировать GPU при первом запуске.
Заключение
Если после выполнения всех вышеуказанных шагов проблема не решается, возможно, стоит обратиться к сообществу FFmpeg или NVIDIA, чтобы получить помощь. Также полезно проверить их форумы на наличие аналогичных случаев и решений. Надеюсь, эти рекомендации помогут вам успешно настроить кодирование HEVC с использованием NVENC на вашей системе.