Удалить начало и конец из нескольких файлов MP4 навалом

3

У меня есть несколько 100 видео, которые мне нужно удалить первые 20 секунд и последние 30 секунд.

Очевидно, не практично делать это по одному. Можно ли как-нибудь автоматизировать это, может быть, в сценарии OS X Automator?

bumble_bee_tuna
источник

Ответы:

4

Предполагая, что вы запускаете * nix и Bash, скачать статическую сборку ffmpeg для вашей операционной системы. Затем возьмите ffmpeg файл и скопировать его в /usr/bin/ffmpeg,

sudo cp ~/Downloads/ffmpeg/ffmpeg /usr/bin/ffmpeg
sudo chmod +x /usr/bin/ffmpeg

Теперь вы можете запустить этот скрипт оболочки в Bash - должно быть достаточно, чтобы скопировать и вставить его в папку, где находятся видео.

for f in *.mp4; do
    duration=$(ffmpeg -i "$f" 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,//)
    length=$(echo "$duration" | awk '{ split($1, A, ":"); print 3600*A[1] + 60*A[2] + A[3] }' )
    trim_start=20
    trim_end=$(echo "$length" - 30 - "$trim_start" | bc)
    echo ffmpeg -ss "$trim_start" -i "$f" -c copy -map 0 -t "$trim_end" "${f%.mp4}-trimmed.mp4"
done

Замечания: Удалить echo заявление на самом деле выполнять команды. Было бы хорошо сначала проверить сгенерированные команды на точность. Это будет генерировать что-то вроде:

ffmpeg -ss 20 -i input.mp4 -c copy -map 0 -t 161.58 input-trimmed.mp4

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

Чтобы уточнить, -ss устанавливает время начала и -c copy -map 0 скопирует все потоки видео, аудио и субтитров из оригинала в урезанную версию. -t устанавливает время окончания. Увидеть эта статья на FFmpeg Wiki для получения дополнительной информации о поиске.

slhck
источник
0

Если вам удобно с командной строкой, я бы порекомендовал FFmpeg

ffmpeg -i file.mp4 -vcodec copy -acodec copy -ss 00:00:20.000 -t 00:00:30.000 output.mp4

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

for f in *.mp4; do ffmpeg -i $f -vcodec copy -acodec copy -ss 00:00:20.000 -t 00:00:30.000 output/$f; done

Надеюсь, это поможет немного.

oli.G
источник
ОП должен удалить последние 30 секунд, а не кодировать в течение 30 секунд, поэтому ваш подход не работает. Кроме того, синтаксис ввода с %d поддерживается только для изображений (более конкретно image2 demuxer ).
slhck