3

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

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

2 ответа2

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 для получения дополнительной информации о поиске.

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .