В дополнение к основной теме нейросетей: ffmpeg, h264_nvenc

машинное обучение в обработке фото и видео
Ответить
Аватара пользователя
mihas
Администратор
Сообщения: 1473
Зарегистрирован: 18 авг 2004, 16:58
Откуда: Москва
Контактная информация:

В дополнение к основной теме нейросетей: ffmpeg, h264_nvenc

Сообщение mihas »

Иногда в рамках темы нейросетей нужно разобрать видео на кадры, отдельно обработать видео и аудио, собрать потом результат. Все это делает ffmpeg, причем умеет обрабатывать видео на GPU с огромным ускорением.
Записываю на память несколько полезных команд для ffmpeg.

Для удобства дальнейшей работы пропишем путь к ffmpeg в переменных среды в Windows 10 или 11:

1) Win+R на клавиатуре, ввести sysdm.cpl
2) Дополнительно -> Переменные среды
3) Системные переменные -> Path -> Создать
4) Вставить путь к ffmpeg, например C:\ffmpeg-7.1-essentials_build\bin

И можем приступать к работе. Можно пропустить первую инструкцию и просто указывать всегда далее по тексту полный путь к программе ffmpeg например так: C:\ffmpeg-7.1-essentials_build\bin\ffmpeg

Для превращения ролика в серию кадров используйте команду примерно такую в командной строке:
ffmpeg -i input.mp4 %05d.png

Для создания списка файлов в Windows подходит команда dir:
cmd /u /c dir /b /o:d /o:e "D:\Folder" > D:\list.txt
где o:d - сортировка по дате, o:n - по алфавиту, o:e — по алфавиту по расширению.

Чтобы запаковать готовый результат из обработанных кадров в mp4 используйте следующую команду:
ffmpeg -r 20 -i "%05d.png" -c:v libx264 -r 30 -pix_fmt yuv420p -b:v 3200k -maxrate:v 4800k -minrate:v 1600k -bufsize:v 1920k video.mp4

В bat-файлах, в отличие от прямого ввода в командную строку, прописывайте не один символ %, а два %%.
Имена файлов или пути с пробелами заключайте в кавычки.

Для записи видео без звуковой дорожки используйте:
ffmpeg -i input.avi -ss 00:00:12 -c:v h264_nvenc -qp 0 -an output.mp4
в примере отрезаются -ss первые 12 секунд от основного видео, кодирование в h264 происходит с ускорением на GPU Nvidia, качество -qp 0 - без сжатия наивысшего качества, параметр -an не копирует звуковую дорожку. Кодирование видео в h264 примерно в 30-40 раз быстрее на средней руки GPU командой h264_nvenc, чем на самом мощном процессоре уровня i9.

Для записи отдельно от видео звуковой дорожки:
ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -b:a 320k -ss 00:00:12 output.mp3
в примере отрезаются первые 12 секунд, параметр -vn не копирует видеодорожку, отдельно указаны битрейт и частота дискретизации для кодирования аудио в mp3 с наивысшим качеством в примере.

Изменить соотношение сторон видео можно так:
ffmpeg -i input.mp4 -vf "scale=1600:1080,setsar=1:1" -c:v h264_nvenc -qp 10 -c:a ac3 -ar 44100 -b:a 192k output.mp4
в примере мы сжимаем исходное видео 1920х1080 по горизонтали до ширины 1600, и указываем 1:1 что это именно требуемое при просмотре соотношение сторон. Можно поэкспериментировать с алгоритмами ресемплинга примерно так:
-vf "scale=1600x1080:flags=lanczos:param0=3,setsar=1:1" Specifying scaling algorithms по ссылке.

