这可能有点黑客行为,但给定 .m3u8 文件的 URL,它将下载并解密构成流的文件:
#!/usr/bin/env bash
curl "$1" -s | awk 'BEGIN {c=0} $0 ~ "EXT-X-KEY" {urlpos=index($0,"URI=")+5; ivpos=index($0,"IV="); keyurl=substr($0, urlpos, ivpos-urlpos-2); iv=substr($0, ivpos+5); print "key=`curl -s '\''"keyurl"'\'' | hexdump -C | head -1 | sed \"s/00000000//;s/|.*//;s/ //g\"`"; print "iv="iv} $0 !~ "-KEY" && $0 ~ "http" {printf("curl -s '\''"$0"'\'' | openssl aes-128-cbc -K $key -iv $iv -d >seg%05i.ts\n", c++)}' | bash
该脚本生成第二个脚本,用于提取密钥和初始化向量并在下载时使用它们进行解密。它需要curl、awk、hexdump、sed 和openssl 才能运行。它可能会因未加密的流或使用 AES-128 以外的流(是否支持任何其他加密?)而阻塞。
你会得到一堆文件:seg00000.ts、seg00001.ts 等。使用 tsMuxeR (https://www.videohelp.com/software/tsMuxeR)将它们合并到一个文件中(简单的串联对我来说不起作用......这是我首先尝试的):
(echo "MUXOPT --no-pcr-on-video-pid --new-audio-pes --vbr --vbv-len=500"; (echo -n "V_MPEG4/ISO/AVC, "; for i in seg*.ts; do echo -n "\"$i\"+"; done; echo ", fps=30, insertSEI, contSPS, track=258") | sed "s/+,/,/"; (echo -n "A_AAC, "; for i in seg*.ts; do echo -n "\"$i\"+"; done; echo ", track=257") | sed "s/+,/,/") >video.meta
tsMuxeR video.meta video.ts
(轨道 ID 和帧速率可能需要调整...通过将下载的文件之一传递到 tsMuxeR 来获取要使用的值。)
然后使用 ffmpeg 重新混合为更广泛理解的内容:
ffmpeg -i video.ts -vcodec copy -acodec copy video.m4v