Вырезать часть звуковой дорожки в файле MP4

494

У меня есть файл .MP4 с одной видео-дорожкой (H.264, 25 FPS) и одной звуковой дорожкой (MP2). Общая продолжительность ~ 2: 52 (два часа, 52 минуты). Я заметил, что A / V является синхронным до ~ 2: 34, но асинхронным после, то есть аудио задерживается ~ 0,3 с.

Мой план состоял в том, чтобы

  1. Извлеките звуковую дорожку в .MP2
  2. Отрежьте 0,3 с (используя mp3directCut, который отлично работает)
  3. Смешайте видео дорожку и обрезанную звуковую дорожку.

Готово. Тем не менее, результат не был удовлетворительным, потому что аудио / видео было не синхронизировано с самого начала видео. Я внимательно посмотрел на исходный файл и сбросил метки времени. Наименьшее PTS видео дорожки составляет 0,16 с, и все PTS увеличиваются на 0,04 без какого-либо промежутка. Наименьшее значение PTS звуковой дорожки составляет 0,212 с, а большинство значений PTS увеличиваются на 24 мс (нормально для MP2), но немногие различия меньше или больше 24 мс (что нормально, но, очевидно, проблема при извлечении дорожки, см. Вопрос ниже)

Мои вопросы: теряю ли я метки времени при извлечении в MP2? Тогда мой первоначальный план обречен. Каким другим способом можно вырезать небольшую часть звуковой дорожки внутри файла MP4? Без перекодирования аудио, конечно. Я знаком с FFmpeg и AviDemux.

3

2 ответа на вопрос

1
Gyan

Потеряю ли я метки времени при извлечении в MP2?

Да. .mp2/.mp3не имеет временных отметок.

Каким другим способом можно вырезать небольшую часть звуковой дорожки внутри файла MP4?

Любой контейнер с метками времени, который поддерживает MP2, т.е. MPEG-TS, MP4 / MOV, MKV. Там могут быть другие.


Попробуйте демоверсию concat,

ffmpeg -i in.mp4 -f concat -i audio.txt -map 0:v -map 1:a -c copy out.mp4 

где audio.txtнаходится

file in.mp4 outpoint 2:34:00 file in.mp4 inpoint 2:34:00.30 
О, почему я не подумал об этом? Возможно, потому, что я ожидал, что он обрежет часть трека, но сохранит временные метки, что приведет к разрыву звука в 0,3 с, а остальное в его старом местоположении. Я попробовал ваше предложение и получил пару таких сообщений: `Немонотонный DTS в потоке вывода 0: 1; ...... Это может привести к неправильным временным меткам в выходном файле. Я сбросил временные метки нового файла и проанализировал их: что касается звуковой дорожки, несколько значений PTS теперь равны. Поскольку здесь очень ограничено пространство для комментариев, это все пока; Я анализирую и вернусь. ТИА. 6 лет назад 0
На самом деле FFmpeg увеличивает значение PTS на 1, что означает 1/48 000 с, но, поскольку выгруженные значения форматируются с разрешением 1 мс, я _thought_, они были равны. Зная это, я продолжу с необоснованными ценностями сейчас и могу продолжать по-другому. Я вернусь.... 6 лет назад 0
Является ли результирующий A / V синхронизированным? Gyan 6 лет назад 0
Мульвя, только 1-я часть перед разрезом синхронизирована. Вот почему я все еще анализирую. Статус-кво: временные метки 2-й части (после вырезки) сдвигаются на -2,589 с. Следовательно, существуют перекрывающиеся значения PTS и появляются сообщения «Немонотонный DTS». Я сейчас пытаюсь выяснить почему на -2,589 с. (Может быть, я даже посмотрю на источник ffmpeg.) Я сообщу о своем результате, как только у меня будет больше информации. Спасибо. 6 лет назад 0
Попробуйте извлечь только часть после вырезки: `ffmpeg -i in.mp4 -c copy -vn -ss X out.m4a`, где X составляет около 2: 34: 0,3. Как только у вас будет правильная начальная точка. Замените новым файлом в concat (удалив директиву inpoint). Gyan 6 лет назад 0
Я понимаю ваш подход, но у меня уже была та же идея извлечь часть после вырезки и я получил сообщение об ошибке `[ipod @ 0000026d666b4f40] Тег mp4a несовместим с идентификатором выходного кодека 86017 ([0] [0] [0] [0 ]) `На этот раз я добавил` -f mp4`, и это сработало. Метки времени в результирующем файле начинаются с нуля. Хорошо. Тем не менее, после конкатенации, постобрезная часть - просто тишина. По размеру файла видно, что эта звуковая часть отсутствует. Подтверждается сбросом меток времени. Пробовал FFmpeg стабильно и ночью. Пожалуйста, дайте мне больше времени, чтобы попробовать. Еще раз спасибо. 6 лет назад 0
0

Решение было:

  1. Извлеките первую часть звуковой дорожки в part1.mp4
  2. Извлеките вторую часть звуковой дорожки в part2.mp4
  3. Concat part1.mp4 и part2.mp4 для завершения.mp4
  4. Mux видео из оригинального файла и аудио из complete.mp4

Смотрите комментарии выше от @Mulvya для конкретных команд FFmpeg. Еще раз спасибо ему / ей за поддержку.