Last active
January 21, 2018 00:36
-
-
Save tausackhn/3325fc3af454c254e56d6dc65e15c3e0 to your computer and use it in GitHub Desktop.
Split videofiles by size approximately.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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