Приветствую других пользователей 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 и т. Д.
Спасибо, что нашли времячитая наш выпуск.Мы уверены, что вы можете помочь нам сузить его.Пожалуйста, не стесняйтесь спрашивать любую дополнительную информацию или описания, если это необходимо.
Хорошего дня!