bash - Encrypted HLS works as live stream, doesn't work as VOD -
i've found crude bash script encoding , encrypting video file, hls stream, , i've edited (i have no idea bash):
#!/bin/bash set -e # exit on errors tsfile="$1" if ! [ -f "$tsfile" -a -r "$tsfile" ]; echo "first argument required" >&2 exit 2 fi if [ -z "$3" ]; output="output" else output="$3" fi keyfile="$output.key" keyinfofile="$output.keyinfo" playlist="$output.m3u8" if [ -z "$4" ]; separator='-' else separator="$4" fi splitfileprefix="$output$separator" if [ -d "$2" ]; outdir="$2" else mkdir "$2" || exit 1 outdir="$2" fi tempdir="$outdir/.$$_tmp" keyfile="$outdir/$keyfile" mkdir $tempdir echo "$outdir/$keyfile\n$outdir/$keyfile" > "$outdir/$keyinfofile" ffmpeg -i "$tsfile" -hls_time 5 -hls_list_size 0 -hls_segment_filename "$tempdir/$splitfileprefix%03d.ts" -strict -2 "$tempdir/$playlist" openssl rand 16 > $keyfile encryptionkey=`cat $keyfile | hexdump -e '16/1 "%02x"'` numberoftsfiles=$(( `ls "$tempdir/$splitfileprefix"*.ts | wc -l` -1 )) in $(seq -f "%03g" 0 $numberoftsfiles); initializationvector=`printf '%032x' $(( 10#$i))` openssl aes-128-cbc -e -in "$tempdir/$splitfileprefix"$i.ts \ -out "$outdir/$splitfileprefix"$i.ts -nosalt -iv $initializationvector -k $encryptionkey done { head -4 "$tempdir/$playlist" echo '#ext-x-key:method=aes-128,uri='"$keyfile" egrep "$tempdir/$playlist" -vie '#ext-x-targetduration:' \ | tail -n +4 } > "$outdir/$playlist" #rm -r "$tempdir" this results in this:
#extm3u #ext-x-version:3 #ext-x-media-sequence:0 #ext-x-key:method=aes-128,uri=output.key #ext-x-targetduration:11 #extinf:10.176833, output-000.ts #extinf:8.341667, output-001.ts #extinf:8.341667, output-002.ts #extinf:3.136467, output-003.ts #ext-x-endlist this works. need vod, not live stream. so, added line:
#ext-x-playlist-type:vod and doesn't work encrypted segments, unencrypted ones. thought segments crypted separately? also, unencrypted files, info total length isn't present. how can fix that?
here few pointers based on own experiments seem work on vlc, ios , android.
initialization vectors
when no
ivspecified in playlist each segment has defaultivequal media sequence. make sure segment-000 has iv=0, segment-001 has iv=1 , on.quoting
uriios doesn't seem playlist
uridoesn't use quotes useext-x-key:method=aes-128,uri="output.key"playlist type
vodext-x-playlist-typeoptional and, long haveext-x-endlist@ end, playlist treated static , allows seek. or without tag both vlc , ios treat playlist vod.concerning media duration, vlc shows 0 wile ios shows correct value.
if do specify
ext-x-playlist-type:vodmake sure comes afterext-x-version:3or vlc won't it.
Comments
Post a Comment