2015-01-21 26 views
30

Tôi quan tâm đến việc sử dụng ExoPlayer để phát lại video trên YouTube. Tôi thấy từ số ExoPlayer samples rằng họ phát video YouTube thông qua URL DASH.Phát lại video trên YouTube với ExoPlayer

Tôi đang sử dụng API YouTube trên Android để tìm kiếm video và không thấy phương tiện để nhận URL DASH cho bất kỳ kết quả tìm kiếm nào. Có ai đó biết về bất kỳ mẫu nào để tích hợp API YouTube (v3) với ExoPlayer (không sử dụng url video được mã hóa cứng) hay biết cách lấy thông tin tôi cần từ API YouTube để tải video vào ExoPlayer?

+2

Kiểm tra điều này có thể hữu ích cho bạn https://github.com/florent37/TutosAndroidFrance/tree/master/MyYoutube –

Trả lời

5

Để nhận được URL DASH, bạn cần phải tải về tập tin:. http://www.youtube.com/get_video_info?&video_id= "+ videoid (mẫu "BU2zodCxwwo"). Phân tích tập tin, nhận được "dashmpd" và sử dụng nó

url Bắt đầu dashmpd, cuối url đầu tiên &.

dụ (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 này f hoặc tệp XML, nơi có thông tin về video. URL này ít sống và không phải tất cả các video đều chứa định dạng fmp4. Nếu bạn sử dụng URL cũ hoặc video không chứa định dạng fmp4, bạn nhận được lỗi 403 (Khách hàng của bạn không có quyền nhận URL). Các giải pháp cho vấn đề này, tôi đã không tìm thấy.

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; 
    } 
Các vấn đề liên quan