You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

解密TS文件后移除M3U8密钥行无法播放,如何解决?

解决解密TS文件后M3U8无法播放的问题

嘿,我来帮你捋清楚这个问题的根源和解决办法:

问题根源分析

你遇到的情况是:原M3U8带#EXT-X-KEY字段时,播放器能自动用密钥解密TS并播放;但手动解密TS后,移除KEY字段的M3U8却无法播放。这大概率出在两个地方:

  1. 解密过程不符合HLS规范:你的Python代码里用密钥本身作为AES-CBC的IV(初始化向量),这其实不符合HLS的默认规则——虽然单个TS能播放,但播放器处理明文TS的M3U8时可能出现兼容性问题。
  2. 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标签,它们是播放器正常解析的必要信息

最后检查事项

  1. 确保解密后的TS文件和修改后的M3U8文件在同一目录下,或者文件名路径正确
  2. 验证单个解密后的TS确实能正常播放(你已经确认过这一点,没问题)
  3. 如果还是无法播放,可以尝试降低EXT-X-VERSION的值(比如改成3),适配一些老旧播放器

按照这个流程操作后,你的M3U8应该就能正常播放解密后的TS文件了。

内容的提问来源于stack exchange,提问作者PJ.Javis

火山引擎 最新活动