/// <summary> /// 下载M3U8视频的头数据(Key 和 Map)(如果存在) /// </summary> /// <param name="head"></param> /// <param name="savedir"></param> public static bool DownloadM3U8Head(M3U8Head head, string savedir) { using (var client = new WebClient()) { try { if (head.IsEncrypt) { var kuri = new Uri(head.KeyUrl); var kfile = kuri.LocalPath.Substring(kuri.LocalPath.LastIndexOf('/') + 1); var keyfile = Path.Combine(savedir, kfile); head.Key = client.DownloadData(head.KeyUrl); File.WriteAllBytes(keyfile, head.Key); head.KeyFile = keyfile; } if (head.HasMap) { var mapurl = new Uri(head.MapUrl); var filename = mapurl.LocalPath.Substring(mapurl.LocalPath.LastIndexOf('/')); var savefile = Path.Combine(savedir, filename); client.DownloadFile(head.MapUrl, savefile); head.MapFile = savefile; } return(true); } catch { return(false); } } }
public M3U8File(Uri url, M3U8Head head, ICollection <M3U8Segment> nodes) { RESOLUTION = ""; Head = head; _nodes = new List <M3U8Segment>(nodes); SourceUrl = url; Name = SourceUrl.LocalPath.Substring(SourceUrl.LocalPath.LastIndexOf('/') + 1); TotalSeconds = _nodes.Sum(p => p.Seconds); TotalTime = TimeSpan.FromSeconds(TotalSeconds); }
public static M3U8Head AnalyzeM3U8Head(Uri urlfix, string content) { if (content.StartsWith("#EXTM3U")) { var head = new M3U8Head(); var strs = content.Split('\n'); foreach (var str in strs) { if (str.StartsWith("#EXTINF:")) { break; } if (str.StartsWith("#EXT-X-VERSION:")) { head.VERSION = str.Substring(15); } else if (str.StartsWith("#EXT-X-TARGETDURATION:")) { var durstr = str.Substring(22); if (double.TryParse(durstr, out var dr)) { head.TARGETDURATION = dr; } } else if (str.StartsWith("#EXT-X-MEDIA-SEQUENCE:")) { var seqstr = str.Substring(22); if (int.TryParse(seqstr, out var seq)) { head.MEDIA_SEQUENCE = seq; } } else if (str.StartsWith("#EXT-X-MAP:")) { head.HasMap = true; var strr = str.Substring(11); var init = strr.Substring(4);//Trim URI= var map = init.Trim('\"'); if (map.Contains("://")) { head.MapUrl = map; } else if (map.StartsWith("/")) { head.MapUrl = urlfix.Scheme + "://" + urlfix.Authority + map; } else { head.MapUrl = urlfix + map; } } else if (str.StartsWith("#EXT-X-KEY:")) { var strr = str.Substring(11); var kvs = strr.Split(','); foreach (var nvs in kvs) { var nv = nvs.Split('='); if (nv[0] == "METHOD") { head.IsEncrypt = true; head.EncryptMethod = nv[1]; } else if (nv[0] == "URI") { var k = nv[1].Trim('\"'); if (k.Contains(":")) { head.KeyUrl = k; } else if (k.StartsWith("/")) { head.KeyUrl = urlfix.Scheme + "://" + urlfix.Authority + k; } else { head.KeyUrl = urlfix + k; } } else if (nv[0] == "IV") { head.IV = nv[1]; } } } } return(head); } return(null); }