web-dev-qa-db-fra.com

Comment lire une vidéo Youtube dans ExoPlayer sur Android?

J'essaie de lire une vidéo YouTube dans exoplayer, mais voici une certaine confusion, je ne sais pas ce qu'est l'URL DASH, je n'ai qu'une vraie URL YouTube comme " https://www.youtube.com/watch?v= v1uyQZNg2vE ", je ne sais pas comment générer une URL de tiret sous forme d'URL réelle.

URL de tiret:

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),

URL réelle:

 https://www.youtube.com/watch?v=v1uyQZNg2vE
36
Amit Prajapati

J'ai écrit une classe qui récupère l'URL de streaming vidéo YouTube réelle pour un format comme DASH et HLS en utilisant http://www.youtube.com/get_video_info?&video_id= [video_id] & el = info & ps = default & eurl = & gl = US & hl = en url avec ID vidéo comme décrit par Karim Abdell Salam . J'ai également testé l'URL dans une application qui utilise ExoPlayer et cela fonctionne:

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();
        }

    }
}

Voici le code de test:

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();
    }
}
12
MARK002-MAB

J'ai eu le même problème mais j'ai finalement trouvé la solution la plus simple et son fonctionnement si bon

  1. Vous devez d'abord appeler cette URL ..

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

et n'oubliez pas de changer le dernier identifiant par celui cible.

  1. vous recevrez maintenant un avis pour télécharger un fichier appelé get_video_info sans extesion.
  2. essayez d'ouvrir ce fichier en utilisant le bloc-notes et ainsi.
  3. Vous avez maintenant les bonnes données mais vous ne pouvez pas les lire car elles sont encodées. Vous avez besoin d'un décodeur HTML pour lire ces données, utilisez celui-ci: http://meyerweb.com/eric/tools/dencoder/

-Juste collez vos données et appuyez sur décoder plusieurs fois pour vous assurer qu'elles sont bien décodées

enfin rechercher une clé appelée dashmpd

et profitez de votre URL

Ou utilisez cette solution simple

private void extractYoutubeUrl() {
    @SuppressLint("StaticFieldLeak") YouTubeExtractor mExtractor = new YouTubeExtractor(this) {
        @Override
        protected void onExtractionComplete(SparseArray<YtFile> sparseArray, VideoMeta videoMeta) {
            if (sparseArray != null) {
                playVideo(sparseArray.get(17).getUrl());
            }
        }
    };
    mExtractor.extract(mYoutubeLink, true, true);

implementation 'com.github.HaarigerHarald:Android-youtubeExtractor:v1.7.0'
8
Karim Abdell Salam

Vous devrez obtenir la réponse HTTP à partir de l'URL youtube (dans votre cas, l'URL réelle) puis rechercher la section "url_encoded_fmt_stream_map". Dans cette section, vous obtiendrez un URI qui doit être décodé deux fois pour obtenir l'URL DASH que vous recherchez.

7
GAG'sB

pour lire une vidéo youtube dans exoplayer, nous pouvons utiliser cette bibliothèque

https://github.com/HaarigerHarald/Android-youtubeExtractor

et obtenez simplement l'url comme ça, puis jouez en exoplyer

String youtubeLink = "http://youtube.com/watch?v=xxxx";

new YouTubeExtractor(this) {
    @Override
    public void onExtractionComplete(SparseArray<YtFile> ytFiles, VideoMeta vMeta) {
        if (ytFiles != null) {
            int itag = 22;
        String downloadUrl = ytFiles.get(itag).getUrl();
        }
    }
}.extract(youtubeLink, true, true);
1
sajad abbasi