Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Prepare Video for Byte/IG Story/etc
#!/bin/bash
#Quick and dirty way to get a video ready for byte or instagram or other
#These are usually in a ratio of 9:16, as opposed to usual viewing of 16:9
#Requires: ffprobe, ffmpeg
#Example usages:
# 1)
# sh prepareVideoForSocialMedia.sh someStream.mp4 00:01:45 6 510
# 2)
# sh prepareVideoForSocialMedia.sh someStream.mp4 02:17:00 6
#This is just a helper function for ease of use
function convert_seconds_to_hms () {
num=$1
min=0
hour=0
sec=0
if((num>59));then
((sec=num%60))
((num=num/60))
if((num>59));then
((min=num%60))
((num=num/60))
((hour=num))
else
((min=num))
fi
else
((sec=num))
fi
#pad zeroes
if [[ $hour -lt 10 ]]
then
hour="0$hour"
fi
if [[ $min -lt 10 ]]
then
min="0$min"
fi
if [[ $sec -lt 10 ]]
then
sec="0$sec"
fi
echo "$hour:$min:$sec"
}
ORIG=$1 #the file you want to extract from
START_TIME=$2 #where you want the start. In the format HH:mm:ss
LENGTH=$3 #how many seconds it should be (byte is 6, instagram is 30. I think)
X_CROP=$4 #the x coordinate you want at the centre of the video (i.e. what you want viewers to see)
# If X_CROP is left blank, the video will simply get rotated and scaled to fit
LENGTH="$(convert_seconds_to_hms 5)"
echo $LENGTH
if [ -z $X_CROP]
then
#Extract segment, rotate, and scale
echo "No X-Coordinate provided, rotating and scaling instead of cropping"
ffmpeg -i $ORIG -ss $START_TIME -t $LENGTH -filter:v "transpose=0, scale=-1:1080" -c:a copy ${ORIG%.*}-prepared.mp4
else
#Extract segment, crop, and scale
DIMS=`ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 $ORIG`
x=${DIMS%x*}
y=${DIMS##*x}
width=`echo "scale=5;$y / (16 / 9)" | bc`
width=`echo $width|cut -f1 -d"."`
height=$y
echo $width
echo $height
#This does sort of assume your source video uses a happy audio codec
ffmpeg -i $ORIG -ss $START_TIME -t $LENGTH -filter:v "crop=$width:$height:$X_CROP:0, scale=-1:1080" -c:a copy ${ORIG%.*}-prepared.mp4
fi
#Explanation of what this script does:
#
# This script takes a slice of your video, denoted by *
# Making it nice for viewing on mobile
# | _ _ _ _ _ _ _ _ _ *** _ _ _ _ _ |
# | *** |
# | *** |
# | *** |
# | *** |
# | *** |
# | *** |
# | *** |
# | _ _ _ _ _ _ _ _ _ *** _ _ _ _ _ |
#
# Of course, you can just use the rotate option if you want
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.