Как удалить несколько сегментов из видео с помощью FFmpeg?

Я пытаюсь удалить несколько разделов видео с помощью FFmpeg.

Например, представьте, если вы записали шоу по телевизору и хотели вырезать рекламные ролики. Это просто с графическим редактором графического интерфейса; Вы просто отмечаете начало и конец каждого клипа, который нужно удалить, и выберите delete. Я пытаюсь сделать то же самое из командной строки с FFmpeg.

Я знаю, как разрезать один сегмент на новое видео, например:

ffmpeg -i input.avi -ss 00:00:20 -t 00:00:05 -map 0 -codec copy output.avi 

Это сокращает пятисекундный клип и сохраняет его как новый видеофайл, но как я могу сделать противоположное и сохранить все видео без указанного клипа и как я могу указать несколько клипов, которые нужно удалить?

Например, если мое видео может быть представлено ABCDEFG, я хотел бы создать новый, который будет состоять из ACDFG.

  • FFMPEG разделяет MP4 с тем же качеством
  • Как преобразовать .iso в .mp4 без установки с помощью ffmpeg
  • Точно вырезать видео файлы из командной строки
  • Извлечение аудио из MP4-видео в MP3
  • Конвертировать mp4 в mp3
  • Какой бесплатный инструмент для редактирования видео можно использовать в Windows, чтобы разрезать файл mp4?
  • FFMPEG: конвертировать MP4 в тот же MP4 (в другом контейнере) и добавлять субтитры
  • Есть ли способ мягко вставлять субтитры в файл mp4 без повторного кодирования?
  • 4 Solutions collect form web for “Как удалить несколько сегментов из видео с помощью FFmpeg?”

    Ну, вы все равно можете использовать фильтр trim для этого. Вот пример, предположим, что вы хотите вырезать сегменты 30-40 с (10 сек) и 50-80 сек (30 сек):

     ffmpeg -i in.ts -filter_complex \ "[0:v]trim=duration=30[a]; \ [0:v]trim=start=40:end=50,setpts=PTS-STARTPTS[b]; \ [a][b]concat[c]; \ [0:v]trim=start=80,setpts=PTS-STARTPTS[d]; \ [c][d]concat[out1]" -map [out1] out.ts 

    Что я здесь сделал? Я обрезал первые 30 секунд, 40-50 секунд и 80 секунд до конца, а затем объединил их в поток out1 с фильтром concat .

    О наборах: нам нужно это, потому что обрезка не изменяет время отображения изображения, и когда мы вырезаем счетчик 10 сек декодера, он не видит никаких кадров за эти 10 секунд.

    Если вы хотите иметь звук тоже, вы должны сделать то же самое для аудиопотоков. Поэтому команда должна быть:

     ffmpeg -i utv.ts -filter_complex \ "[0:v]trim=duration=30[av];[0:a]atrim=duration=30[aa];\ [0:v]trim=start=40:end=50,setpts=PTS-STARTPTS[bv];\ [0:a]atrim=start=40:end=50,asetpts=PTS-STARTPTS[ba];\ [av][bv]concat[cv];[aa][ba]concat=v=0:a=1[ca];\ [0:v]trim=start=80,setpts=PTS-STARTPTS[dv];\ [0:a]atrim=start=80,asetpts=PTS-STARTPTS[da];\ [cv][dv]concat[outv];[ca][da]concat=v=0:a=1[outa]" -map [outv] -map [outa] out.ts 

    Я никогда не смогу получить решение ptQa для работы, главным образом потому, что я не могу понять, что означают ошибки из фильтров или как их исправить. Мое решение кажется немного clunkier, потому что оно может оставить беспорядок, но если вы бросаете его в сценарий, очистка может быть автоматизирована. Мне также нравится этот подход, потому что если на шаге 4 что-то пойдет не так, вы закончите с завершенными шагами 1-3, поэтому восстановление от ошибок немного более эффективно.

    Основная стратегия – использовать -t и -ss для получения видеороликов каждого сегмента, который вы хотите, а затем объединить все части для вашей окончательной версии.

    Скажем, у вас есть 6 сегментов ABCDEF каждые 5 секунд, и вы хотите A (0-5 секунд), C (10-15 секунд) и E (20-25 секунд), вы сделали бы это:

     ffmpeg -i abcdef.tvshow -t 5 a.tvshow -ss 10 -t 5 c.tvshow -ss 20 -t 5 e.tvshow 

    или

     ffmpeg -i abcdef.tvshow -t 0:00:05 a.tvshow -ss 0:00:10 -t 0:00:05 c.tvshow -ss 0:00:20 -t 0:00:05 e.tvshow 

    Это создаст файлы a.tvshow, c.tvshow и e.tvshow. -t говорит, как долго каждый клип, так что если c 30 секунд, вы можете пройти через 30 или 0:00:30. Опция -ss указывает, как далеко перейти в исходное видео, поэтому оно всегда относится к началу файла.

    Затем, когда у вас есть куча видеофайлов, я делаю файл ace-files.txt следующим образом:

     file 'a.tvshow' file 'c.tvshow' file 'e.tvshow' 

    После этого запомните «файл» в начале и имя файла с экранированным именем.

    Затем команда:

     ffmpeg -f concat -i ace-files.txt -c copy ace.tvshow 

    Это объединяет все файлы в abe-files.txt вместе, копируя их аудио- и видеокодеки и создает файл ace.tvshow который должен быть просто секциями a, c и e. Тогда просто не забудьте удалить ace-files.txt , a.tvshow , c.tvshow и e.tvshow .

    Отказ от ответственности : я понятия не имею, насколько эффективно это сравнивается с другими подходами с точки зрения ffmpeg но для моих целей он работает лучше. Надеюсь, это поможет кому-то.

    Хотя ответ, представленный ptQa, кажется, работает, я разработал другое решение, которое было бы хорошо работать.

    По сути, я делаю это, чтобы вырезать одно видео для каждой части исходного видео, которое я хочу включить в свой результат. Позже я объединил их с Объяснителем Конката, объясненным здесь .

    Решение – это то же самое, что я сначала попытался и представил проблемы с синхронизацией. Добавлена ​​команда -avoid_negative_ts 1 при создании разных видеороликов. С этим решением проблемы синхронизации исчезают.

    Я сделал сценарий, чтобы ускорить редактирование записанного телевизора. Сценарий запрашивает время начала и конца сегментов, которые вы хотите сохранить, и разбивает их на файлы. Он дает вам варианты, вы можете:

    • Возьмите один или несколько сегментов.
    • Вы можете объединить сегменты в один результирующий файл.
    • После присоединения вы можете хранить или удалять файлы деталей.
    • Вы можете сохранить исходный файл или заменить его новым файлом.

    Видео об этом в действии: здесь

    Дайте мне знать, что вы думаете.

      #!/bin/bash /bin/date >>segmenter.log function segment (){ while true; do echo "Would you like to cut out a segment ?" echo -e "1) Yes\n2) No\n3) Quit" read CHOICE if [ "$CHOICE" == "3" ]; then exit elif [ "$CHOICE" == "2" ]; then clear break elif [ "$CHOICE" == "1" ]; then clear ((segments++)) echo "What time does segment $segments start ?" read SEGSTART clear echo -e "Segment $segments start set to $SEGSTART\n" echo "What time does segment $segments end ?" read SEGEND clear echo -e "Segment $segments end set to $SEGEND\n" break else clear echo -e "Bad option" segment "$segments" fi done if [ "$CHOICE" == "1" ]; then echo "Cutting file $file video segment $segments starting at $SEGSTART and ending at $SEGEND" ffmpeg -i "$file" -ss $SEGSTART -to $SEGEND -map 0:0 -map 0:1 -c:a copy -c:v copy "$filename-part$segments.$extension" >> segmenter.log 2>&1 clear echo -e "Cut file $filename-part$segments.$extension starting at $SEGSTART and ending at $SEGEND\n" segment "$segments" fi } file="$1" filename="${file%.*}" extension="${file##*.}" clear segments=0 segment "$segments" clear if (("$segments"==1)); then mv $filename"-part1."$extension "$filename-segmented.$extension" elif (("$segments">1)); then echo "Would you like to join the segments into one file ?" OPTIONS="Yes No Quit" select opt in $OPTIONS; do clear if [ "$opt" == "Quit" ]; then exit elif [ "$opt" == "Yes" ]; then clear echo "Joining segments" ffmpeg -f concat -i <(for f in $filename"-part"*$extension; do echo "file '$(pwd)/$f'"; done) -c:a copy -c:v copy "$filename-segmented.$extension" >> segmenter.log 2>&1 clear echo "Would you like to delete the part files ?" select opt in $OPTIONS; do clear if [ "$opt" == "Quit" ]; then exit elif [ "$opt" == "Yes" ]; then for f in $filename"-part"*$extension; do rm $f; done break elif [ "$opt" == "No" ]; then break else clear echo -e "Bad option\n" fi done break clear elif [ "$opt" == "No" ]; then exit else clear echo -e "Bad option\n" fi done fi echo "Would you like to replace the original file with the result of your changes ?" OPTIONS="Yes No Quit" select opt in $OPTIONS; do clear if [ "$opt" == "Quit" ]; then exit elif [ "$opt" == "Yes" ]; then rm $file mv "$filename-segmented.$extension" $file break elif [ "$opt" == "No" ]; then break else clear echo -e "Bad option\n" fi done 
    Interesting Posts

    Как использовать файлы мини-дампов Windows?

    Неизвестный процесс в TaskManager и не может быть удален

    Скопируйте все установленные программы и файлы на жесткий диск (который имеет 32-битную Windows 7) и клонируйте / перенесите его на другой компьютер с 64-разрядной версией Windows 7

    Символы Emoji не отображаются правильно в Windows 7

    Почему все флеш-видео много отстает?

    Очистить элемент из автозаполнения адресной строки Chrome

    Нужно ли мне активировать Windows 8, если я использовал его раньше?

    ОЧЕНЬ большие текстовые файлы и Snow Leopard

    Включить клавиши F1-F12 без Fn на Lenovo Ideapad S400u

    Как заставить Windows 7 использовать определенные сетевые адаптеры для каждой программы?

    Как настроить удаленный домашний каталог на Mac OS X?

    Как вводить только уникальные значения в столбце Excel 2007

    Возьмите psd и экспортируйте все слои в отдельные файлы изображений без использования Photoshop

    Как решить: -bash:: невозможно выполнить двоичный файл

    Как настроить Linux на работу как сервер RFCOMM SPP?

    Давайте будем гением компьютера.