Я пытаюсь вырезать часть.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: