解密TS文件后移除M3U8密钥行无法播放,如何解决?
解决解密TS文件后M3U8无法播放的问题
嘿,我来帮你捋清楚这个问题的根源和解决办法:
问题根源分析
你遇到的情况是:原M3U8带#EXT-X-KEY字段时,播放器能自动用密钥解密TS并播放;但手动解密TS后,移除KEY字段的M3U8却无法播放。这大概率出在两个地方:
- 解密过程不符合HLS规范:你的Python代码里用密钥本身作为AES-CBC的IV(初始化向量),这其实不符合HLS的默认规则——虽然单个TS能播放,但播放器处理明文TS的M3U8时可能出现兼容性问题。
- M3U8文件未正确对应解密后的TS:即使TS解密正确,如果M3U8里的文件名还是指向加密的TS,或者结构有小瑕疵,播放器也无法正常加载。
第一步:修正TS解密代码
根据HLS规范,如果#EXT-X-KEY没有指定IV参数,每个TS的IV应该是媒体序号(EXT-X-MEDIA-SEQUENCE的值 + 当前TS的序号)的16字节大端二进制表示(不足16字节时前面补0)。比如第一个TS序号是0,IV就是b'\x00' * 16;第二个是1,IV就是b'\x00'*15 + b'\x01'。
修正后的解密代码如下:
from Crypto.Cipher import AES # 读取密钥(注意原M3U8里是v.key,要和你的密钥文件名对应) key = open('v.key', 'rb').read() # 对应M3U8里的EXT-X-MEDIA-SEQUENCE值 base_sequence = 0 def decrypt_single_ts(input_ts_path, output_ts_path, ts_sequence): # 生成符合HLS规范的IV iv = ts_sequence.to_bytes(16, byteorder='big') cryptor = AES.new(key, AES.MODE_CBC, iv) with open(input_ts_path, 'rb') as f_in: encrypted_data = f_in.read() # AES是块加密,解密后需要移除PKCS7填充 decrypted_data = cryptor.decrypt(encrypted_data) # 去掉末尾的填充(最后一个字节为填充长度) padding_length = decrypted_data[-1] decrypted_data = decrypted_data[:-padding_length] with open(output_ts_path, 'wb') as f_out: f_out.write(decrypted_data) # 批量解密你的TS文件(根据实际数量调整循环范围) for ts_index in range(3): input_file = f'hd-kUPE5cpako-{ts_index}.ts' output_file = f'hd-decrypted-{ts_index}.ts' # 计算当前TS的完整序号:基础序号 + 索引 full_sequence = base_sequence + ts_index decrypt_single_ts(input_file, output_file, full_sequence)
第二步:修改M3U8文件内容
解密完成后,需要调整M3U8的内容,确保它指向解密后的明文TS,同时移除加密相关字段:
修改后的M3U8内容应该是这样的:
#EXTM3U #EXT-X-VERSION:4 #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-INDEPENDENT-SEGMENTS #EXT-X-TARGETDURATION:3 #EXT-X-MEDIA-SEQUENCE:0 #EXTINF:3.014160, hd-decrypted-0.ts #EXTINF:3.014160, hd-decrypted-1.ts #EXTINF:3.014160, hd-decrypted-2.ts #EXT-X-ENDLIST
注意点:
- 彻底移除
#EXT-X-KEY:METHOD=AES-128,URI="v.key"这一行 - 把每个TS文件名替换成解密后的文件名(比如
hd-kUPE5cpako-0.ts改成hd-decrypted-0.ts) - 保留其他所有HLS标签,它们是播放器正常解析的必要信息
最后检查事项
- 确保解密后的TS文件和修改后的M3U8文件在同一目录下,或者文件名路径正确
- 验证单个解密后的TS确实能正常播放(你已经确认过这一点,没问题)
- 如果还是无法播放,可以尝试降低
EXT-X-VERSION的值(比如改成3),适配一些老旧播放器
按照这个流程操作后,你的M3U8应该就能正常播放解密后的TS文件了。
内容的提问来源于stack exchange,提问作者PJ.Javis




