Last active
December 9, 2017 06:17
-
-
Save unabridgedxcrpt/b1382014adbadc9ff63de79a4d196ccb to your computer and use it in GitHub Desktop.
This file contains hidden or 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 | |
| # Written by Alexis Bezverkhyy <[email protected]> in 2011 | |
| # This is free and unencumbered software released into the public domain. | |
| # For more information, please refer to <http://unlicense.org/> | |
| # | |
| # Found at: http://grapsus.net/blog/post/A-script-for-splitting-videos-using-ffmpeg | |
| # Here is a small bash script for automatically cutting a video file into smaller chunks of fixed length. ffmpeg cannot output multiple files, but it has start offset and duration parameters which my script uses to actually split the file. | |
| # For example, if we have a video called 'video.mpeg' which is 3000 seconds long and we run | |
| # ffsplit.sh video.mpeg 1200 | |
| # we will obtain three files : video-001.mpeg (1200 seconds), video-002.mpeg (1200 seconds) and video-003.mpeg (600 seconds). | |
| function usage { | |
| echo "Usage : ffsplit.sh input.file chunk-duration [output-filename-format]" | |
| echo -e "\t - input file may be any kind of file reconginzed by ffmpeg" | |
| echo -e "\t - chunk duration must be in seconds" | |
| echo -e "\t - output filename format must be printf-like, for example myvideo-part-%04d.avi" | |
| echo -e "\t - if no output filename format is given, it will be computed\ | |
| automatically from input filename" | |
| } | |
| IN_FILE="$1" | |
| OUT_FILE_FORMAT="$3" | |
| typeset -i CHUNK_LEN | |
| CHUNK_LEN="$2" | |
| DURATION_HMS=$(ffmpeg -i "$IN_FILE" 2>&1 | grep Duration | cut -f 4 -d ' ') | |
| DURATION_H=$(echo "$DURATION_HMS" | cut -d ':' -f 1) | |
| DURATION_M=$(echo "$DURATION_HMS" | cut -d ':' -f 2) | |
| DURATION_S=$(echo "$DURATION_HMS" | cut -d ':' -f 3 | cut -d '.' -f 1) | |
| let "DURATION = ( DURATION_H * 60 + DURATION_M ) * 60 + DURATION_S" | |
| if [ "$DURATION" = '0' ] ; then | |
| echo "Invalid input video" | |
| usage | |
| exit 1 | |
| fi | |
| if [ "$CHUNK_LEN" = "0" ] ; then | |
| echo "Invalid chunk size" | |
| usage | |
| exit 2 | |
| fi | |
| if [ -z "$OUT_FILE_FORMAT" ] ; then | |
| FILE_EXT=$(echo "$IN_FILE" | sed 's/^.*\.\([a-zA-Z0-9]\+\)$/\1/') | |
| FILE_NAME=$(echo "$IN_FILE" | sed 's/^\(.*\)\.[a-zA-Z0-9]\+$/\1/') | |
| OUT_FILE_FORMAT="${FILE_NAME}-%03d.${FILE_EXT}" | |
| echo "Using default output file format : $OUT_FILE_FORMAT" | |
| fi | |
| N='1' | |
| OFFSET='0' | |
| let 'N_FILES = DURATION / CHUNK_LEN + 1' | |
| while [ "$OFFSET" -lt "$DURATION" ] ; do | |
| OUT_FILE=$(printf "$OUT_FILE_FORMAT" "$N") | |
| echo "writing $OUT_FILE ($N/$N_FILES)..." | |
| ffmpeg -i "$IN_FILE" -vcodec copy -acodec copy -ss "$OFFSET" -t "$CHUNK_LEN" "$OUT_FILE" | |
| let "N = N + 1" | |
| let "OFFSET = OFFSET + CHUNK_LEN" | |
| done |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment