Я пытаюсь использовать FFmpeg, чтобы разделить видео на основе некоторых start_time
и end_time
входов, и заменить их другими видеофайлами. Например, для ввода 10 15
мне нужно заменить EXACT секунд 10 to 15
на другое видео.
ХОРОШО. Что приходит мне в голову это:
- Сначала разделите видео (в данном случае 0-10, 10-15 и 15-конец)
- Заменить 10-15 другим видео
- Объединить все суб-видео обратно
Первый вопрос: это лучшее и самое быстрое решение? Есть ли у нас более простая команда или другие инструменты для замены определенного периода времени в видео другим видео?
Второй вопрос: если предположить, что FFmpeg является жизнеспособным решением, когда я просто использую команду ffmpeg -I input.video -ss 10 -t 5 -c copy output.mp4
, мой код обработки видео не может прочитать и обработать файл. Я использовал mediainfo
инструмент для сравнения двух файлов и заметил различия в размерах заголовков, в то время как все, что связано с видеокодеком, было одинаковым. Я заметил, что размер заголовка отличается, что, очевидно, вызывает проблему. Есть ли способы заставить размер заголовка также (кроме кодеков) быть одинаковыми?
ОБНОВЛЕНИЕ: Вот оригинальный .mp4
файл, который отлично работает в эмуляторе.
.mp4
файлом, если это необходимо.Ответы:
Использование
trim
иconcat
- исходные файлы с разными кодекамиДля этого убедитесь, что ваши отдельные файлы имеют одинаковое разрешение и в идеале одинаковую частоту кадров и частоту дискретизации и т. Д. Это предотвратит ошибки или сбои во время объединения.
Вы можете сделать все на одном дыхании , без разделения файла, используя
trim
иconcat
фильтры:Здесь
trim
используется для указания отдельных частей входных видеопотоков (0:v
,1:v
), которые вы позже хотите объединить. Эти части названы доv0
концаv2
. (setpts
Фильтр сбрасывает метки времени этих отдельных частей на 0, что требуется для объединения). Позже мы объединяем три части.Если вы хотите обрезать определенную временную метку до конца, используйте
trim=start=15
вместо указания диапазона.Если в ваших файлах есть аудио, вы должны обрезать эти потоки отдельно:
Обратите внимание, что видео и аудио будут перекодированы в этом случае - обязательно укажите соответствующие целевые показатели качества вывода (например,
-crf
для x264, x265 или libvpx-vp9). Вы можете прочитать больше об этом в FFmpeg Wiki, например, для VP9 или H.264 .Использование отдельных сегментов
Если вы хотите разделить клипы и позже собрать их:
Если файлы имеют аудио, используйте тот же подход, что и выше:
Это снова перекодирует видео поток. Это немного более просто, но в остальном должно быть эквивалентно вышеуказанному методу.
Использование
concat
demuxerВ принципе, вы также можете попытаться объединить битовые потоки без перекодирования, используя демультиплексор concat. Создайте файл с именем
concat.txt
и добавьте следующие записи (соответствующие созданным выше видеоклипам):Затем объедините эти отдельные файлы:
Это, однако, требует, чтобы ваши клипы имели одинаковый кодек, разрешение, частоту кадров и т. Д., Поэтому он не работает со всеми видами разнородных источников.
Используя
concat
протоколОписанный выше тип конкатенации на уровне файлов также может быть достигнут с использованием
concat
протокола с теми же ограничениями, что и выше (тот же кодек, разрешение и т. Д.):Для получения дополнительной информации о сцеплении, прочитайте соответствующую страницу FFmpeg Wiki .
источник
concat
метода выдает ошибку:[concat @ 00000000025c2560] Line 1: unknown keyword 'part1.mp4 \\ text.txt: Invalid data found when processing input
concat
демультиплексора синтаксис был другим. Исправлено сейчас. Чтобы перейти к концу, используйтеtrim=start=15
документацию фильтра обрезки: ffmpeg.org/ffmpeg-filters.html#trim - что касается вопросов синхронизации, это действительно зависит от вашего исходного материала. У вас не было проблем с конкатенацией с загруженным вами клипом.