android - 使用 ExoPlayer 播放 YouTube 视频

标签 android youtube-api android-youtube-api exoplayer

我有兴趣使用 ExoPlayer用于 YouTube 视频播放。我从 ExoPlayer samples 看到他们通过 DASH URL 播放 YouTube 视频。

我正在使用 Android YouTube API 搜索视频,但看不到任何获取任何搜索结果的 DASH URL 的方法。是否有人知道将 YouTube API (v3) 与 ExoPlayer 集成的任何示例(不使用硬编码的视频 url),或者知道从 YouTube API 获取我需要的信息以将视频加载到 ExoPlayer 的方法?

最佳答案

要获取DASH URL,需要下载文件:http://www.youtube.com/get_video_info?&video_id= "+ videoId(sample "BU2zodCxwwo")。解析文件,获取“dashmpd”并使用。

开始 url dashmpd,结束 url 首先 &

example(dashmpd=http://manifest.googlevideo.com/api/manifest/dash/fexp/3300133%2C3300164%2C3312381%2C9416126%2C9418044%2C9418777%2C9419452%2C9420096%2C9420452%2C9422596%2C9423291%2C9423455%2C9423661%2C9423662%2C9426963%2C9427247%2C9427888%2C9428559%2C9428564%2C9429237%2C9429515/mm/31/source/youtube/expire/1456756908/itag/0/upn/5xR9ZCMatkY/mn/sn-ov8vuxaxjvh-v8ce/key/yt6/ipbits/0/hfr/1/id/o-AIiY1RGtClDFVTCNTuhp8pRSGDPgiBHby0Il52tFnHix/sparams/as%2Chfr%2Cid%2Cip%2Cipbits%2Citag%2Cmm%2Cmn%2Cms%2Cmv%2Cpl%2Cplayback_host%2Csource%2Cexpire/sver/3/pl/16/s/3640F01A917CDAD260DD0BB27CE627BB9A113ED1.3CEF418955ADD2F9C2048C289AD8D0E1FB6D5F034034/ms/au/mv/m/playback_host/r1---sn-ov8vuxaxjvh-v8ce.googlevideo.com/mt/1456735204/as/fmp4_audio_clear%2Cwebm_audio_clear%2Cfmp4_sd_hd_clear%2Cwebm_sd_hd_clear%2Cwebm2_sd_hd_clear/ip/37.193.113.79)

此 URL 用于 XML 文件,其中包含有关视频的信息。这个 URL 很少有生命,并不是所有的视频都包含 fmp4 格式。如果您使用旧 URL 或不包含 fmp4 格式的视频,则会出现 403 错误(您的客户端无权获取 URL)。这个问题的解决方法,我还没找到。

   public static Observable<String> downloadSound(String youtubeUrl, final String baseDir) {

        return DownloadManager.downloadFile("http://www.youtube.com/get_video_info?&video_id=" + youtubeUrl, baseDir + File.separator + FILEYOUTUBE, new DownloadManager.IDownloadProgress() {
            @Override
            public void onProgress(long current, long max) {

            }
        })
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .map(new Func1<File, String>() {
                    @Override
                    public String call(File youtubeFile) {
                        String dashmpd = null;
                        BufferedReader br = null;
                        try {
                            br = new BufferedReader(new FileReader(youtubeFile.toString()));
                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                        }
                        try {
                            StringBuilder sb = new StringBuilder();
                            String line = br.readLine();

                            while (line != null) {
                                sb.append(line);
                                line = br.readLine();
                            }

                            String everything = sb.toString();

                            Log.d("TAG", everything);
                            dashmpd = getQueryParams(everything);

                        } catch (IOException e) {
                            e.printStackTrace();
                        } finally {
                            try {
                                br.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                        return dashmpd;
                    }
                });
    }

    public static String getQueryParams(String url) {
        String dashUrl1 = url.substring(url.lastIndexOf("dashmpd"));
        String dashUrl2 = dashUrl1.substring(dashUrl1.lastIndexOf("dashmpd"), dashUrl1.indexOf("&"));
        String dashUrl = null;
        try {
            dashUrl = URLDecoder.decode(dashUrl2.substring(dashUrl2.indexOf("http")), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        return dashUrl;
    }

关于android - 使用 ExoPlayer 播放 YouTube 视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28075116/

相关文章:

Android 应用安装尝试失败,出现 : Failure [INSTALL_FAILED_OLDER_SDK]

android - 统一社交API

android - Android 4.3 上的 YouTube 嵌入式播放器

youtube-api - YouTube Android Player API 上的视频质量

android - 有没有办法在一个屏幕上同时播放两个 youtube 视频?

android - 无法加载现代控件 UI。升级到最新版本的 Android YouTube API

java - Android - 从一个 Activity 中调用另一个 Activity 的方法,而不启动新 Activity

android - 如何以编程方式获取 Android 导航栏的高度和宽度?

youtube-api - YouTube API - 当前观众订购的直播?

zend-framework - 是否可以使用 Zend 库上传到 youtube,但延迟列出它,直到我指定的时间?