Вырезание части файла .avi не является точным, если выходной файл указан как файл .avi (но если выходной файл указан как файл .mp4, то это так)

Вырезание части файла .avi не является точным, если выходной файл указан как файл .avi (но если выходной файл указан как файл .mp4, то это так)

Я пытаюсь вырезать часть.aviфайл с помощью команды

ffmpeg -ss 346 -i input.avi -t 5 -c copy -y output.avi

Общая длина выходного видео составляет около 13 секунд, что на 8 секунд больше, чем нужно. Но если расширение выходного файла указано как.mp4, то резка точная. Я хотел бы понять, почему это происходит.

Любая помощь будет оценена по достоинству.

решение1

AVI и MP4 — это контейнеры для потоков данных, причем MP4 гораздо более функционален.

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

Например, предположим, что вы хотите скопировать из исходного видео 346-351 секунды (что, судя по всему, вы и делаете). Если ближайший ключевой кадр до 346-й секунды находится на 338-й секунде, то ffmpeg фактически копирует видео, начиная с 338-й секунды, но использует магию списка редактирования MP4, чтобы сообщить медиаплеерам о необходимости пропустить первые 8 секунд.

Та же логикамощьтакже применяется к концу разреза (не уверен, нужно будет проверить). Если это так, список редактирования также сообщит медиаплеерам прекратить воспроизведение раньше.

AVI не поддерживает списки редактирования, как MP4, поэтому в контейнере AVI вы увидите полную 13-секундную версию.

Надеюсь, это понятно. Если у вас есть вопросы, оставляйте комментарии, и я постараюсь прояснить ситуацию.

РедактироватьЯ создал диаграмму, чтобы попытаться наглядно показать, что делает ffmpeg:

Как ffmpeg делает нарезку, когда вы не перекодируете

Связанный контент