Пример загрузки CPU и GPU в ffmpeg при одновременном кодировании видео в h264 и двух потоков аудио в ac3. На RTX 3060 и i9 скорость кодирования h264 + ac3 в два потока - более 30x.
Пример загрузки CPU и GPU в ffmpeg при одновременном кодировании видео в h264 и двух потоков аудио в ac3. На RTX 3060 и i9 скорость кодирования h264 + ac3 в два потока - более 30x.
• 139.17 КБ • 271 просмотр
Для сборки из одного потока видео и двух потоков аудио в один файл такая команда:
ffmpeg -i input.mp4 -i input1.mp3 -i input2.mp3 -map 0 -map 1 -map 2 -c:v h264_nvenc -qp 16 -c:a ac3 -ar 44100 -b:a 192k output.mp4
в примере создается видео с двумя аудиодорожками, с типичной кодировкой и битрейтом коммерческого DVD, сжатие видео h264 осуществляет GPU параллельно с работой центрального процессора над обеими аудиодорожками, качество видео h264 -qp 16 - отличный компромисс между размером и качеством, иногда рекомендуют 17-18 (помним что 0 - без сжатия вообще). Заскриншотил выполнение этой команды с одновременным кодированием трех потоков на CPU и GPU. Чтобы ничего не тормозило, три потока читаются с трех разных дисков и результирующий файл пишется на четвертый диск. Наибольшую загрузку показывает чтение несжатого видеопотока в качестве -qp 0 с диска G:\ на скриншоте.

Повороты видео:
ffmpeg -i input.mp4 -vf "transpose=cclock" -c:v h264_nvenc -qp 17 -c:a copy output.mp4
Здесь в фильтре transpose такие варианты:
clock – поворот на 90 градусов по часовой стрелке;
cclock – поворот на 90 градусов против часовой стрелки;
clock_flip – поворот на 90 градусов по часовой стрелке и зеркальное отражение по вертикали;
cclock_flip – поворот на 90 градусов против часовой стрелки и зеркальное отражение по вертикали.

Повороты на произвольный угол:
ffmpeg -i input.mp4 -vf "rotate=-15*PI/180" -c:v h264_nvenc -qp 17 -c:a copy output.mp4
Здесь осуществляется поворот на 15 градусов против часовой стрелки. По часовой - уберите минус перед углом в градусах.

Поэкспериментировать с апскейлингом видео можно так например:
ffmpeg -i inp720x576.wmv -filter:v "scale=1440x1080:flags=lanczos:param0=3,setsar=1:1,unsharp=luma_msize_x=3:luma_msize_y=3:luma_amount=2" -c:v h264_nvenc -qp 17 -c:a ac3 -ar 44100 -b:a 192k out1440x1080.mp4
Здесь мы масштабируем с алгоритмом Ланкоша и потом немного шарпим на свой вкус, с тремя параметрами шарпинга luma можно поэкспериментировать. В сравнении с примером применения аналитических фильтров ffmpeg мне пока не очень нравится, как работают разные нейросети с апскейлингом видео, авторы затачивают их почему-то на мультяшные аниме, но если найду и освою что-то стоящее - напишу.

Если высокоскоростной кодер на графическом процессоре h264_nvenc не заработал вдруг: скачайте посвежее дистриб ffmpeg, поставьте CUDA и отсюда прогу запустите. У меня и без этих двух манипуляций ffmpeg прекрасно считал видео h264_nvenc на видеокарте с огромной скоростью, недостижимой и близко на центральном процессоре i9. Но точно знаю: CUDA стоит на компе давно и требуется практически во всех обзорах данного раздела Нейросети.

Иногда нужно сохранить в новом файле дату изменения файла-исходника. Это делается так:
powershell $(Get-Item new.mp4).lastwritetime=$(Get-Item old.mp4).lastwritetime
где файлу new.mp4 присваивается дата изменения файла old.mp4. Имена файлов или пути с пробелами заключайте в одиночные ' кавычки.

Эти несложные манипуляции позволят быстро приступить к основной теме раздела - обработке изображений в нейросетях на GPU. Записываю просто себе на память, чтобы потом долго не разыскивать.
Ответить

Вернуться в «Нейросети»