Объедините файлы mkv, сохраняя исходную временную карту с пробелами.

16 дней назад у меня возникла эта проблема: объединение файлов mka с сохранением метки времени которую я исправил с помощью amix, задержку с помощью start_pts из ffprobe.

Сегодня у меня новый вызов, подобный этому, но с видео.

Итак, у меня есть куча mkv видео. Каждый раз, когда человек присоединяется к чату, записывается mkv, но если человек обновляет страницу, создается новый mkv с start_pts и start_time, как на самом деле. Кроме того, если собрание началось и человек присоединяется через минуту, для параметра start_time устанавливается значение 1 минута. Мне нужно объединить все эти mkv и заполнить их пустым экраном, когда нет канала.

Как и в приведенном выше примере, если человек присоединяется через минуту, первая минута — это пустой экран. Также, если участник уходит и снова присоединяется через 10 секунд, эти 10 секунд снова пусты.

Есть идеи, как это сделать с помощью ffmpeg?

Конкретный пример файлов:

0PA84c5c3f412769b311d44b159941b2d22.mkv - start_pts: 742 start_time: 0.742000
2PA73d94e8cb0f41c3002fadd6c04b4a88f.mkv - start_pts: 30761 start_time: 30.761000
3PAcd35e470325618fa8a3fb8bb5a41403e.mkv - start_pts: 50940 start_time: 50.940000
4PAddccde7b8847ecc43d5e8643b7903dba.mkv - start_pts: 69243 start_time: 69.243000

Конечным файлом будет файл длиной 69,243000, первые 0,742 секунды пустые, а промежутки между ними также должны быть пустыми.

До сих пор я пробовал:

ffmpeg -i 0PA84c5c3f412769b311d44b159941b2d22.mkv -i 2PA73d94e8cb0f41c3002fadd6c04b4a88f.mkv -i 3PAcd35e470325618fa8a3fb8bb5a41403e.mkv -i 4PAddccde7b8847ecc43d5e8643b7903dba.mkv -filter_complex "[0:v] [1:v] [2:v] [3:v] concat=n=4:v=1 [v]" -map "[v]" test.mkv

Это работает, но без тех пробелов, которые я упомянул.


person Filip    schedule 13.08.2020    source источник


Ответы (1)


Вы можете получить длину файлов с помощью ffprobe и рассчитать длину промежутков. Затем создайте эти промежутки с помощью фильтра color и объедините их между видео.

Вот команда:

ffmpeg -i 1.mkv -i 2.mkv -i 3.mkv -filter_complex"\
color=s=1280x720,trim=0:0.742[gap0];\
color=s=1208x720,trim=0:5[gap1];\
color=s=1208x720,trim=0:2[gap2];\
[gap0][0:v][gap1][1:v][gap2][2:v]concat=6:v=1 [v]"\
-map [v] out.mkv
person Dirk V    schedule 13.08.2020
comment
хм, это может сработать. сейчас попробую поиграть. Также вы знаете, как я могу изменить размер всех видео до самого маленького с помощью concat? Например, если пользователь меняет веб-камеру и имеет другое разрешение, concat жалуется на это. Моя идея: прокрутить все видео, получить наименьшее разрешение из всех, тогда все объединенные видео должны иметь это разрешение. - person Filip; 13.08.2020
comment
Что вы можете сделать, используя фильтр scale, чтобы изменить размер всех видео. Вы можете поместить их в поле, например, так: [0:v]scale=w='if(gt(iw/ih,${w}/${h}),${w},-2)':h='if(gt(iw/ih,${w}/${h}),-2,${h})':eval=init[out] с ${w} ${h} вашим выводом и высотой. Таким образом, не имеет значения, какое у них разрешение, они будут масштабироваться и сохранять свое соотношение. - person Dirk V; 13.08.2020
comment
Тогда вам, вероятно, также понадобится pad, чтобы заполнить пустое пространство, и точный вывод - person Dirk V; 13.08.2020
comment
Вы также можете использовать ffprobe, чтобы заранее получить размеры видео. - person Dirk V; 14.08.2020