Created
May 9, 2013 12:27
-
-
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
This file contains 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/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