Оптимизировать скриптовые команды FFMPEG с ограничением использования процессора - PullRequest
0 голосов
/ 14 сентября 2018

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

Процесс:

У меня есть 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 Ответ

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...