2015-04-22 34 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不會喜歡它涉及