LINUX.ORG.RU

ffmpeg съезжает звук относительно видео

 


0

1

Доброго времени суток!

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

Склеиваю через ffmpeg -f concat без пересжатия (-c copy)

Если использовать только файлы, описанные выше - проблем нет.

Если же в ряд встроить файл из другого источника (созданный другой программой) - после него начинается рассинхронизация аудио и видео.

Вот пример информации о трех файлах:

ffmpeg -i file1.mp4
  Duration: 00:00:07.07, start: 0.000000, bitrate: 250 kb/s
  Stream #0:0[0x1](eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 640x480 [SAR 1:1 DAR 4:3], 112 kb/s, 14.01 fps, 14.01 tbr, 10k tbn (default)
  Stream #0:1[0x2](eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 132 kb/s (default)

ffmpeg -i file2.mp4
  Duration: 00:00:17.33, start: 0.000000, bitrate: 1486 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 640x480 [SAR 1:1 DAR 4:3], 1349 kb/s, 14.25 fps, 15 tbr, 15360 tbn (default)
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 131 kb/s (default)

ffmpeg -i file3.mp4
  Duration: 00:00:17.02, start: 0.000000, bitrate: 842 kb/s
  Stream #0:0[0x1](eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 640x480 [SAR 1:1 DAR 4:3], 706 kb/s, 14 fps, 14 tbr, 14336 tbn (default)
  Stream #0:1[0x2](eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo,fltp, 131 kb/s (default)

Второй создан ffmpeg, первый и третий - другой программой. По окончании первого файла звук из второго начинается раньше видео, где-то на секунду. При некоторых параметрах сжатия и видеодорожка как будто замедляется. Независимо от того, что я задаю: -c copy либо -r 14 -c:v libx264 -c:a aac -ar 44100 -ac 2 -b:a 128k. Кажется, проблема не с кодеком: если клеить (concat, copy) файлы с разными кодеками - видео с кодеком первого файла отображается нормально, остальные поврежденные (стоп кадр или мигания - это закономерно. Если бы незначительное отличие частоты кадров влияло - оно бы ликвидировалось второй командой (пересжатие с -r 14)

Как побороть?

Для экономии места, смартфоны пишут видео с переменным FPS и это потом может вот таким образом сказываться. Попробуй с перекодированием и постоянным FPS сконкатенировать.

Ещё были какие-то опции, вроде «sync to audio» или «genpts», которые помогали с рассинхроном звука.

Посмотри в этой теме, может быть: https://stackoverflow.com/questions/35416110/ffmpeg-concat-video-and-audio-out-of-sync

stabilitron
()
Ответ на: комментарий от yandrey

Думал над этим. У меня первый кусок состоял из отдельного видео и 2 аудио дорожек разной длины с наложением, особо умная программа могла бы сделать аудио дорожку короче чем видео. Когда я уже выявил проблему - взял готовое video1, кинул в редактор на видео дорожку, кинул музыку на аудио дорожку, обрезал музыку по длине видео и сохранил в том же формате. То есть чтобы гарантированно длины совпадали. Проблема не исчезла.

Dima_228
() автор топика
Ответ на: комментарий от Anoxemian
Filtergraph 'fps=24' was specified, but codec copy was selected. Filtering and streamcopy cannot be used together.

С copy не проканало. Делаю так:

ffmpeg -f concat -safe 0 -i video.txt -r 14 -c:v libx264 -vf "fps=14" -c:a aac -ar 44100 -ac 2 -b:a 128k vf.mp4

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

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

Убрал. Ничего не изменилось. На 24й секунде видео проигрывается звук 34й секунды - сдвижка на 10. Второе видео «замедленное». Первое и третье, кажется, на реальной скорости.

Впихнул в текстовый файл первым номером dummy.mp4 (длительностью доля секунды, сделанный так же как 2й файл - в ffmpeg вырезкой от и до). На той же 34й секунде сдвижка около секунды (звук всё ещё раньше), визуально замедления 2го видео не заметно, но звук 2го видео начинается еще на последних кадрах 1го - заметно.

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

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

Кажется, проблему решил.

Сначала с помощью -vf «fps=14» выравнивается FPS всех частей, к сожалению это занимает время, но после этого простой вызов

ffmpeg -f concat -i video.txt -c copy video.mp4

(отрабатывает за секунду) уже не корявит дорожки. Проблема была с разным FPS (14 против 14.25). По какой причине -vf «fps=14» не срабатывает уже в процессе объединения (чтобы не запускать дважды) - неизвестно.

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