Я хочу использовать инструмент командной строки, чтобы сократить видео согласно определенному интервалу, сказать 1 секунду. Если у меня будет 60-секундное видео, то я ожидаю, что это будет разделено на 60 универсальных частей. Мое только другое требование то, что там не быть никаким перекодированием.
Я считал два вопроса по этой теме.
1-й поток предложил недоверяемый инструмент, который больше, кажется, не сохраняется. 2-й поток предлагается avconv
управлять большими сегментами видео с ручными именами. Поскольку я буду сокращать эти видео в потенциально сотни меньших частей, подход слишком утомителен. Один пользователь предложил сценарий Bash, но признал, что это могло бы "произвести много ошибок и пустых файлов". Я повторно отправлю этот сценарий здесь для ясности и поощрять лучшее решение:
#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
FILES=$(ls *.mp4|sort)
let START=0
for FILE in $FILES
do
echo Processing $FILE
mkdir "${FILE}-chop"
for COUNT in {1..59}
do
exec avconv -i "${FILE}" -ss $START -t 60 -c:v copy -c:a copy "./${FILE}-chop/${COUNT} - ${FILE}"
let START=$START+60
done
done
IFS=$SAVEIFS
Является сценарий Bash как это действительно правильным подходом здесь? Или есть ли более простой, более эффективный, более надежный инструмент, который я могу использовать с этой целью?
Используйте сегмент muxer в ffmpeg
:
ffmpeg -i input -map 0 -f segment -segment_time 60 -reset_timestamps 1 -c copy output_%03d.mp4
Используя -c copy
включает потоковый режим копии. Сегмент muxer сократит на ключевых кадрах, когда потоковое копирование, таким образом, сегменты не могут иметь точной продолжительности 60 секунд. При необходимости точно в 60 секундах на сегмент затем, необходимо будет повторно закодировать путем удаления -c copy
и установка соответствующего размера GOP для установки ограничению времени сегмента. Например, один второй GOP для 25 выводов framerate -g 25
(значение по умолчанию 250).