영상을 이렇게 10분정도로 자르고 싶습니다.
ffmpeg -i video.mp4 -ss 00:00:00 -t 00:10:00 -c copy 01.mp4
ffmpeg -i video.mp4 -ss 00:10:00 -t 00:10:00 -c copy 02.mp4
ffmpeg -i video.mp4 -ss 00:20:00 -t 00:10:00 -c copy 03.mp4
그것 으로 for
이렇게 될 것입니다.
for i in `seq 10`; do ffmpeg -i video.mp4 -ss 00:${i}0:00 -t 00:10:00 -c copy ${i].mp4; done;
하지만 지속 시간이 1시간 미만인 경우에만 작동합니다. Bash 쉘에서 숫자를 시간 형식으로 어떻게 변환합니까?
답변1
BASH는 이 문제에 있어서 그다지 나쁘지 않습니다. 매우 강력하지만 잘 사용되지 않는 명령을 사용해야 합니다 date
.
for i in {1..10}; do
hrmin=$(date -u -d@$(($i * 10 * 60)) +"%H:%M")
outfile=${hrmin/:/-}.mp4
ffmpeg -i video.mp4 -ss ${hrmin}:00 -t 00:10:00 -c copy ${outfile}
done
date
명령 설명
date
와-d
설정할 수 있습니다어느표시하려는 날짜(기본값인 현재 날짜 및 시간 대신) 이 경우 @
정수 앞에 기호를 추가하여 UNIX 시간으로 설정합니다 . 이 경우 정수는 10분 단위의 시간입니다(BASH 내장 계산기로 계산: $((...))
).
기호 는 결과 표시 형식을 지정한다는 +
의미 입니다. date
우리의 경우에는 시( %H
)와 분( %M
)만 고려합니다.
마지막으로 -u
현지 시간이 아닌 UTC 시간으로 표시됩니다. 이 경우 UNIX 시간을 제공할 때 시간을 UTC로 지정했기 때문에 이것이 중요합니다(UNIX 시간은 항상 UTC입니다). 를 지정하지 않으면 숫자가 0부터 시작하지 않을 가능성이 높습니다 -u
.
BASH 변수 대체 설명
그 date
명령은 우리에게 꼭 필요한 것을 제공했습니다. 그러나 파일 이름의 콜론은 문제가 있거나 표준이 아닐 수 있습니다. 따라서 '-'를 ':'으로 대체합니다. 이는 sed
or cut
또는 명령 으로 수행할 수 있지만 tr
이는 매우 간단한 작업이므로 BASH에서 수행할 수 있는데 왜 새 하위 쉘을 생성합니까?
여기서는 BASH의 간단한 표현식 대체를 사용합니다. 이렇게 하려면 변수를 중괄호( ${hrmin}
) 안에 포함하고 표준 슬래시 표기법을 사용해야 합니다. 첫 번째 슬래시 뒤의 첫 번째 문자열은 검색 패턴입니다. 두 번째 슬래시 다음의 두 번째 문자열은 대체입니다.
BASH 변수 대체 등은 다음에서 찾을 수 있습니다.http://tldp.org/LDP/abs/html/parameter-substitution.html.
답변2
약간 더 복잡하지만 bash에서는 충분히 쉽게 할 수 있습니다. 아래 예는 2시간짜리 비디오에 대한 것이므로 n<=11
이에 따라 제한( )을 설정할 수 있습니다.
k=0;
i=00;
for ((n=0;n<=11;n++)); do
if [ $i -ge 60 ]; then
let k++; i=00;
fi;
ffmpeg -i video.mp4 -ss 0$k:$i:00 -t 00:10:00 -c copy $k$i.mp4;
let i+=10;
done
echo
다음 행 에 를 추가하면 이것이 수행하는 작업을 확인할 수 있습니다 ffmpeg
.
echo "ffmpeg -i video.mp4 -ss 0$k:$i:00 -t 00:10:00 -c copy $k$i.mp4";
그러면 다음이 인쇄됩니다:
ffmpeg -i video.mp4 -ss 00:00:00 -t 00:10:00 -c copy 000.mp4
ffmpeg -i video.mp4 -ss 00:10:00 -t 00:10:00 -c copy 010.mp4
ffmpeg -i video.mp4 -ss 00:20:00 -t 00:10:00 -c copy 020.mp4
ffmpeg -i video.mp4 -ss 00:30:00 -t 00:10:00 -c copy 030.mp4
ffmpeg -i video.mp4 -ss 00:40:00 -t 00:10:00 -c copy 040.mp4
ffmpeg -i video.mp4 -ss 00:50:00 -t 00:10:00 -c copy 050.mp4
ffmpeg -i video.mp4 -ss 01:00:00 -t 00:10:00 -c copy 100.mp4
ffmpeg -i video.mp4 -ss 01:10:00 -t 00:10:00 -c copy 110.mp4
ffmpeg -i video.mp4 -ss 01:20:00 -t 00:10:00 -c copy 120.mp4
ffmpeg -i video.mp4 -ss 01:30:00 -t 00:10:00 -c copy 130.mp4
ffmpeg -i video.mp4 -ss 01:40:00 -t 00:10:00 -c copy 140.mp4
ffmpeg -i video.mp4 -ss 01:50:00 -t 00:10:00 -c copy 150.mp4
답변3
간단한 수학입니다. 시간은 $((i%3600)
, 분은 $((i/60%60))
, 초는 입니다 $((i%60))
. 필요한 곳에 앞에 0을 추가하려면 100을 더한 다음 앞에 있는 1
. 앞에 0이 표시되지 않도록 하려면 파일 이름에도 동일한 작업을 수행하세요.
for i in $(seq 10); do
minutes=$((i / 60 % 60 + 100)); minutes=${minutes#1}
seconds=$((i%60)); seconds=${seconds#1}
i=$((i+100)); i=${i#1}
ffmpeg -i video.mp4 -ss $((i%3600):$minutes:$seconds -t 00:10:00 -c copy ${i}.mp4
done
답변4
ffmpeg는 [HH:MM:SS]뿐만 아니라 간단한 초도 타임스탬프 형식으로 허용한다는 것을 알았습니다.
https://trac.ffmpeg.org/wiki/Seeking%20with%20FFmpeg
그래서 이렇게 쓸 수 있어요.
for i in `seq 10`; do ffmpeg -i video.mp4 -ss $((i*10*60)) -t 00:10:00 -c copy ${i].mp4; done;