介绍 本文将会暂时如何仅仅使用C#来下载youtub视频,代码简单也容易理解,每个人都可以把它整合到自己的工程项目里。
我没有使用任何第三方的库来完成这段代码,你所要做的仅仅是把两个.cs文件整合进你的项目里。
使用代码 这个工程里有两个主要的类
YouTubeVideoQuality Class(youtube视频质量类)
public class YouTubeVideoQuality { /// <summary> /// Gets or Sets 文件名 /// </summary> public string Videotitle: { get; set; } /// <summary> /// Gets or Sets 文件扩展 /// </summary> public string Extention { get; set; } /// <summary> /// Gets or Sets 文件地址 /// </summary> public string DownloadUrl { get; set; } /// <summary> /// Gets or Sets 视频地址 /// </summary> public string VideoUrl { get; set; } /// <summary> /// Gets or Sets 文件大小 /// </summary> public Size Dimension { get; set; } public override string ToString() { return Extention + " File " + Dimension.Width + "x" + Dimension.Height; } public void SetQuality(string Extention, Size Dimension) { this.Extention = Extention; this.Dimension = Dimension; } } YouTubeDownloader Class(youtube下载类)
public class YouTubeDownloader { public static List<YouTubeVideoQuality> GetYouTubeVideoUrls(params string[] VideoUrls) { List<YouTubeVideoQuality> urls = new List<YouTubeVideoQuality>(); foreach (var VideoUrl in VideoUrls) { string html = Helper.DownloadWebPage(VideoUrl); string title: = GetTitle(html); foreach (var videoLink in ExtractUrls(html)) { YouTubeVideoQuality q = new YouTubeVideoQuality(); q.VideoUrl = VideoUrl; q.Videotitle: = title; q.DownloadUrl = videoLink + "&title=" + title; if (getQuality(q)) urls.Add(q); } } return urls; } private static string GetTitle(string RssDoc) { string str14 = Helper.GetTxtBtwn(RssDoc, "'VIDEO_TITLE': '", "'", 0); if (str14 == "") str14 = Helper.GetTxtBtwn(RssDoc, "\"title\" content=\"", "\"", 0); if (str14 == "") str14 = Helper.GetTxtBtwn(RssDoc, "&title=", "&", 0); str14 = str14.Replace(@"\", "").Replace("'", "'").Replace( "\"", """).Replace("<", "<").Replace( ">", ">").Replace("+", " "); return str14; } private static List<string> ExtractUrls(string html) { html = Uri.UnescapeDataString(Regex.Match(html, "url_encoded_fmt_stream_map=(.+?)&", RegexOptions.Singleline).Groups[1].ToString()); MatchCollection matchs = Regex.Matches(html, "url=(.+?)&quality=(.+?)&fallback_host=(.+?)&type=(.+?)&itag=(.+?),", RegexOptions.Singleline); bool firstTry = matchs.Count > 0; if (!firstTry) matchs = Regex.Matches(html, "itag=(.+?)&url=(.+?)&type=(.+?)&fallback_host=(.+?)&sig=(.+?)&quality=(.+?),{0,1}", RegexOptions.Singleline); List<string> urls = new List<string>(); foreach (Match match in matchs) { if (firstTry) urls.Add(Uri.UnescapeDataString(match.Groups[1] + "")); else urls.Add(Uri.UnescapeDataString(match.Groups[2] + "") + "&signature=" + match.Groups[5]); } return urls; } private static bool getQuality(YouTubeVideoQuality q) { if (q.DownloadUrl.Contains("itag=5")) q.SetQuality("flv", new Size(320, 240)); else if (q.DownloadUrl.Contains("itag=34")) q.SetQuality("flv", new Size(400, 226)); else if (q.DownloadUrl.Contains("itag=6")) q.SetQuality("flv", new Size(480, 360)); else if (q.DownloadUrl.Contains("itag=35")) q.SetQuality("flv", new Size(640, 380)); else if (q.DownloadUrl.Contains("itag=18")) q.SetQuality("mp4", new Size(480, 360)); else if (q.DownloadUrl.Contains("itag=22")) q.SetQuality("mp4", new Size(1280, 720)); else if (q.DownloadUrl.Contains("itag=37")) q.SetQuality("mp4", new Size(1920, 1280)); else if (q.DownloadUrl.Contains("itag=38")) q.SetQuality("mp4", new Size(4096, 72304)); else return false; return true; } } 有趣的地方 使用这个代码,你可以根据你的网速来选择不同品质的视频来下载
...