Я пытаюсь удалить несколько разделов видео с помощью FFmpeg.
Например, представьте, если вы записали шоу по телевидению и хотели вырезать рекламу. Это просто с графическим редактором GUI; Вы просто отмечаете начало и конец каждого клипа, который хотите удалить, и выбираете удалить. Я пытаюсь сделать то же самое из командной строки с FFmpeg.
Я знаю, как вырезать один сегмент для нового видео, например, так:
ffmpeg -i input.avi -ss 00:00:20 -t 00:00:05 -map 0 -codec copy output.avi
Это обрезает пятисекундный клип и сохраняет его как новый видеофайл, но как я могу сделать обратное и сохранить все видео без указанного клипа, и как я могу указать несколько клипов, которые нужно удалить?
Например, если мое видео может быть представлено ABCDEFG, я хотел бы создать новое, которое будет состоять из ACDFG.
ffmpeg
video-editing
mp4
Matias
источник
источник
Ответы:
Ну, вы все еще можете использовать
trim
фильтр для этого. Вот пример, давайте предположим, что вы хотите вырезать сегменты 30-40 секунд (10 секунд) и 50-80 секунд (30 секунд):Что я здесь сделал? Я обрезал сначала 30 секунд, 40-50 секунд и 80 секунд до конца, а затем объединил их в поток
out1
сconcat
фильтром.Об установках: нам это нужно, потому что обрезка не изменяет время отображения изображения, и когда мы вырезаем 10-секундный счетчик, декодер не видит никаких кадров в течение этих 10-секунд.
Если вы хотите иметь аудио тоже, вы должны сделать то же самое для аудио потоков. Итак, команда должна быть:
источник
Я никогда не смогу заставить работать решение ptQa, главным образом потому, что никогда не мог понять, что означают ошибки из фильтров или как их исправить. Мое решение кажется немного более грубым, потому что оно может оставить беспорядок, но если вы добавляете его в сценарий, очистка может быть автоматизирована. Мне также нравится этот подход, потому что если на шаге 4 что-то пойдет не так, вы закончите с шагами 1-3, поэтому восстановление после ошибок будет немного более эффективным.
Основная стратегия заключается в использовании
-t
и-ss
для получения видео каждого сегмента, который вы хотите, а затем объедините все части для вашей окончательной версии.Скажем, у вас есть 6 сегментов ABCDEF каждые 5 секунд, и вы хотите A (0-5 секунд), C (10-15 секунд) и E (20-25 секунд), и вы сделаете следующее:
или
Это сделает файлы a.tvshow, c.tvshow и e.tvshow. Он
-t
говорит, как долго длится каждый клип, поэтому, если c составляет 30 секунд, вы можете передать 30 или 0:00:30.-ss
Вариант говорит , как далеко , чтобы пропустить в исходном видео, так что всегда относительно начала файла.Затем, когда у вас есть куча видеофайлов, я создаю такой файл
ace-files.txt
:Обратите внимание на «файл» в начале и имя файла после него.
Тогда команда:
Это объединяет все файлы
abe-files.txt
вместе, копируя их аудио и видео кодеки, и создает файл,ace.tvshow
который должен быть просто разделами a, c и e. Тогда только не забудьте удалитьace-files.txt
,a.tvshow
,c.tvshow
иe.tvshow
.Отказ от ответственности : я понятия не имею, насколько (не) эффективно это по сравнению с другими подходами с точки зрения,
ffmpeg
но для моих целей это работает лучше. Надеюсь, это кому-нибудь поможет.источник
ace-files.txt
в вашем примере) с помощью:ffmpeg -f concat -i <(printf "file '%s'\n" $(pwd)/prefix_*.tvshow) -c copy output.tvshow
-safe 0
команду ffmpeg, если вы используете абсолютные пути к файлам, чтобы это работало. Или вы можете удалить$(pwd)/
часть подкоманды bash.Я сделал скрипт для ускорения редактирования записанного ТВ. Сценарий запрашивает время начала и окончания сегментов, которые вы хотите сохранить, и разбивает их на файлы. Это дает вам варианты, вы можете:
Видео об этом в действии: здесь
Дайте мне знать, что вы думаете.
источник
safe=0
, т.е.ffmpeg -f concat -safe 0 -i ...
смотрите ffmpeg.org/ffmpeg-all.html#Options-36Хотя ответ, предоставленный ptQa, кажется, работает, я разработал другое решение, которое доказало свою работоспособность.
По сути, я делаю одно видео для каждой части оригинального видео, которое я хочу включить в свой результат. Позже я объединяю их с демоном, описанным здесь .
Решение такое же, какое я попробовал первым и представил проблемы с синхронизацией. Я добавил команду -avoid_negative_ts 1 при создании разных видео. При таком решении проблемы с синхронизацией исчезают.
источник
Для тех, кто испытывает затруднения в следовании подходу ptQa, есть немного более обтекаемый способ сделать это. Вместо того, чтобы согласовывать каждый шаг, просто сделайте их все в конце.
Для каждого входа определите пару аудио / видео:
Определите столько пар, сколько вам нужно, затем объедините их все за один проход, где n = общее количество входных данных.
Это можно легко построить в цикле.
Полная команда, которая использует 2 ввода, может выглядеть так:
источник