Skip to content

Instantly share code, notes, and snippets.

@untergrundbiber
Last active December 11, 2016 17:32
Show Gist options
  • Save untergrundbiber/2c3227cd2786a724e0e515dc28e64f86 to your computer and use it in GitHub Desktop.
Save untergrundbiber/2c3227cd2786a724e0e515dc28e64f86 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:$PATH
set -e
basedir="$(dirname "$(readlink -f "$0")")"
tempdir=$(mktemp -d)
trap 'rm -rf "$tempdir"' EXIT
cd "$tempdir" || exit 1
vidurl="$1"
maxsize="$2"
maxsizedef="5" # output: max. filezize in megabyte
videohigh="640" # output: videohigh in pixel
if [ -z "$maxsize" ]; then maxsize="$maxsizedef"; fi
echo "max. filezize = $maxsize MB"
ytargs=(-q -i --ignore-config --add-metadata --restrict-filenames -o "%(uploader)s-%(title)s-%(id)s.%(ext)s")
format=(-f 'bestvideo[ext=mp4][height<=?720]+bestaudio[ext=m4a]')
echo "Downloading video..."
youtube-dl -e "$vidurl"
youtube-dl "${ytargs[@]}" "${format[@]}" "$vidurl"
for file in *.mp4; do filename="${file%.*}"; done
videolength=$(ffprobe -i "${filename}.mp4" -show_entries format=duration -v quiet -of csv="p=0" | awk '{printf("%d\n",$1 + 0.5)}')
audiobitrate="64"
realbitrate=$((((((maxsize * 2**20) / videolength) / 1000) * 8) - audiobitrate))
videobitrate=$(((realbitrate / 100) * 80))
bufsize=$(((videobitrate * 6) / 10))
initoccupancy=$((videobitrate * 4 ))
eval "$(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width "${filename}.mp4")"
imagesize=$((streams_stream_0_width * streams_stream_0_height))
if [ "$imagesize" -ge "2073600" ]; then
slices="4" # 1080p (1920*1080)
elif [ "$imagesize" -ge "921600" ]; then
slices="3" # 720p (1280*720)
elif [ "$imagesize" -ge "307200" ]; then
slices="2" # 480p (640*480)
else
slices="1"
fi
echo "Converting video..."
echo "Video length: $(ffprobe "${filename}.mp4" -show_entries format=duration -v quiet -of csv="p=0" -sexagesimal)"
ffmpeg -v quiet -stats -i "${filename}.mp4" \
-c:v libvpx -pix_fmt yuv420p -threads 8 -slices ${slices} -ac 2 -c:a libvorbis -minrate:v ${videobitrate}k -b:v ${videobitrate}k -maxrate:v ${videobitrate}k \
-bufsize ${bufsize}k -rc_init_occupancy ${initoccupancy}k -qcomp 0 -b:a 64k -vf scale=${videohigh}:-1 \
"${filename}.webm"
mv "${filename}.webm" "$basedir"
echo "Finished! Output: ${filename}.webm"
echo "Bitrate: ${videobitrate}k"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment