2015-04-22 36 views
2

我发现了一些原始的编码和加密视频文件的bash脚本,到HLS流中,并且我稍微编辑了它(我对bash没有任何意见):加密的HLS作为直播流,不起作用为视频点播

#!/bin/bash 

set -e  # Exit on errors 

tsFile="$1" 

if ! [ -f "$tsFile" -a -r "$tsFile" ]; then 
    echo "First argument is required" >&2 
    exit 2 
fi 

if [ -z "$3" ]; then 
    output="output" 
else 
    output="$3" 
fi 


keyFile="$output.key" 
keyInfoFile="$output.keyinfo" 
playList="$output.m3u8" 

if [ -z "$4" ]; then 
    separator='-' 
else 
    separator="$4" 
fi 

splitFilePrefix="$output$separator" 


if [ -d "$2" ]; then 
    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)) 

for i in $(seq -f "%03g" 0 $numberOfTsFiles); do 
    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" 

这导致了这样的事情:

#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 

这几乎工程。不过,我需要一个VOD,而不是直播。所以,我补充了一行:

#EXT-X-PLAYLIST-TYPE:VOD 

现在它不适用于加密段,只有未加密段。我认为所有细分都是分开加密的?另外,即使使用未加密的文件,关于总长度的信息也不存在。我该如何解决这个问题?

+0

'EXT-X-PLAYLIST-TYPE'是可选的。如果您添加了“EXT-X-ENDLIST”,则表明该播放列表包含最后一个片段,并且不会再刷新。你如何在ios设备上测试流? – aergistal

+0

另外,'EXT-X-KEY'适用于音段,并且您可以在播放列表中有多个。我认为标签的正确位置应该在第一个“EXTINF”之前。它不应该有所作为,但谁知道... – aergistal

+0

我在Windows上测试,通过VLC – Misiur

回答

1

这里有几个基于我自己的实验的指针,这些指针似乎适用于VLC,iOS和Android。

  • 初始向量

    当在播放列表中的每个段都有一个默认IV等于媒体序列没有指定IV。确保segment-000具有IV = 0,segment-001具有IV = 1等等。

  • 引述URI

    的iOS似乎并不喜欢的播放列表,其中URI不使用引号所以使用EXT-X-KEY:METHOD=AES-128,URI="output.key"

  • 播放列表类型VOD

    EXT-X-PLAYLIST-TYPE是可选的,如只要您最后有EXT-X-ENDLIST,播放列表就被视为静态并允许您查找。无论是否使用此标签,VLC和iOS都会将您的播放列表视为VOD。

    关于媒体持续时间,VLC显示0 wile iOS显示正确的值。

    如果指定EXT-X-PLAYLIST-TYPE:VOD确保它之后EXT-X-VERSION:3或VLC不会喜欢它涉及