2015-04-13 3 views
25

Sto cercando di riprodurre il video di YouTube in exoplayer ma qui è un po 'di confusione non so cosa sia l'URL di DASH, ho solo url youtube reale come "https://www.youtube.com/watch?v=v1uyQZNg2vE", non ho idea di come generare un url di dash dall'URL reale .Come riprodurre i video di YouTube in ExoPlayer in Android?

Dash Url:

new Sample("Google Glass", 
     "http://www.youtube.com/api/manifest/dash/id/bf5bb2419360daf1/source/youtube?" 
     + "as=fmp4_audio_clear,fmp4_sd_hd_clear&sparams=ip,ipbits,expire,as&ip=0.0.0.0&" 
     + "ipbits=0&expire=19000000000&signature=255F6B3C07C753C88708C07EA31B7A1A10703C8D." 
     + "2D6A28B21F921D0B245CDCF36F7EB54A2B5ABFC2&key=ik0", DemoUtil.TYPE_DASH), 

reale Url:

https://www.youtube.com/watch?v=v1uyQZNg2vE 
+1

Siete riusciti a generare l'url DASH? –

+0

Esiste un modo valido per generare l'URL DASH dall'ID video – androidXP

risposta

6

Si dovrà ottenere la risposta HTTP dal youtube URL (nel vostro URL reale caso) e quindi cercare la sezione " url_encoded_fmt_stream_map". In quella sezione otterrai un URI che deve essere decodificato due volte per ottenere l'URL DASH che stai cercando.

+0

Puoi mostrarci un URI di esempio come è? –

7

Ho avuto lo stesso problema, ma ho finalmente trovato la soluzione più semplice e il suo lavoro così buono

  1. In primo luogo è necessario chiamare questo URL ..

    HTTP GET: https://www.youtube.com/get_video_info?&video_id=[video_id]&el=info&ps=default&eurl=&gl=US&hl=en

e non dimenticare di cambiare l'ultimo ID con quello di destinazione.

  1. ora si otterrà la notifica per scaricare un file chiamato get_video_info senza estensione.
  2. prova ad aprire questo file usando il blocco note e così via.
  3. Ora avete i dati giusti, ma non si può leggere, perché la sua codificata È necessario decoder HTML per canna questo utilizzo di dati questo: http://meyerweb.com/eric/tools/dencoder/

-proprio incollare i dati e premere decodificare i parecchi volte a garantire che decodificato ben

infine la ricerca di una chiave denominata dashmpd e godere ur URL

+1

Non c'è una chiave chiamata 'dashmpd'. È ancora disponibile? –

+0

Utilizza questo URL https://www.youtube.com/get_video_info?&video_id=[video_id]&el=info&ps=default&eurl=&gl=US&hl=en invece –

9

ho scritto una classe che recupera effettivo URL streaming video di YouTube per il formato come DASH e HLS utilizzando 0.123.240,432 mila URLcon ID video come descritto da Karim Abdell Salam. Ho anche testato l'URL in un app che utilizza ExoPlayer e funziona:

import java.io.BufferedInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.UnsupportedEncodingException; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.ProtocolException; 
import java.net.URL; 
import java.net.URLDecoder; 
import java.util.Map; 
import java.util.TreeMap; 

/** 
* Represents youtube video information retriever. 
*/ 
public class YouTubeVideoInfoRetriever 
{ 
    private static final String URL_YOUTUBE_GET_VIDEO_INFO = "http://www.youtube.com/get_video_info?&video_id="; 

    public static final String KEY_DASH_VIDEO = "dashmpd"; 
    public static final String KEY_HLS_VIDEO = "hlsvp"; 

    private TreeMap<String, String> kvpList = new TreeMap<>(); 

    public void retrieve(String videoId) throws IOException 
    { 
     String targetUrl = URL_YOUTUBE_GET_VIDEO_INFO + videoId+"&el=info&ps=default&eurl=&gl=US&hl=en"; 
     SimpleHttpClient client = new SimpleHttpClient(); 
     String output = client.execute(targetUrl, SimpleHttpClient.HTTP_GET, SimpleHttpClient.DEFAULT_TIMEOUT); 
     parse(output); 
    } 

    public String getInfo(String key) 
    { 
     return kvpList.get(key); 
    } 

    public void printAll() 
    { 
     System.out.println("TOTAL VARIABLES=" + kvpList.size()); 

     for(Map.Entry<String, String> entry : kvpList.entrySet()) 
     { 
      System.out.print("" + entry.getKey() + "="); 
      System.out.println("" + entry.getValue() + ""); 
     } 
    } 

    private void parse(String data) throws UnsupportedEncodingException 
    { 
     String[] splits = data.split("&"); 
     String kvpStr = ""; 

     if(splits.length < 1) 
     { 
      return; 
     } 

     kvpList.clear(); 

     for(int i = 0; i < splits.length; ++i) 
     { 
      kvpStr = splits[i]; 

      try 
      { 
       // Data is encoded multiple times 
       kvpStr = URLDecoder.decode(kvpStr, SimpleHttpClient.ENCODING_UTF_8); 
       kvpStr = URLDecoder.decode(kvpStr, SimpleHttpClient.ENCODING_UTF_8); 

       String[] kvpSplits = kvpStr.split("=", 2); 

       if(kvpSplits.length == 2) 
       { 
        kvpList.put(kvpSplits[0], kvpSplits[1]); 
       } 
       else if(kvpSplits.length == 1) 
       { 
        kvpList.put(kvpSplits[0], ""); 
       } 
      } 
      catch (UnsupportedEncodingException ex) 
      { 
       throw ex; 
      } 
     } 
    } 

    public static class SimpleHttpClient 
    { 
     public static final String ENCODING_UTF_8 = "UTF-8"; 
     public static final int DEFAULT_TIMEOUT = 10000; 

     public static final String HTTP_GET = "GET"; 

     public String execute(String urlStr, String httpMethod, int timeout) throws IOException 
     { 
      URL url = null; 
      HttpURLConnection conn = null; 
      InputStream inStream = null; 
      OutputStream outStream = null; 
      String response = null; 

      try 
      { 
       url = new URL(urlStr); 
       conn = (HttpURLConnection) url.openConnection(); 
       conn.setConnectTimeout(timeout); 
       conn.setRequestMethod(httpMethod); 

       inStream = new BufferedInputStream(conn.getInputStream()); 
       response = getInput(inStream); 
      } 
      finally 
      { 
       if(conn != null && conn.getErrorStream() != null) 
       { 
        String errorResponse = " : "; 
        errorResponse = errorResponse + getInput(conn.getErrorStream()); 
        response = response + errorResponse; 
       } 

       if (conn != null) 
       { 
        conn.disconnect(); 
       } 
      } 

      return response; 
     } 

     private String getInput(InputStream in) throws IOException 
     { 
      StringBuilder sb = new StringBuilder(8192); 
      byte[] b = new byte[1024]; 
      int bytesRead = 0; 

      while (true) 
      { 
       bytesRead = in.read(b); 
       if (bytesRead < 0) 
       { 
        break; 
       } 
       String s = new String(b, 0, bytesRead, ENCODING_UTF_8); 
       sb.append(s); 
      } 

      return sb.toString(); 
     } 

    } 
} 

Ecco il codice di prova:

public static void main(String[] args) 
{ 
    String youTubeVideoID = "v1uyQZNg2vE"; 

    YouTubeVideoInfoRetriever retriever = new YouTubeVideoInfoRetriever(); 

    try 
    { 
     retriever.retrieve(youTubeVideoID); 
     System.out.println(retriever.getInfo(YouTubeVideoInfoRetriever.KEY_DASH_VIDEO)); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
} 
+0

Ottima risposta! Grazie! – user486312

+0

Ottimo lavoro! Thaaanx –

+0

@ MARK002-MAB, ho provato sopra il codice il suo lavoro solo temporaneo.its falliscono dopo qualche tempo –