MusicMan_08
@MusicMan_08

Как сделать scale на GPU?

Собираю мозаику через FFMPEG:

ffmpeg -hide_banner -loglevel warning \
-hwaccel cuvid -f libndi_newtek -thread_queue_size 2048 -i 'SERVER (1)' \
-hwaccel cuvid -f libndi_newtek -thread_queue_size 2048 -i 'SERVER (2)' \
-hwaccel cuvid -f libndi_newtek -thread_queue_size 2048 -ss 00:00:14 -i 'SERVER (3)' \
-hwaccel cuvid -f libndi_newtek -thread_queue_size 2048 -ss 00:00:12 -i 'STREAM (1)' \
-hwaccel cuvid -f libndi_newtek -thread_queue_size 2048 -ss 00:00:08 -i 'STREAM (2)' \
-hwaccel cuvid -f libndi_newtek -thread_queue_size 2048 -ss 00:00:04 -i 'TEST-SERVER (Desktop)' \
-filter_complex "
        nullsrc=size=1920x1080 [base];
        [0:v] scale=640x540 [upperleft];
        [1:v] scale=640x540 [uppercenter];
        [2:v] scale=640x540 [upperright];
        [3:v] scale=640x540 [lowerleft];
        [4:v] scale=640x540 [lowercenter];
        [5:v] scale=640x540 [lowerright];
        [base][upperleft] overlay=shortest=1 [tmp1];
        [tmp1][uppercenter] overlay=shortest=1:x=640 [tmp2];
        [tmp2][upperright] overlay=shortest=1:x=1280 [tmp3];
        [tmp3][lowerleft] overlay=shortest=1:y=540 [tmp4];
        [tmp4][lowercenter] overlay=shortest=1:x=640:y=540 [tmp5];
        [tmp5][lowerright] overlay=shortest=1:x=1280:y=540 \
" -c:v h264_nvenc -pix_fmt yuv420p -preset llhp -an -f nut - | ffmpeg -hide_banner -loglevel warning -i - -f decklink -pix_fmt uyvy422 -rtbufsize 1500M -an -r 25000/1000 'DeckLink Quad (3)' &


Не смотря на то, что пытаюсь использовать nvenc для кодирования потока, все равно получаю приличную загрузку процессора. При этом загрузка NVIDIA всего около 40%. Хочу оптимизировать скрипт, чтобы по максимуму все отрабатывало на NVIDIA. Поэтому хотел бы спросить, как сделать scale в этом скрипте на NVIDIA (ffmpeg собран с опцией --enable-libnpp)? Применить "железный" scale (тупо пишу вместо scale - scale_npp) не получается, скрипт валится с ошибками. Подскажите, возможно реализовать то, что я хочу?

И второй вопрос:
вот в этой части скрипта:
-hwaccel cuvid -f libndi_newtek -thread_queue_size 2048 -ss 00:00:14 -i 'SERVER (3)' \
-hwaccel cuvid -f libndi_newtek -thread_queue_size 2048 -ss 00:00:12 -i 'STREAM (1)' \
-hwaccel cuvid -f libndi_newtek -thread_queue_size 2048 -ss 00:00:08 -i 'STREAM (2)' \
-hwaccel cuvid -f libndi_newtek -thread_queue_size 2048 -ss 00:00:04 -i 'TEST-SERVER (Desktop)' \

я использую опцию -ss {time}, потому что, пока потоки подгрузятся, появляется ощутимая задержка, причем пропорциональная. Минимальная задержка у последнего input, у предпоследнего она ощутимо больше и тд, а у первого максимальная задержка. Опция -ss {time} частично решает эту проблему, но это работает нестабильно. Чуть-чуть дольше прогружается поток и задержка увеличивается. Можно ли как-то сообщить ffmpeg, чтобы данные брались не из кеша, а как-бы live?
  • Вопрос задан
  • 306 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы