Skip to content

Instantly share code, notes, and snippets.

@danrossi
Created May 9, 2013 12:27
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save danrossi/5547158 to your computer and use it in GitHub Desktop.
Save danrossi/5547158 to your computer and use it in GitHub Desktop.
This script generates HLS streaming files with variant playlist and alternate audio. Uses mediafilesegmenter and variantplaylistcreator
#!/bin/sh
usage()
{
cat << EOF
usage: $0 options
This script generates HLs streaming files with variant playlist and alternate audio.
OPTIONS:
-h Show this message
-u The absolute base url ie http://domain.com/hls/.
-s The basename for the segment files.
-b The list of bitrates ie "200 400 600 1000".
-d The target duration. defaults to 10.
-f The file base path.
-i The video input file prefix ie /src/path/bigbuckbunny_{bitrate}k.mp4.
-I The video input file for audio only prefix ie /src/path/bigbuckbunny_{lang}_{bitrate}k.mp4.
-p The index name.
-P The main playlist index name.
-a A a list of bitrates for audio only streams ie "200 400"
EOF
}
(( $# )) || usage
BASE_URL=
SEGMENT_BASENAME=
FILENAME_PREFIX=
AUDIO_FILENAME_PREFIX=
BITRATES=
AUDIO_BITRATES=
TARGET_DURATION=10
FILE_PATH=
AUDIO_FILE_PATH=
INDEX_NAME=
DST_DIR="."
ALT_AUDIO=
PLAYLIST_ARGS=
LANGUAGES=
LANGUAGE_LABELS=
MAIN_INDEX_NAME="main_all.m3u8"
while getopts “hi:u:s:b:d:f:F:I:l:L:p:P:o:a:” OPTION
do
case $OPTION in
h)
usage
exit 1
;;
u)
BASE_URL=" -b $OPTARG"
;;
s)
SEGMENT_BASENAME=" -B $OPTARG"
;;
b)
BITRATES=$OPTARG
;;
d)
TARGET_DURATION=$OPTARG
;;
f)
FILE_PATH=" -f $OPTARG"
;;
F)
AUDIO_FILE_PATH=" -f $OPTARG"
;;
i)
FILENAME_PREFIX="$OPTARG"
;;
I)
AUDIO_FILENAME_PREFIX="$OPTARG"
;;
p)
INDEX_NAME=" -i $OPTARG.m3u8"
;;
P)
MAIN_INDEX_NAME="$OPTARG.m3u8"
;;
o)
DST_DIR=$OPTARG
;;
a)
AUDIO_BITRATES=$OPTARG
;;
l)
LANGUAGES=$OPTARG
;;
L)
LANGUAGE_LABELS=($OPTARG)
;;
?)
usage
exit
;;
esac
done
cd $DST_DIR
SRC_PATH=$(dirname "$FILENAME_PREFIX");
PLAYLIST_URL=
i=0;
## get video streams with bitrates
for BITRATE in $BITRATES
do
## format the segment path with index or bitrate
BITRATE_FILE_PATH=${FILE_PATH/{index\}/${i}};
BITRATE_FILE_PATH=${BITRATE_FILE_PATH/{bitrate\}/${BITRATE}};
## format the source fileame with bitrate
BITRATE_FILE_NAME=${FILENAME_PREFIX/{bitrate\}/${BITRATE}};
## format the playlist index name with index or bitrate
INDEX_NAME_ARG=${INDEX_NAME/{index\}/${i}};
INDEX_NAME_ARG=${INDEX_NAME/{bitrate\}/${BITRATE}000};
INDEX_NAME_FILE=${INDEX_NAME_ARG/ -i /""};
BITRATE_FILE_DIR=${BITRATE_FILE_PATH/ -f /""};
## format the segment name
SEGMENT_BASENAME_ARG=${SEGMENT_BASENAME/{bitrate\}/${BITRATE}000};
PLAYLIST_URL=
PLAYLIST_FILE="${BITRATE_FILE_NAME%.*}.plist"
if [ -n "${BASE_URL}" ]; then
PLAYLIST_URL="${BASE_URL}/";
#replace extra end slash if needed
PLAYLIST_URL=${BASE_URL/\w\/\//\/};
fi
if [ -n ${BITRATE_FILE_DIR} ]; then
if [ ! -d ${BITRATE_FILE_DIR} ]; then
mkdir ${BITRATE_FILE_DIR};
fi
PLAYLIST_URL+="${BITRATE_FILE_DIR}/";
fi
PLAYLIST_URL+=${INDEX_NAME_FILE}
PLAYLIST_ARGS+="${PLAYLIST_URL} ${PLAYLIST_FILE} "
echo "Creating segments for bitrate ${BITRATE} from file ${BITRATE_FILE_NAME}"
#echo "-I --quiet -z none -t ${TARGET_DURATION} ${BASE_URL} ${SEGMENT_BASENAME_ARG} ${INDEX_NAME_ARG} ${BITRATE_FILE_PATH} ${BITRATE_FILE_NAME}"
mediafilesegmenter -I --quiet -z none -t ${TARGET_DURATION} ${BASE_URL} ${SEGMENT_BASENAME_ARG} ${INDEX_NAME_ARG} ${BITRATE_FILE_PATH} "${BITRATE_FILE_NAME}" > /dev/null 2>&1
((i = i + 1))
done
AUDIO_MEDIA=
## get audio only streams for different languages
i=0;
## get available audio bitrates for different languages
for BITRATE in $AUDIO_BITRATES
do
lang=0;
## get different languages
for LANGUAGE in $LANGUAGES
do
## format the segment path with language
BITRATE_FILE_PATH=${AUDIO_FILE_PATH/{index\}/${i}};
BITRATE_FILE_PATH=${BITRATE_FILE_PATH/{bitrate\}/${BITRATE}};
BITRATE_FILE_PATH=${BITRATE_FILE_PATH/{lang\}/${LANGUAGE}};
BITRATE_FILE_DIR=${BITRATE_FILE_PATH/ -f /""};
## format the playlist index name with index or bitrate
INDEX_NAME_ARG=${INDEX_NAME/{index\}/${i}};
INDEX_NAME_ARG=${INDEX_NAME/{bitrate\}/${BITRATE}000};
INDEX_NAME_FILE=${INDEX_NAME_ARG/ -i /""};
## format the source fileame with bitrate and language
BITRATE_FILE_NAME=${AUDIO_FILENAME_PREFIX/{bitrate\}/${BITRATE}};
#BITRATE_FILE_NAME=${BITRATE_FILE_NAME/{lang\}/${LANGUAGE}};
BITRATE_FILE_NAME=${BITRATE_FILE_NAME/{lang\}/${LANGUAGE}};
## format the segment name
SEGMENT_BASENAME_ARG=${SEGMENT_BASENAME/{bitrate\}/${BITRATE}000};
if [ -n ${BITRATE_FILE_DIR} ]; then
if [ ! -d ${BITRATE_FILE_DIR} ]; then
mkdir ${BITRATE_FILE_DIR};
fi
fi
AUDIO_MEDIA+="#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=\"audio-${BITRATE}\",URI=\"${PLAYLIST_URL}\",LANGUAGE=\"${LANGUAGE}\",NAME=\"${LANGUAGE_LABELS[${lang}]}\"\n"
echo "Creating segments for alternative audio with bitrate ${BITRATE} from file ${BITRATE_FILE_NAME} and language ${LANGUAGE}"
#echo "--quiet -z none -a -t ${TARGET_DURATION} ${BASE_URL} ${SEGMENT_BASENAME_ARG} ${INDEX_NAME_ARG} ${BITRATE_FILE_PATH} ${BITRATE_FILE_NAME}"
mediafilesegmenter --quiet -z none -a -t ${TARGET_DURATION} ${BASE_URL} ${SEGMENT_BASENAME_ARG} ${INDEX_NAME_ARG} ${BITRATE_FILE_PATH} "${BITRATE_FILE_NAME}" > /dev/null 2>&1
((lang = lang + 1))
done
((i = i + 1))
done
echo "Creating variant playlist ${MAIN_INDEX_NAME}"
variantplaylistcreator -resolution-tags -o ${MAIN_INDEX_NAME} $PLAYLIST_ARGS
if [ -n ${AUDIO_MEDIA} ]; then
echo "Adding alternate audio files to variant playlist ${MAIN_INDEX_NAME}"
PLAYLIST=`tail -n +2 ${MAIN_INDEX_NAME}`
PLAYLIST="#EXTM3U\n$AUDIO_MEDIA\n${PLAYLIST}"
echo "${PLAYLIST}" > ${MAIN_INDEX_NAME}
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment