游戏使用VideoView高品质的Youtube视频高品质、游戏、视频、Youtube

2023-09-05 11:11:05 作者:你若结婚 我便劫婚

我工作的一个音乐应用程序,显示歌词和歌曲有关的信息,并也起着歌从YouTube网址。

I'm working on a music APP that displays lyrics and info about songs and also plays songs from a youtube URL.

在我的活性,有一些TextViews(用于歌词/信息)和一个VideoView(用于YouTube的链接)。

In my activity, there are some TextViews (for the lyrics/info) and one VideoView (for the youtube link).

我已经创建了一个名为YoutubeVideo,即执行以下操作:

I've created a class called YoutubeVideo, that does the following:

下载这个页面的内容:的 http://gdata.youtube.com/feeds/api/videos?q=SONG_NAME&v=2&max-results=1 ,解析它的内容,并得到了YouTube的ID(如 EvuL5jyCHOw )。这是一个RSS源的搜索视频和显示器1的结果页(所有我需要做的是改变查询)。 下载这个页面的内容:的http://gdata.youtube.com/feeds/api/videos?q=YOUTUBES_ID&format=1&alt=json,解析它的内容,并得到RTSP(如的rtsp://v7.cache3...3gp )。这是一个XML文件,该文件包含有关视频的一些信息(名称,长度,缩略图,当然 - rtsp链接:)。 在比所有我需要做的是设置RTSP为VideoURI: VideoView.setVideoURI(Uri.parse(RTSP))和视频正在播放 Downloads the content of this page: http://gdata.youtube.com/feeds/api/videos?q=SONG_NAME&v=2&max-results=1, parses it's content and gets the youtube's id (e.g EvuL5jyCHOw). This is a RSS feeds page that searches for videos and display 1 result (And all I need to do is to change the query). Downloads the content of this page: http://gdata.youtube.com/feeds/api/videos?q=YOUTUBES_ID&format=1&alt=json, parses it's content and gets the rtsp (e.g rtsp://v7.cache3...3gp). This is an XML file that holds some information about the video (name, length, thumbnail and of course - rtsp link :). Than all I need to do is to set the rtsp as VideoURI: VideoView.setVideoURI(Uri.parse(rtsp)) and the video is being played.

如果你想知道,我使用这个类像这样:新YoutubeVideo(VideoView).setVideo(艺术家++称号);

If you wonder, I use this class like that: new YoutubeVideo(VideoView).setVideo(artist + " " + title);

它的工作原理,但我有一个问题:这是一个3GP文件......其中有非常糟糕的质量。 我怎样才能得到质量更好的网址? (MP4 / FLV /等?)

It works, but I got one problem: It's a 3gp file... Which has really bad quality. How can I get better quality urls? (mp4/flv/ect?)

推荐答案

我设法写一个函数,得到一个YouTube视频的HTML code(HTML源文件code)和返回数组所有的可用的视频链接。然后,我选择取得了令人瞩目的质量环节,并显示不佳3GP它代替。

I managed to write a function that gets a youtube video html code (the html source code) and returns an array with all of the available video links. Then I select a hight quality link, and display it instead of the poor 3gp.

这不是完美的,可能会有一些错误和改进措施,使:

It's not perfect, and there may be some bugs and improvments to make:

    protected String[] extractLinks(String result) {
    //The title of the downloaded file
    String title = "bla bla bla";
    // An array of strings that will hold the links (in case of error, it will hold 1 string)
    String[] temper = new String[1];

    try{
        // Extract the "url_encoded_fmt_stream_map" attr from the flash object
        Pattern p = Pattern.compile("url_encoded_fmt_stream_map(.*?);");          
        Matcher m = p.matcher(result);
        List<String> matches = new ArrayList<String>();
        while(m.find()){
            matches.add(m.group().replace("url_encoded_fmt_stream_map=", "").replace(";", ""));                   
        }
        String[] streamMap = null;
        List<String> links = new ArrayList<String>();

        if(matches.get(0) != null &&  matches.get(0) != ""){
            // Split the "url_encoded_fmt_stream_map" into an array of strings that hold the link values
            streamMap = matches.get(0).split("%2C");
            for (int i = 0; i < streamMap.length; i++){
                String url = "";
                String sig = "";

                //Using regex, we will get the video url.
                Pattern p2 = Pattern.compile("url%3D(.*?)%26");       
                Matcher m2 = p2.matcher(streamMap[i]);
                List<String> matches2 = new ArrayList<String>();
                while(m2.find()){
                    // We don't need the "url=...&" part.
                    matches2.add(m2.group().substring(6, m2.group().length() - 3));
                }                     
                url = matches2.get(0);   

                //Using regex again, we will get the video signature.               
                p2 = Pattern.compile("sig%3D(.*?)%26");       
                m2 = p2.matcher(streamMap[i]);
                matches2 = new ArrayList<String>();
                while(m2.find()){
                // We don't need the "sig=...&" part.               
                    matches2.add(m2.group().substring(6, m2.group().length() - 3));
                }                     
                sig = matches2.get(0);   

                //Now lets add a link to our list. Link = url + sig + title.
                links.add(URLDecoder.decode(URLDecoder.decode(url + "&signature=", "UTF-8") + sig + "%26title%3D" + URLDecoder.decode(title, "UTF-8"), "UTF-8"));
            }
        }
        else{
        links.add("No download Links");
        }
        //Now lets make temper point to a array that holds the list items (aka links).
        temper = links.toArray(new String[links.size()]);
    }
    catch(Exception ex){
    temper[0] = ex.getMessage();
    }
    // That's it! temper has direct download links from youtube!
    return temper;
}