Как использовать процесс FFMPEG с несколькими графическими процессорами


I have a problem and cant find any suitable answer for it.
Its about use multi GPU proccess.
I have 3 graphic card and you could see it :

[![enter image description here][1]][1]

если изображение не загружено, используйте эту ссылку на изображение: https://i.stack.imgur.com/msR83.jpg введите здесь описание ссылки


My problem is: when i run more than one ffmpeg command with cuda all process assigned to first GPU.
like below image:

[![enter image description here][2]][2]

если изображение не загружено, используйте эту ссылку на изображение: https://i.stack.imgur.com/PfYfz.jpg

Понимаете? все 6 процессов назначены первому графическому процессору.
Я действительно запутался, как я мог это исправить.

мой код FFMPEG:

ffmpeg -y -vsync 0 -hwaccel cuda -hwaccel_output_format cuda -i my-video.mp4 \
  -vf scale_npp=w=426:h=240 -c:v h264_nvenc -profile:v main -b:v 400k -sc_threshold 0 -g 25 \
  -c:a aac -b:a 64k -ar 48000 \
  -f hls -hls_time 6 -hls_playlist_type vod \
  -hls_allow_cache 1 -hls_key_info_file encription.keyinfo \
  -hls_segment_filename f-0-seg-%d.ts f-0.m3u8

Я запускаю лучший код FFMPEG для 6 разных видео одновременно.
пожалуйста, помогите найти ответ. поделившись своими знаниями или некоторыми ссылками, которые могли бы мне помочь.
Большое спасибо.


person R.A.M    schedule 31.01.2021    source источник


Ответы (1)


Судя по тому, что я могу сказать, процесс кажется довольно простым: https://developer.nvidia.com/blog/nvidia-ffmpeg-transcoding-guide/

Работа по кодированию и декодированию должна быть явно назначена графическому процессору при использовании нескольких графических процессоров в одной системе. Графические процессоры идентифицируются по их порядковому номеру; по умолчанию вся работа выполняется на графическом процессоре с индексом 0. Используйте следующую команду, чтобы получить список всех графических процессоров NVIDIA в системе и их соответствующие идентификационные номера:

ffmpeg -vsync 0 -i input.mp4 -c:v h264_nvenc -gpu list -f null –

Как только вы узнаете индекс, флаг индекса -hwaccel_device можно использовать для установки активного графического процессора для декодирования и кодирования. В примере ниже работа будет выполняться на GPU с индексом 1.

ffmpeg -vsync 0 -hwaccel cuvid -hwaccel_device 1 -c:v h264_cuvid -i input.mp4 -c:a copy -c:v h264_nvenc -b:v 5M output.mp4
person geebert    schedule 31.01.2021
comment
я читал это раньше. спасибо, что поделились. но есть ли у вас мнение, что я могу использовать все три моих графических процессора? это говорит нам, что мы можем просто использовать один из них. '-hwaccel_device 0' или '-hwaccel_device 1' или '-hwaccel_device 2'. но мне нужно использовать все три. - person R.A.M; 01.02.2021
comment
нельзя просто выполнить один и тот же код для разных файлов? ffmpeg -vsync 0 -hwaccel cuvid -hwaccel_device 1 file1.mp4 ... , затем ffmpeg -vsync 0 -hwaccel cuvid -hwaccel_device 2 file2.mp4 ... - person geebert; 01.02.2021
comment
но, может быть, я неправильно понял, что вы пытаетесь сделать... - person geebert; 01.02.2021
comment
Нет, ты понимаешь мою проблему. и ваше мнение это один из способов решения этой проблемы. но я ищу один ответ, который автоматически делает это. я думаю, что это должен быть способ сказать ffmpeg или cuda сделать это для нас. что они автоматически распределяют нагрузку между этими тремя графическими процессорами. - person R.A.M; 01.02.2021
comment
Я думаю, что ответ в работе должен быть явно назначен графическому процессору при использовании нескольких графических процессоров в одной системе. Это кажется невозможным, но вы можете написать сценарий bash или python, который просматривает все файлы в папке, назначает индекс и выполняет указанную выше команду с параметром -hwaccel_device fileindex%numberofGPU. - person geebert; 01.02.2021
comment
В порядке. спасибо за хорошее мнение. если найдете лучший способ, скажите мне. Спасибо и удачи - person R.A.M; 01.02.2021