使用openssl加密的HLS视频在原生iOS播放器上无法播放

3

我在使用openssl加密HLS时遇到了问题。如下所述:使用openssl加密Apple的HTTP Live Streaming,我正在使用以下脚本来加密由ffmpeg创建的TS文件:

encyptionKeyFile="crypt.key"
openssl rand 16 > $encyptionKeyFile
encryptionKey=`cat $encyptionKeyFile | hexdump -e '16/1 "%02x"'`

splitFilePrefix="$fileName.split."
encryptedSplitFilePrefix="${splitFilePrefix}enc."

numberOfTsFiles=`ls ${splitFilePrefix}*.ts | wc -l`

for i in {0..$numberOfTsFiles}; do
    initializationVector=`printf '%032x' $i`
    openssl aes-128-cbc -e -in ${splitFilePrefix}$i.ts -out ${encryptedSplitFilePrefix}$i.ts -nosalt -iv $initializationVector -K $encryptionKey
    rm ${splitFilePrefix}$i.ts
done


用于生成TS文件的ffmpeg命令如下:

ffmpeg -i $file -codec copy -map 0 -f segment -vbsf h264_mp4toannexb -segment_list $mainPlaylistName -segment_time 10 ${splitFilePrefix}%d.ts


M3U8播放列表文件如下:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-KEY:METHOD=AES-128,URI=crypt.key
#EXT-X-TARGETDURATION:19
#EXTINF:11.875000,
BigBuckBunnyMovie.split.enc.0.ts
#EXTINF:11.166667,
BigBuckBunnyMovie.split.enc.1.ts
#EXTINF:12.500000,
BigBuckBunnyMovie.split.enc.2.ts
#EXTINF:12.166667,
BigBuckBunnyMovie.split.enc.3.ts
#EXTINF:8.375000,
...
#EXT-X-ENDLIST

我认为这可能是编码问题或ffmpeg命令格式问题,但问题在于加密流无法在原生iOS播放器(MPMoviePlayerController)上工作,但可以在VLC上正常使用。更重要的是,未加密的流(使用ffmpeg生成的TS文件)可在原生播放器和VLC上使用!
你能否建议我该如何才能在原生iOS视频播放器上播放它?
感谢您的所有回应!

iOS 播放器是否正在请求 crypt.key 的 URI?我不确定它是否会接受那样的相对 URL。 - vipw
我认为这应该不是问题。无论如何,如果我将其更改为“URI=http://localhost/crypt.key”,它也会失败。 - mateusz.dzwonek
相同 - 什么都不会发生,玩家不会请求钥匙。 - mateusz.dzwonek
这是一个冒险的尝试,但或许可以将 EXT-X-KEY 行放在 EXT-X-TARGETDURATION 之后?你确定播放器甚至没有请求密钥(也就是说从服务器端可以看到)吗? - vipw
在所引用的问答中,他们使用hexdump来格式化密钥文件--你为什么不这样做呢? - vipw
显示剩余6条评论
1个回答

1
该草案规范说明URI值是一个带引号的字符串。请参见草案规范的3.4.4部分。

不知道您是否能够帮忙看一下我的新的HLS视频问题:https://stackoverflow.com/q/60852109/470749。谢谢! - Ryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接