LINUX.ORG.RU

FFmpeg - как соединить видео и звук концами?

 


0

1

Здравствуйте. Кто знает как с помощью FFmpeg соединить видео и звук концами? Например, есть видео и аудио разной длины, и если просто написать ffmpeg -i video.mp4 -i audio.aac - c copy video_i_audio.mp4, то по умолчанию ffmpeg их соединяет началами и тогда есть смещение звука. А если соединить их с концов, то всё норм. И таких файлов много, и они отличаются по длительности на разное количество секунд. Команду itsoffset тут не применить, ведь там нужно указывать конкретное количество секунд каждый раз.

ведь там нужно указывать конкретное количество секунд каждый раз.

Посчитай длинк аудио и видео, вычти. Это оффсет. Не?!

aol ★★★★★
()
Ответ на: комментарий от xradio

Спасибо за ответы. Но в моём случае это не помогает. Я скачиваю отдельно видео, отдельно аудио, и дальше нужно соединить их. Скорость аудио и видео менять не нужно. А чтобы использовать -itsoffset , нужно определить какое отставание звука от видео (или наоборот). Я это могу определить в видеоредакторе, например в Адоб Премьере, но тогда зачем мне ffmpeg? Я и в Премьере могу соединить их. Но дело в том, что всегда звук и видео при соединении концами отлично совпадают друг с другом (т.е. речь человека и его губы двигаются синхронно), какая бы разница между ними не была. Причём такой момент – чем больше длительность у этих видео и аудио, которые нужно соединить, тем и смещение одного относительно другого больше. Т.е. это не какое-то постоянное значение, а разное. И всегда (я это заметил), если их соединять концами, то получается как положено. Вот скриншот для ясности: https://drive.google.com/file/d/1FJx36bufaJsWTA6ER1NSVdQdJ5wlfGi4/view?usp=sharing Такую функцию в ffmpeg я не нашёл.

Arkhimed86
() автор топика

Невразумительно описал задачу.
Чтобы звук ввести в синхрон, нужно:
-i видео -i звук -c:v copy -c:a -af adelay=, atempo=
Первым фильтром подгоняешь начало синхрона, затем, если конец остаётся рассинхронизированным, подгоняешь вторым фильтром.
atempo>1, если конец звука отстаёт, atempo<1, если опережает.

xradio
()

cat video.mp4 audio.aac > video_i_audio.mp4

З.Ы:

Как в хекс редакторе отрезать заголовки из второго файла и исправить в первом, чтобы это реально сработало — смотрите в следующей серии.

deep-purple ★★★★★
()
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от xradio

Только это надо писать так: ffmpeg -i v.mp4 -i a_mono.aac -c:v copy -af adelay=6000,atempo=1 va_delay_6000.mp4

  1. -c:a писать не нужно.
  2. После запятой пробел не ставить. Иначе выдаёт ошибку.

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

Задача стоит такая: Дано: Есть 2 видео и 2 аудио. Видео1 – 10 секунд, видео2 – 20 секунд, аудио1 – 11 секунд, аудио2 – 22 секунды. Найти: Существует ли универсальная одна команда ffmpeg, чтобы соединить видео1 с аудио1, а видео2 с аудио2 – так, чтобы концы их совпали, а лишние части либо были обрезаны, либо чтобы шёл черный кадр? Рисунок задачи https://drive.google.com/file/d/1ksMZzxC6fcjvi-YuSi2SMY9698zZG6km/view?usp=sharing

Arkhimed86
() автор топика
Ответ на: комментарий от Arkhimed86

Тебе написали решение.

Тебе нужно найти длину аудио, длину видео, вычесть из длины видео длину аудио и получить оффсет.

Тоже самое делает твой платный или ворованный адобе примьер.

Тебе нужно найти команды которые позволят тебе получить длины, потом посчитать разность, поместить ее в переменную и далее вызывать ffmpeg с указанием параметра смещение аудио из этой переменной.

Это простой алгоритм, ты справишься.

Повторяю ещё раз ровно этот же алгоритм делает премьер.

Искать за тебя команды которыми ты можешь узнать длину аудио или видео файла я не буду.

Поищи сам, потрудись.

А потом напиши скрипт.

Он будет содержать всего 4 строки:

  • получить длину видео;
  • получить длину аудио;
  • посчитать разность;
  • объединить аудио и видео с учётом смещения.

Все, это проще простого.

Возможно ты спросишь почему я думаю, что этот алгоритм делает премьер?

А потому, что кодирование аудио или видео может идти только с начала в конец.

В частности относительно видео для применения сжатия каждый последующий кадр это наложение на предыдущий кадр некоторой разности и получение следующего кадра.

Вот и получается, что премьер точно так же читает файлы с начала в конец.

А для того чтобы знать с какого места в результирующий контейнер вместе с видео потоком начать передавать аудио поток он в начале определяет длины потоков и получает их разность.

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

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)
Ответ на: комментарий от VenturiTube

Мнение пользователей - не лучший критерий! Зачем квадратные колёса консоли? МедиаИнфа - всеосийная автономная прога. Шмёшь видео - получаешь всю его инфу.

xradio
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.