Skip to content

Instantly share code, notes, and snippets.

@sinkers
Created July 11, 2014 07:07
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save sinkers/5cc2854e01a05a2db650 to your computer and use it in GitHub Desktop.
Save sinkers/5cc2854e01a05a2db650 to your computer and use it in GitHub Desktop.
Creating multiple DASH renditions with a bitrate text overlay, using ffmpeg and Bento
#!/bin/sh
# encode_bitrate_overlay.sh
#
#
# Created by Andrew Sinclair on 11/07/2014.
#
#!/bin/bash
VIDSOURCE=$1
OUTNAME=$2
RESOLUTION1="320x180"
RESOLUTION2="512x288"
RESOLUTION3="640x360"
RESOLUTION4="960x540"
RESOLUTION5="1024x576"
RESOLUTION6="1280x720"
RESOLUTION7="1920x1080"
BITRATE1="400000"
BITRATE2="800000"
BITRATE3="1000000"
BITRATE4="1200000"
BITRATE5="1400000"
BITRATE6="2000000"
BITRATE7="4000000"
# Set this to a font file on your system
FONTFILE="/opt/X11/share/fonts/TTF/Vera.ttf"
FONTSIZE="40"
FONTCOLOR="black"
# Note you will need Bento tools installed for this
# http://www.bok.net/trac/bento4/
MP4FRAGMENT="/Users/andrew/Desktop/workspace/hbbtv/Bento4-SDK-1-3-5-541.universal-apple-macosx/bin/Release/mp4fragment"
MP4DASH="/Users/andrew/Desktop/workspace/hbbtv/Bento4-SDK-1-3-5-541.universal-apple-macosx/utils/mp4-dash.py"
echo "Encoding $VIDSOURCE"
AUDIO_OPTS="-c:a libfdk_aac -b:a 160000 -ac 2"
AUDIO_OPTS2="-c:a libfdk_aac -b:a 640000 -ac 2"
# Change the preset for better quality e.g. to slow or medium, ultrafast is just for testing the output quickly
# TODO add options for keyframe intervals for best adaptive segmentation
VIDEO_OPTS1="-c:v libx264 -vprofile main -preset slow"
VIDEO_OPTS2="-c:v libx264 -vprofile main -preset slow"
VIDEO_OPTS3="-c:v libx264 -vprofile main -preset slow"
OUTPUT_HLS="-f mp4"
~/Desktop/workspace/ffmpeg-mac/FFmpeg/ffmpeg -i $VIDSOURCE -y \
$AUDIO_OPTS -vf "drawtext=fontfile='${FONTFILE}':text='$RESOLUTION1 ${BITRATE1}bps':fontsize=${FONTSIZE}:fontcolor=${FONTCOLOR}:x=100:y=100:box=1" -s $RESOLUTION1 $VIDEO_OPTS1 -b:v $BITRATE1 $OUTPUT_HLS ${OUTNAME}_${BITRATE1}.mp4 \
$AUDIO_OPTS -vf "drawtext=fontfile='${FONTFILE}':text='$RESOLUTION2 ${BITRATE2}bps':fontsize=${FONTSIZE}:fontcolor=${FONTCOLOR}:x=100:y=100:box=1" -s $RESOLUTION2 $VIDEO_OPTS2 -b:v $BITRATE2 $OUTPUT_HLS ${OUTNAME}_${BITRATE2}.mp4 \
$AUDIO_OPTS2 -vf "drawtext=fontfile='${FONTFILE}':text='$RESOLUTION3 ${BITRATE3}bps':fontsize=${FONTSIZE}:fontcolor=${FONTCOLOR}:x=100:y=100:box=1" -s $RESOLUTION3 $VIDEO_OPTS3 -b:v $BITRATE3 $OUTPUT_HLS ${OUTNAME}_${BITRATE3}.mp4 \
$AUDIO_OPTS2 -vf "drawtext=fontfile='${FONTFILE}':text='$RESOLUTION4 ${BITRATE4}bps':fontsize=${FONTSIZE}:fontcolor=${FONTCOLOR}:x=100:y=100:box=1" -s $RESOLUTION4 $VIDEO_OPTS3 -b:v $BITRATE4 $OUTPUT_HLS ${OUTNAME}_${BITRATE4}.mp4 \
$AUDIO_OPTS2 -vf "drawtext=fontfile='${FONTFILE}':text='$RESOLUTION5 ${BITRATE5}bps':fontsize=${FONTSIZE}:fontcolor=${FONTCOLOR}:x=100:y=100:box=1" -s $RESOLUTION5 $VIDEO_OPTS3 -b:v $BITRATE5 $OUTPUT_HLS ${OUTNAME}_${BITRATE5}.mp4 \
$AUDIO_OPTS2 -vf "drawtext=fontfile='${FONTFILE}':text='$RESOLUTION6 ${BITRATE6}bps':fontsize=${FONTSIZE}:fontcolor=${FONTCOLOR}:x=100:y=100:box=1" -s $RESOLUTION6 $VIDEO_OPTS3 -b:v $BITRATE6 $OUTPUT_HLS ${OUTNAME}_${BITRATE6}.mp4 \
$AUDIO_OPTS2 -vf "drawtext=fontfile='${FONTFILE}':text='$RESOLUTION7 ${BITRATE7}bps':fontsize=${FONTSIZE}:fontcolor=${FONTCOLOR}:x=100:y=100:box=1" -s $RESOLUTION7 $VIDEO_OPTS3 -b:v $BITRATE7 $OUTPUT_HLS ${OUTNAME}_${BITRATE7}.mp4 \
#Generating DASH output with Bento
#First we need to fragment the outputted files
$MP4FRAGMENT ${OUTNAME}_${BITRATE1}.mp4 ${OUTNAME}_${BITRATE1}_frag.mp4
$MP4FRAGMENT ${OUTNAME}_${BITRATE2}.mp4 ${OUTNAME}_${BITRATE2}_frag.mp4
$MP4FRAGMENT ${OUTNAME}_${BITRATE3}.mp4 ${OUTNAME}_${BITRATE3}_frag.mp4
$MP4FRAGMENT ${OUTNAME}_${BITRATE4}.mp4 ${OUTNAME}_${BITRATE4}_frag.mp4
$MP4FRAGMENT ${OUTNAME}_${BITRATE5}.mp4 ${OUTNAME}_${BITRATE5}_frag.mp4
$MP4FRAGMENT ${OUTNAME}_${BITRATE6}.mp4 ${OUTNAME}_${BITRATE6}_frag.mp4
$MP4FRAGMENT ${OUTNAME}_${BITRATE7}.mp4 ${OUTNAME}_${BITRATE7}_frag.mp4
$MP4DASH -f --use-segment-timeline ${OUTNAME}__${BITRATE1}_frag.mp4 ${OUTNAME}_${BITRATE2}_frag.mp4 ${OUTNAME}_${BITRATE3}_frag.mp4 ${OUTNAME}_${BITRATE4}_frag.mp4 ${OUTNAME}_${BITRATE5}_frag.mp4 ${OUTNAME}_${BITRATE6}_frag.mp4 ${OUTNAME}_${BITRATE7}_frag.mp4 -o output -m manifest.mpd --use-segment-list
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment