Оптимизировать скриптовые команды FFMPEG с ограничением использования процессора

Я работаю над аудио / видео загрузкой и потоковым проектом.

Процесс:

У меня есть 2 аудиофайла и видеофайл, который я обрабатываю с помощью FFMPEG. Мне нужно обработать эти аудио и видео файлы следующим образом:

  1. Генерация миниатюры из видео файла.

  2. Слияние аудио файлов друг с другом.

  3. затем слияние смешанного аудиофайла с видеофайлом.

  4. После этого добавляем водяной знак поверх видеофайла.

  5. наконец, разбивает видеофайл на небольшие куски для потоковой передачи

ВОПРОС:

Все работает нормально, но проблема в том, что весь этот процесс требует очень больших ресурсов процессора и времени для завершения. Есть ли в любом случае оптимизировать команды FFMPEG для быстрого запуска. Прямо сейчас, это очень медленно!

КОД:

Я создал bat-файл для завершения вышеупомянутого процесса. Ниже приведен источник командного файла, который выполняется на сервере nodejs.

@echo off

echo "########################################### Uploading Video #############################################"

:GETOPTS
 if /I %~1 == --app-path set APP_PATH=%2& shift
 if /I %~1 == --video-name set VIDEO_NAME=%2& shift
 if /I %~1 == --do-merge set IS_DO_MERGE=%2& shift
 if /I %~1 == --audio-name set AUDIO_NAME=%2& shift
 if /I %~1 == --bg-beat-name set BEAT_NAME=%2& shift
 shift
if not (%1)==() goto GETOPTS

set USER_DIR=%APP_PATH%data\content\userContent\
set BEAT_FILE_URI=%APP_PATH%data\content\beats\%BEAT_NAME%
set FFMPEG=%APP_PATH%data\cmd\ffmpeg\bin\ffmpeg.exe
set VIDEO_PATH=%USER_DIR%%VIDEO_NAME%
set MERGED_AUDIO_PATH=%VIDEO_PATH%_mix_audio.aac
set RESULTANT_PATH=%VIDEO_PATH%_finalized.mp4
set WATER_MARKED_PATH=%VIDEO_PATH%_finalized_watermark.mp4

echo "Taking screenshot - %VIDEO_PATH%"
%FFMPEG% -threads 3 -loglevel panic -y -ss 00:00:01 -i %VIDEO_PATH% -vframes 1 -filter:v scale="500:-1" %VIDEO_PATH%_screenshot.jpg
if "%IS_DO_MERGE%" == "true" (

  echo "Combining audio with music file"
  echo "OUTPUT: %MERGED_AUDIO_PATH%"
  %FFMPEG% -threads 3 -loglevel panic -y -i %USER_DIR%%AUDIO_NAME% -i %BEAT_FILE_URI% -filter_complex amix=inputs=2:duration=shortest:dropout_transition=3 -shortest %MERGED_AUDIO_PATH%

  echo "Merging Audio & video"
  %FFMPEG% -threads 3 -loglevel panic -y -i %VIDEO_PATH% -i %MERGED_AUDIO_PATH% -c:v libx264 -preset ultrafast -crf 22 -tune zerolatency -c:a aac -strict experimental -map 0:v:0 -map 1:a:0 -shortest %RESULTANT_PATH%

  echo "Adding watermark"
  %FFMPEG% -threads 3 -loglevel panic -y -i %RESULTANT_PATH% -i %APP_PATH%data\assets\watermark.png -filter_complex "overlay=x=(main_w-overlay_w)/2:y=30" -movflags +faststart %WATER_MARKED_PATH%

  #ffmpeg -i input.mp4 -profile:v baseline -level 3.0 -s 640x360 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls index.m3u8

  #%FFMPEG% -threads 3 -loglevel panic -y -i %WATER_MARKED_PATH% -i %APP_PATH%data\assets\watermark.png -filter_complex "overlay=x=(main_w-overlay_w)/2:y=30" %WATER_MARKED_PATH%

  echo "--------------------------------- process completed with no errors ----------------------------------"

) else (
  echo "No need to merge as --do-merge is false"

  echo "Adding watermark"
  %FFMPEG% -threads 3 -loglevel panic -y -i %VIDEO_PATH% -i %APP_PATH%data\assets\watermark.png -filter_complex "overlay=x=(main_w-overlay_w)/2:y=30" %WATER_MARKED_PATH%
)
echo "######################################  Uploading Video Ended  ##########################################"

1 ответ

  1. Вы можете установить -threads параметр до 1: если у вас 4 ядра, настройка -threads 1 следует ограничить процесс FFMPEG примерно до 25% ЦП, что также ограничит использование диска. Использование 3/4 ядер - это много.

  2. Конверсии должны быть поставлены в очередь (запускать другие только после предыдущих завершений). Одновременное выполнение нескольких преобразований может значительно повлиять на производительность диска, что может стать общим узким местом для производительности.

  3. Вы можете выполнять несколько операций в одном процессе (считывать входы один раз - аудио, видео, водяные знаки и генерировать несколько выходов одновременно), чтобы сократить общее время обработки (но это требует более высоких требований к памяти).

Вы можете бесплатно скачать готовый плагин для сайта с открытым исходным кодом Video Share VOD, который включает в себя код для управления конверсиями, в том числе множество опций для постановки в очередь и создания нескольких выходов в одном или разных процессах, добавления водяных знаков, генерации сегментов HLS.

Другие вопросы по тегам