【问题标题】:How to decrypt ts files given in a m3u8 file?如何解密 m3u8 文件中给出的 ts 文件?
【发布时间】:2020-05-07 00:27:25
【问题描述】:

我有一个 m3u8 文件的 url,其中包含 ts 文件列表。所有这些文件都通过 AES-128 方法加密。与 ts 文件一起,m3u8 文件还包含密钥的 URI。

首先我想下载ts文件然后解密它们。解密后我想播放这些文件。

我的 m3u8 文件的 URL 类似于 https://example.com/myxml/myclips/250/prog_index.m3u8

我的 m3u8 文件如下所示。

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:2
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10, 
#EXT-X-KEY:METHOD=AES-128,URI="https://my.server.com/myxml/myclips/keys/250/crypt_480x272_250_0.key",IV=0x8da4a2d80b88785f7931874bf1e0914b
fileSequence0.ts
#EXTINF:10, 
fileSequence1.ts
#EXTINF:10, 
fileSequence2.ts
#EXTINF:10, 
fileSequence3.ts
#EXTINF:10, 
fileSequence4.ts
#EXTINF:10, 
fileSequence5.ts
#EXTINF:10, 
fileSequence6.ts
#EXTINF:10, 
fileSequence7.ts
#EXTINF:10, 
fileSequence8.ts
#EXTINF:10, 
fileSequence9.ts
#EXTINF:10, 
fileSequence10.ts
#EXTINF:10, 
fileSequence11.ts
#EXTINF:10, 
#EXT-X-KEY:METHOD=AES-128,URI="https://my.server.com/myxml/myclips/keys/250/crypt_480x272_250_1.key",IV=0x8e2d35559338d21f2586e79d6cd5c606
fileSequence12.ts
#EXTINF:10, 
fileSequence13.ts
#EXTINF:10, 
fileSequence14.ts
#EXTINF:10, 
fileSequence15.ts
#EXTINF:10, 
fileSequence16.ts
#EXTINF:10, 
fileSequence17.ts
#EXTINF:10, 
fileSequence18.ts
#EXTINF:10, 
fileSequence19.ts
#EXTINF:2,  
fileSequence20.ts
#EXT-X-ENDLIST

我不知道该怎么做。请帮忙。

【问题讨论】:

  • 嗯,你应该知道:你尝试过什么?
  • 我可以下载所有的 ts 文件。但是由于这些文件是加密的,所以我无法播放。
  • 数据似乎使用 AES-128 加密,查找 CipherInputStream 类。
  • 我不明白。上面列出的 m3u8 应该可以开箱即用。您无需解密。媒体框架能够自动执行此操作。
  • @FlorianPilz 是的,我可以直接在 VideoView 中播放 m3u8 文件。但根据我的要求,我必须提取 ts 文件,然后必须手动播放所有文件。请帮助..

标签: android m3u8


【解决方案1】:

正如我在评论中提到的,AES-128 解密是由媒体框架在 Android 3.x 和 4.x 设备上自动完成的。

但是,你的 m3u8 有一个错误。请颠倒#EXTINF 和#EXT-X-KEY 的顺序。 #EXTINF 要求在下一行包含 TS URI。

下面是HLS draft的引用

EXTINF 是一个记录标记,用于描述由 跟在它后面的 URI。每个媒体文件 URI 必须以 EXTINF 标记。

【讨论】:

  • 但是当我将它与 Media Framework 一起使用时,我可以播放相同的 m3u8 并且我想要的是解密和播放 ts 文件。
【解决方案2】:

不久前我也做了几乎相同的事情。我在这里写过: https://andreasvolkmann.github.io//m3u8-and-ts-segments/

基本上采用带有加密 ts 片段的 m3u8 播放列表并将其转换为一个 mp3 文件。

但是我不在 Android 上。 以下代码对我有用(Kotlin):

fun getCipher(data: EncryptionData): Cipher {
    val bytes = URL(data.uri).readBytes()
    val chainmode = "CBC"
    val method = when (data.method) {
        EncryptionMethod.AES -> "AES/$chainmode/NoPadding"
        else -> data.method.name
    }
    val keySpec = SecretKeySpec(bytes, data.method.name)
    logger.trace("Decrypting using method ${data.method} ($method)")
    return Cipher
        .getInstance(method)
        .apply { init(Cipher.DECRYPT_MODE, keySpec, IvParameterSpec(ByteArray(16))) }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 2017-02-23
    • 2018-05-30
    • 1970-01-01
    • 2013-04-14
    • 2019-02-02
    • 1970-01-01
    相关资源
    最近更新 更多