Youtube 视频地址解析 C#

来源:互联网 发布:外国软件 编辑:程序博客网 时间:2024/05/16 06:11

第一篇博客,最近再整国内各大视频网站真实视频地址解析,觉得很有必要共享给大家,那就从Youtube开始吧~

首先,需要能翻墙,我就拿goagent来说吧,其他的翻墙我也没用过,goagent开启后,选择设置IE代理,如下所示:

好了,正式开始吧~


第一步:获取vid,比如:https://www.youtube.com/watch?v=LyjKbMlaMbM,vid就是LyjKbMlaMbM

第二部:获取视频信息:”http://www.youtube.com/get_video_info?video_id=“ + vid,获取的是一个文件,文件中包含了视频地址、清晰度等信息,现在说下如何获取这个信息。

1.下载上述文件,并且获取文件中的字符串信息。

           //下载信息文件            string infoURL = "http://www.youtube.com/get_video_info?video_id=" + vid;            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(infoURL);            Stream ns = request.GetResponse().GetResponseStream();            byte[] nbytes = new byte[512];            int nReadSize;            string info = "";            while (true)            {                nReadSize = ns.Read(nbytes, 0, 512);                if (nReadSize == 0) break;                //转成字符串                info += Encoding.Default.GetString(nbytes);            }
2.用正则表达式从info中获取关键信息。

            //提取出视频关键信息部分            string regStr = "&url_encoded_fmt_stream_map=(.+?)&";            Regex reg = new Regex(regStr);            Match match = reg.Match(info);            info = match.Groups[1].Value;            //解码            info = Uri.UnescapeDataString(info);
现在获取到的信息是以“,”(无引号)分隔的不同清晰度视频的信息。

3.将每种清晰度文件的信息提取出来,每种清晰度的信息中又包含了5项参数:itag,quality, type ,fallback_host,url,顺序不定,以&分隔。

    <pre name="code" class="csharp">            string[] parts = info.Split(',').ToArray();//每种清晰度的参数            Hashtable ht;//存放一种清晰度的参数键值对            List<Hashtable> infoList = new List<Hashtable>();//信息列表
            for (int i = 0; i < parts.Length; i++)            {//对于每一种清晰度                string[] part_info = parts[i].Split('&').ToArray();//一种清晰度的参数                ht = new Hashtable();//新建一个HashTable                for(int j = 0; j < part_info.Length; j++)                {                    string[] pair = part_info[j].Split('=').ToArray();//键值对,itag,quality, type ,fallback_host,url                    ht.Add(pair[0], Uri.UnescapeDataString(pair[1]));                }                //加入列表                infoList.Add(ht);            }

4.到这里,infoList中已经包含了各种清晰度的视频信息,每种清晰度的视频信息保存在一个Hashtable中,以键值对的形式保存。取出其中键为url的值即为该清晰度对应的视频下载地址。

最后把获取视频信息的全部代码附上:

        private static List<Hashtable> getVideoInfo(string vid)        {            List<Hashtable> infoList = new List<Hashtable>();//信息列表            //下载信息文件            string infoURL = "http://www.youtube.com/get_video_info?video_id=" + vid;            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(infoURL);            Stream ns = request.GetResponse().GetResponseStream();            byte[] nbytes = new byte[512];            int nReadSize;            string info = "";            while (true)            {                nReadSize = ns.Read(nbytes, 0, 512);                if (nReadSize == 0) break;                //转成字符串                info += Encoding.Default.GetString(nbytes);            }            //提取出视频关键信息部分            string regStr = "&url_encoded_fmt_stream_map=(.+?)&";            Regex reg = new Regex(regStr);            Match match = reg.Match(info);            info = match.Groups[1].Value;            //解码            info = Uri.UnescapeDataString(info);            string[] parts = info.Split(',').ToArray();//每种清晰度的参数            Hashtable ht;//存放一种清晰度的参数键值对            for (int i = 0; i < parts.Length; i++)            {//对于每一种清晰度                string[] part_info = parts[i].Split('&').ToArray();//一种清晰度的参数                ht = new Hashtable();//新建一个HashTable                for(int j = 0; j < part_info.Length; j++)                {                    string[] pair = part_info[j].Split('=').ToArray();//键值对,itag,quality, type ,fallback_host,url                    ht.Add(pair[0], Uri.UnescapeDataString(pair[1]));                }                //加入列表                infoList.Add(ht);            }            return infoList;        }


转载请说明出处。

0 0