Вопрос по java, android, exoplayer, youtube – Как воспроизвести видео с YouTube в ExoPlayer на Android?

33

Я пытаюсь воспроизвести видео на YouTube в exoplayer, но здесь есть некоторая путаница, я не знаю, что такое DASH url, у меня есть только реальная ссылка на YouTube, как "https://www.youtube.com/watch?v=v1uyQZNg2vEMsgstr "я понятия не имею, как создать реальный URL для тире.

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

Реальный URL:

 https://www.youtube.com/watch?v=v1uyQZNg2vE
Есть ли какой-либо действительный способ генерировать DASH URL из видео идентификатора androidXP
@SuryaPrakashKushawah Но я думаю, что YouTube не позволяет извлекать видео, неофициальное решение. Amit Prajapati
Вам удалось сгенерировать DASH URL? Zsolt Boldizsár

Ваш Ответ

4   ответа
12

который получает реальный URL-адрес потокового видео YouTube для таких форматов, как DASH и HLS, используяhttp://www.youtube.com/get_video_info?&video_id=[video_id]&el=info&ps=default&eurl=&gl=US&hl=en URL с идентификатором видео, как описаноКарим Абделл Салам, Я также проверил URL в приложении, которое используетExoPlayer и это работает:

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

    }
}

Вот тестовый код:

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();
    }
}
Отличный ответ! Спасибо! user486312
Отличная работа! Thaaanx Karim Abdell Salam
@ MARK002-MAB, я пробовал выше код, его работа только временная. Magesh Pandian
@MageshPandian Используйте его в примере приложения ExoPlayer. У них есть жестко закодированные ссылки, которые я проверял в последний раз. Просто добавь свой. MARK002-MAB
7

ае это настоящий URL-адрес), а затем выполнить поиск в разделе «url_encoded_fmt_stream_map». В этом разделе вы получите URI, который необходимо дважды декодировать, чтобы получить искомый URL-адрес DASH.

Можете ли вы показать нам пример URI, как это выглядит? Parinda Rajapaksha
1

эту библиотеку

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

и просто получить URL-адрес, как это, а затем играть в 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);
8

но я наконец нашел самое простое решение, и оно работает так хорошо

Сначала вам нужно позвонить по этому адресу.

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

и не забудьте поменять последний идентификатор на целевой.

Теперь вы получите уведомление о загрузке файла с именем get_video_info без расширения.попробуйте открыть этот файл с помощью блокнота и так.Теперь у вас есть нужные данные, но вы не можете их прочитать, потому что они закодированы. Вам нужен HTML-декодер, чтобы использовать эти данные:http://meyerweb.com/eric/tools/dencoder/

-просто вставьте свои данные и нажмите декодировать несколько раз, чтобы убедиться, что они хорошо декодируются

наконец, найдите ключ с именем dashmpd

и наслаждайтесь URL

Или используйте это простое решение

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'
Используйте этот URLyoutube.com/... вместо Karim Abdell Salam
Там нет ключа под названием «dashmpd». Оно все еще доступно? Parinda Rajapaksha
Не работаетreason=Invalid+parameters.&status=fail&errorcode=2 это то, что я получил Akshay Taru
реализация 'com.github.HaarigerHarald: android-youtubeExtractor: v1.7.0' Karim Abdell Salam

Похожие вопросы