|
#!/bin/bash |
|
|
|
|
|
if [ $# -ne 2 ]; then |
|
echo 'Illegal number of parameters. Needs 2 parameters:' |
|
echo 'Usage:' |
|
echo './split-video.sh FILE SIZELIMIT "FFMPEG_ARGS' |
|
echo |
|
echo 'Parameters:' |
|
echo ' - FILE: Name of the video file to split' |
|
echo ' - SIZELIMIT: Maximum file size of each part (in bytes)' |
|
echo ' - FFMPEG_ARGS: Additional arguments to pass to each ffmpeg-call' |
|
echo ' (video format and quality options etc.)' |
|
exit 1 |
|
fi |
|
|
|
FILE="$1" |
|
SIZELIMIT="$2" |
|
FFMPEG_ARGS="$3" |
|
|
|
|
|
DURATION=$(ffprobe -i "$FILE" -show_entries format=duration -v quiet -of default=noprint_wrappers=1:nokey=1|cut -d. -f1) |
|
|
|
|
|
CUR_DURATION=0 |
|
|
|
|
|
BASENAME="${FILE%.*}" |
|
|
|
|
|
|
|
EXTENSION="mp4" |
|
|
|
|
|
i=1 |
|
|
|
|
|
NEXTFILENAME="$BASENAME-$i.$EXTENSION" |
|
|
|
echo "Duration of source video: $DURATION" |
|
|
|
|
|
while [[ $CUR_DURATION -lt $DURATION ]]; do |
|
|
|
echo ffmpeg -i "$FILE" -ss "$CUR_DURATION" -fs "$SIZELIMIT" $FFMPEG_ARGS "$NEXTFILENAME" |
|
ffmpeg -ss "$CUR_DURATION" -i "$FILE" -fs "$SIZELIMIT" $FFMPEG_ARGS "$NEXTFILENAME" |
|
|
|
|
|
NEW_DURATION=$(ffprobe -i "$NEXTFILENAME" -show_entries format=duration -v quiet -of default=noprint_wrappers=1:nokey=1|cut -d. -f1) |
|
|
|
|
|
CUR_DURATION=$((CUR_DURATION + NEW_DURATION)) |
|
|
|
i=$((i + 1)) |
|
|
|
echo "Duration of $NEXTFILENAME: $NEW_DURATION" |
|
echo "Part No. $i starts at $CUR_DURATION" |
|
|
|
NEXTFILENAME="$BASENAME-$i.$EXTENSION" |
|
done |