Trim Overlay проблема с памятью - PullRequest
0 голосов

Приветствую других пользователей FFmpeg,

Мы испытываем странную ошибку памяти (или, возможно, просто делаем что-то действительно неправильное), и нам нужны некоторые указания о том, какотладка.

Чего мы пытаемся достичь:

Обработка записи конференции, которая включает в себя несколько пользовательских потоков, каждый в своем отдельном файле (все файлы - mp4 /опус).

  • Создание динамической сцены из набора записей на основе уровня их громкости в заданный момент времени.
  • Сцена должна состоять из двух частей: меньшая сетка всех видео участников, большая сетка говорящих в данный момент людей.Что-то вроде Google Hangouts или Skype делает в своих приложениях.

Что пошло не так:

  • Объем памяти начал неожиданно возрастать по какой-то причине во время монтажа

Что мы используем:

Первая Команда FFmpeg, которая читает filter_complex_script из файла и добавляет drawbox какговорящая индикация в каждом файле источника видео, когда его громкость превышает установленный порог.

Second Команда FFmpeg, которая считывает filter_complex_script из файла и:

  • принимает входной файл (используя 0: v),
  • обрезает часть его, когда пользователь говорил,
  • масштабируется это в соответствии с количеством одновременно говорящих пользователей,
  • пэдов до этого разрешения (в случае, если пользовательское видео меньше)

filter_complex команда с помощью SELECT:

[0]select='between(t, 1, 2)',  scale=762:428:force_original_aspect_ratio=decrease,pad=763:429:(ow-iw)/2:(oh-ih)/2[stream-0-workspace-scale-1-1];

[block-2-grid][stream-0-workspace-scale-1-1]
overlay=repeatlast=1:shortest=0:x=10:y=316:enable='between(t, 1, 2)'
[block-2-workspace-1]; 

fiКоманда lter_complex с использованием TRIM:

[input-file-tag] 
trim=start=#{start}:duration=#{duration},
setpts=PTS-STARTPTS,
scale=#{w-1}:#{h-1}:force_original_aspect_ratio=decrease,
pad=#{w}:#{h}:(ow-iw)/2:(oh-ih)/2
[input-file-trimmed];

[previous-block-tag] 
overlay=repeatlast=1:shortest=0:x=#{x}:y=#{y}:enable='between(t, #{from}, #{to})'
[next-block-tag]

Мы пробовали идти по команде TRIM, пробовали команду SELECT.Проблема в том, что оба принимают безумные баранов во время выполнения.

Примеры и более подробное описание:

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

  • Мы пытаемся отображать только их в соответствии с некоторой математикой наложения.

  • Обрезанные команды в удобочитаемой форме: https://pastebin.com/YwrnRgnA

  • Полная команда FFmpeg слишком длинна для чтения, поэтому мы начали использовать filter_complex_script и загружать ее из файла

  • Иногда один блок видеоконференции может иметь до 300+ промежуточных оверлеев, что приводит к описанной проблеме с памятью.Мы ожидали, что объем памяти будет примерно равен количеству входных файлов или, может быть, в два-три раза выше.Однако при первых двух минутах монтажа мы достигаем 15 ГБ или ОЗУ, а входные файлы не превышают 200 МБ.

Что мы сделали с точки зрения отладки:

  • Сначала мы использовали split, но быстро выяснили, что split фактически копирует каждый вход и загружает его в память, поэтому нам пришлось отказаться от этого подхода.

  • На самом деле мы перешли к использованию самих входных файлов, поэтому проблема кроется в другом месте.

  • Для пояснения мы разделили наш ffmpegКоманда на две отдельные.Сначала накладывается анимация говорящего блока с использованием drawbox, а также аватара и имени пользователя.Он выводит новые видеофайлы, которые мы затем используем в команде, описанной выше, как теги прямого ввода файлов, например 0: v, 1: v и т. Д.

Спасибо, что нашли времячитая наш выпуск.Мы уверены, что вы можете помочь нам сузить его.Пожалуйста, не стесняйтесь спрашивать любую дополнительную информацию или описания, если это необходимо.

Хорошего дня!

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