Как расшифровать файлы ts, указанные в файле m3u8?

У меня есть URL-адрес файла m3u8, в котором есть список файлов ts. Все эти файлы зашифрованы методом AES-128. Наряду с файлами ts файл m3u8 также содержит URI для ключей.

Сначала я хочу загрузить файлы ts, а затем расшифровать их. После расшифровки я хочу воспроизвести эти файлы.

URL-адрес моего файла m3u8 похож на 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

Я не понимаю, как я могу это сделать. Пожалуйста, помогите.


person Arun Badole    schedule 09.01.2013    source источник
comment
Ну, вы должны это знать: что вы уже пробовали?   -  person rekire    schedule 09.01.2013
comment
Я могу загрузить все файлы ts. Но поскольку они зашифрованы, я не могу играть.   -  person Arun Badole    schedule 09.01.2013
comment
Данные, кажется, зашифрованы с помощью AES-128, ищут класс CipherInputStream.   -  person rekire    schedule 09.01.2013
comment
Я не понимаю. Перечисленный выше m3u8 должен работать из коробки. Вам не нужно расшифровывать. Медиафреймворк может сделать это автоматически.   -  person Florian Pilz    schedule 09.01.2013
comment
@FlorianPilz Да, я могу воспроизвести файл m3u8 непосредственно в VideoView. Но согласно моему требованию я должен извлечь файлы ts, а затем воспроизвести их все вручную. Пожалуйста, помогите ..   -  person Arun Badole    schedule 09.01.2013


Ответы (2)


Как упоминалось в моем комментарии, расшифровка AES-128 выполняется автоматически на устройствах Android 3.x и 4.x с помощью медиафреймворка.

Однако в вашем m3u8 есть ошибка. Пожалуйста, поменяйте порядок #EXTINF и #EXT-X-KEY. #EXTINF требует, чтобы следующая строка содержала URI TS.

Ниже цитата из проекта HLS.

EXTINF — это маркер записи, описывающий файл мультимедиа, идентифицируемый следующим за ним URI. Каждому URI медиафайла ДОЛЖЕН предшествовать тег EXTINF.

person Florian Pilz    schedule 09.01.2013
comment
Но я могу воспроизводить тот же m3u8, когда использую его с Media Framework, и я хочу расшифровать и воспроизвести файлы ts. - person Arun Badole; 09.01.2013

Я сделал почти то же самое некоторое время назад. Я писал об этом здесь: https://andreasvolkmann.github.io//m3u8-and-ts-segments/

В основном берется список воспроизведения m3u8 с зашифрованными сегментами ts и превращается в один файл 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))) }
}
person avolkmann    schedule 07.06.2018