Después de indagar en diferentes repositorios y páginas finalmente nos encontramos con la respuesta que te enseñamos más adelante.
Solución:
Las versiones recientes de ffmpeg deberían poder descifrar las transmisiones AES-128 HLS. No necesitas un servidor web. Si el m3u8
Los URI/rutas son incorrectos, puede:
- crear un directorio
- copia el key a un key archivo, es decir
my.key
y colóquelo en el directorio dir. Tenga en cuenta que keys se puede rotar, si la lista de reproducción tiene múltiples keys cópielos todos en diferentes archivos. - copie todo
.ts
segmentos al mismo directorio - copiar y editar el
playlist.m3u8
y use solo el(los) nombre(s) de archivo para el key(s) URI(s) y segmentos. -
para obtener un solo
.ts
archivo hacer:ffmpeg -i playlist.m3u8 -c copy output.ts
-
si solo desea la transmisión de audio sin el
.ts
contenedor se puede extraer. Por ejemplo: suponiendo que tiene una sola transmisión de audio usando elAAC
ejecución del códec:ffmpeg -i playlist.m3u8 -map 0:a -c copy output.aac
Esto extraerá el AAC
transmitir a un archivo sin volver a codificar. Si desea un códec diferente a su fuente, tendrá que volver a codificar.
Si por alguna razón tienes que usar openssl
para descifrar los segmentos tenga en cuenta que si no IV
se especifica entonces el IV
es igual a la secuencia de medios del segmento, es decir. el primer segmento tiene IV=0
el segundo tiene IV=1
y así. Después del descifrado, actualice la lista de reproducción para señalar los segmentos descifrados y elimine el EXT-X-KEY
línea. Si sigue esta ruta, ni siquiera necesita ffmpeg para obtener una sola .ts
archivo como MPEG-TS es directamente concatenable, es decir. solo puedes usar cat
en los segmentos descifrados.
He tenido pocas horas libres hoy y jugué con esto. Para resumir, esa base64 key está encriptado AES. Este cifrado adicional se realiza con key que se genera dinámicamente a partir de los datos del dispositivo… lo que significa que incluso si tengo una carpeta de datos completa de su dispositivo, no podría descifrarla.
Ahora, cuando posee un dispositivo rooteado con datos fuera de línea, eso es otro asunto: obviamente puede inyectar su código para interceptar key cuando se descifra para que el contenido pueda comenzar a reproducirse… así es como lo obtuve.
Cuando tienes la debida keyel descifrado y unión de archivos *.ts es trivial. Te recomiendo que uses FFMPEG para esta tareami código C# que dejo para ilustración funciona bien solo funciona en algunos casos (dependiendo de cómo se codifican los archivos):
var folder = "path_to_folder";
byte[] encryptionKey = File.ReadAllBytes(folder + "path_to_key.key");
var outputFile = "c:\i_love_you_guys.ts";
using (FileStream outputFileStream = new FileStream(outputFile, FileMode.Create))
var files = Directory.GetFiles(folder, "*.ts");
for (int i = 0; i < files.Length; i++)
byte[] encryptionIV = new byte[16];
using (FileStream inputFileStream = new FileStream(files[i], FileMode.Open))
using (var aes = new AesManaged Key = encryptionKey, IV = encryptionIV, Mode = CipherMode.CBC )
using (var encryptor = aes.CreateDecryptor())
using (var cryptoStream = new CryptoStream(inputFileStream, encryptor, CryptoStreamMode.Read))
cryptoStream.CopyTo(outputFileStream);
Entonces, esto resultó ser una búsqueda inútil. Lo que dice @aergistal en su respuesta es completamente válido siempre que tenga la my.key
. Por lo tanto, enfóquese en obtener key en formato plano y el descifrado será muy fácil.