Skip to content

Instantly share code, notes, and snippets.

@tausackhn
Last active January 21, 2018 00:36
Show Gist options
  • Save tausackhn/3325fc3af454c254e56d6dc65e15c3e0 to your computer and use it in GitHub Desktop.
Save tausackhn/3325fc3af454c254e56d6dc65e15c3e0 to your computer and use it in GitHub Desktop.
Split videofiles by size approximately.
#!/bin/bash
#
# Split video in chunks with similar size (depends on bitrate, the best option CBR).
#
# require: ffmpeg
# usage: splitter.sh -s chunk_size[KB,MB,GB] [--processes N] file [file ...]
#
# arguments:
# chunk_size[KB,MB,GB] chunk size in KB, MB, GB, or bytes by default
# [--processes N] (optional) number of parallel ffmpeg processes
# file [file ...] input files
#
procs_num=1
while [ -n "$1" ]; do
case "$1" in
-s) size_number=$(echo "$2" | tr -dc '0-9')
units=$(echo "$2" | tr -d '0-9')
case "$units" in
KB) chunk_size=$(( $size_number * 1024 ));;
MB) chunk_size=$(( $size_number * 1024 * 1024 ));;
GB) chunk_size=$(( $size_number * 1024 * 1024 * 1024 ));;
*) chunk_size=( $size_number );;
esac
shift ;;
--processes) procs_num=$2
shift ;;
*) break ;;
esac
shift
done
commands=()
files=( "$@" )
for file in "${files[@]}"; do
info=$(ffprobe -show_entries format=size,duration -hide_banner -of default=nw=1 -v 0 "$file")
for str in $info; do
key=$(echo $str | cut -f1 -d=)
value=$(echo $str | cut -f2 -d=)
case "$key" in
duration) duration="$value";;
size) size="$value";;
esac
done
chunk_duration=$(bc -l <<< "$duration / $size * $chunk_size * 0.97" | cut -f1 -d.)
if [ -z $chunk_duration ]; then
echo "Approximate chunk duration is less than 1 second. Increase size of the part."
exit
fi
fname=$(basename "$file")
directory=$(dirname "$file")
ext="${fname##*.}"
filename="${fname%.*}"
output_file="$directory/$filename%02d.$ext"
commands+=("ffmpeg -v 24 -hide_banner -i \\\"$file\\\" -c copy -f segment -segment_time $chunk_duration \\\"$output_file\\\"")
done
printf "%s\n" "${commands[@]}" | xargs -I CMD --max-procs=$procs_num bash -c CMD
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment