读取init中的pssh和kid

This commit is contained in:
nilaoda 2022-07-18 16:07:48 +08:00
parent 0a47208a0c
commit ddd3931f57
2 changed files with 70 additions and 0 deletions

View File

@ -0,0 +1,62 @@
using N_m3u8DL_RE.Common.Util;
namespace Mp4SubtitleParser
{
public class MP4InitUtil
{
private static readonly byte[] SYSTEM_ID_WIDEVINE = { 0xED, 0xEF, 0x8B, 0xA9, 0x79, 0xD6, 0x4A, 0xCE, 0xA3, 0xC8, 0x27, 0xDC, 0xD5, 0x1D, 0x21, 0xED };
private static readonly byte[] SYSTEM_ID_PLAYREADY = { 0x9A, 0x04, 0xF0, 0x79, 0x98, 0x40, 0x42, 0x86, 0xAB, 0x92, 0xE6, 0x5B, 0xE0, 0x88, 0x5F, 0x95 };
public static string? ReadWVPssh(byte[] data)
{
string? pssh = null;
//parse init
new MP4Parser()
.Box("moov", MP4Parser.Children)
.FullBox("pssh", (box) =>
{
if (!(box.Version == 0 || box.Version == 1))
throw new Exception("PSSH version can only be 0 or 1");
var systemId = box.Reader.ReadBytes(16);
if (SYSTEM_ID_WIDEVINE.SequenceEqual(systemId))
{
var dataSize = box.Reader.ReadUInt32();
pssh = Convert.ToBase64String(box.Reader.ReadBytes((int)dataSize));
}
})
.Parse(data);
return pssh;
}
public static string? ReadWVKid(byte[] data)
{
string? kid = null;
//parse init
new MP4Parser()
.Box("moov", MP4Parser.Children)
.Box("trak", MP4Parser.Children)
.Box("mdia", MP4Parser.Children)
.Box("minf", MP4Parser.Children)
.Box("stbl", MP4Parser.Children)
.FullBox("stsd", MP4Parser.SampleDescription)
.FullBox("encv", MP4Parser.AllData((data) =>
{
kid = HexUtil.BytesToHex(data[^16..]).ToLower();
}))
.FullBox("enca", MP4Parser.AllData((data) =>
{
kid = HexUtil.BytesToHex(data[^16..]).ToLower();
}))
.FullBox("enct", MP4Parser.AllData((data) =>
{
kid = HexUtil.BytesToHex(data[^16..]).ToLower();
}))
.FullBox("encs", MP4Parser.AllData((data) =>
{
kid = HexUtil.BytesToHex(data[^16..]).ToLower();
}))
.Parse(data);
return kid;
}
}
}

View File

@ -74,6 +74,14 @@ namespace N_m3u8DL_RE.DownloadManager
task.Increment(1);
//修改输出后缀
output = Path.ChangeExtension(output, ".mp4");
if (result != null && result.Success)
{
var data = File.ReadAllBytes(result.ActualFilePath);
var pssh = MP4InitUtil.ReadWVPssh(data);
var kid = MP4InitUtil.ReadWVKid(data);
if (pssh != null) Logger.WarnMarkUp($"[grey]PSSH(WV): {pssh}[/]");
if (kid != null) Logger.WarnMarkUp($"[grey]KID: {kid}[/]");
}
}
//开始下载