web-dev-qa-db-fra.com

Comment lire des vidéos Youtube en mode vidéo Android?

Je développe une application Android qui nécessite un lecteur de vidéo youtube intégré. J'ai réussi à obtenir l'URL de la vidéo RTSP auprès de l'API, mais lors de la tentative de chargement de cette URL rtsp dans ma vue vidéo Android, il indique "Can't play this video.". Auparavant, j'avais développé une application similaire avec cette méthode, et cela fonctionnait bien à ce moment-là, mais son chargement a également échoué.

Je suis sûr que je reçois l'URL RTSP correcte de l'API. rtsp://v6.cache6.c.youtube.com/CiULENy73wIaHAlV9VII3c64lRMYESARFEgGUglwbGF5bGlzdHMM/0/0/0/video.3gp

Voici mon code d'activité:

    mVideoURL = getIntent().getStringExtra("EXT_URL");
    Log.i("VIDEO URL", " " + mVideoURL);

    MediaController mc = new MediaController(this);
    mVideoStreamView = (VideoView) findViewById(R.id.vidPlayer);

    mVideoStreamView.setVideoURI(Uri.parse(mVideoURL));
    mVideoStreamView.setMediaController(mc);
    mVideoStreamView.requestFocus();
    mVideoStreamView.start();

EDIT Quelques informations supplémentaires ont été trouvées dans le logcat:

ARTSPConnection(6607): status: RTSP/1.0 200 OK
ASessionDescription(6607): v=0
ASessionDescription(6607): o=GoogleStreamer 378992432 328144046 IN IP4 74.125.213.182
ASessionDescription(6607): s=Video
ASessionDescription(6607): c=IN IP4 0.0.0.0
ASessionDescription(6607): b=AS:29
ASessionDescription(6607): t=0 0
ASessionDescription(6607): a=control:*
ASessionDescription(6607): a=range:npt=0-1703.000000
ASessionDescription(6607): m=video 0 RTP/AVP 98
ASessionDescription(6607): b=AS:17
ASessionDescription(6607): a=rtpmap:98 H263-2000/90000
ASessionDescription(6607): a=control:trackID=0
ASessionDescription(6607): a=cliprect:0,0,144,176
ASessionDescription(6607): a=framesize:98 176-144
ASessionDescription(6607): a=fmtp:98 profile=0;level=10
ASessionDescription(6607): m=audio 0 RTP/AVP 99
ASessionDescription(6607): b=AS:12
ASessionDescription(6607): a=rtpmap:99 AMR/8000/1
ASessionDescription(6607): a=control:trackID=1
ASessionDescription(6607): a=fmtp:99 octet-align
ARTSPConnection(6607): status: RTSP/1.0 200 OK
ARTSPConnection(6607): status: RTSP/1.0 200 OK
ARTSPConnection(6607): status: RTSP/1.0 200 OK
ARTSPConnection(6607): status: RTSP/1.0 200 OK
ARTSPConnection(6607): status: RTSP/1.0 200 OK
ASessionDescription(6607): v=0
ASessionDescription(6607): o=GoogleStreamer 1299458498 503248054 IN IP4 74.125.213.182
ASessionDescription(6607): s=Video
ASessionDescription(6607): c=IN IP4 0.0.0.0
ASessionDescription(6607): b=AS:29
ASessionDescription(6607): t=0 0
ASessionDescription(6607): a=control:*
ASessionDescription(6607): a=range:npt=0-1703.000000
ASessionDescription(6607): m=video 0 RTP/AVP 98
ASessionDescription(6607): b=AS:17
ASessionDescription(6607): a=rtpmap:98 H263-2000/90000
ASessionDescription(6607): a=control:trackID=0
ASessionDescription(6607): a=cliprect:0,0,144,176
ASessionDescription(6607): a=framesize:98 176-144
ASessionDescription(6607): a=fmtp:98 profile=0;level=10
ASessionDescription(6607): m=audio 0 RTP/AVP 99
ASessionDescription(6607): b=AS:12
ASessionDescription(6607): a=rtpmap:99 AMR/8000/1
ASessionDescription(6607): a=control:trackID=1
ASessionDescription(6607): a=fmtp:99 octet-align
ARTSPConnection(6607): status: RTSP/1.0 461 Unsupported Transport
ARTSPConnection(6607): status: RTSP/1.0 461 Unsupported Transport

S'il vous plaît, suggérez-moi un moyen de charger des vidéos youtube dans l'affichage vidéo Android.

Merci d'avance...

EDIT Vient juste de cocher un autre appareil, HTC Desire (2.2). Le code a bien fonctionné .. Je me demande si je me demandais quel serait le problème avec Nexus (4.1) ??

27
Midhu

Comme je ne trouve aucun moyen de charger l’URL rtsp dans la vue vidéo (pour tous les appareils et versions Android), j’ai résolu mon problème avec une autre solution. J'ai utilisé une vue Web pour y intégrer le lecteur youtube, et cette méthode fonctionne bien dans tous les appareils testés.

Voici mon code:

mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setPluginState(PluginState.ON);
mWebView.loadUrl("http://www.youtube.com/embed/" + videoID + "?autoplay=1&vq=small");
mWebView.setWebChromeClient(new WebChromeClient());

Merci beaucoup pour toute votre aide les gars.

31
Midhu
private class YourAsyncTask extends AsyncTask<Void, Void, Void>
    {
        ProgressDialog progressDialog;

        @Override
        protected void onPreExecute()
        {
            super.onPreExecute();
            progressDialog = ProgressDialog.show(AlertDetail.this, "", "Loading Video wait...", true);
        }

        @Override
        protected Void doInBackground(Void... params)
        {
            try
            {
                String url = "http://www.youtube.com/watch?v=1FJHYqE0RDg";
                videoUrl = getUrlVideoRTSP(url);
                Log.e("Video url for playing=========>>>>>", videoUrl);
            }
            catch (Exception e)
            {
                Log.e("Login Soap Calling in Exception", e.toString());
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result)
        {
            super.onPostExecute(result);
            progressDialog.dismiss();
/*
            videoView.setVideoURI(Uri.parse("rtsp://v4.cache1.c.youtube.com/CiILENy73wIaGQk4RDShYkdS1BMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp"));
            videoView.setMediaController(new MediaController(AlertDetail.this));
            videoView.requestFocus();
            videoView.start();*/            
            videoView.setVideoURI(Uri.parse(videoUrl));
            MediaController mc = new MediaController(AlertDetail.this);
            videoView.setMediaController(mc);
            videoView.requestFocus();
            videoView.start();          
            mc.show();
        }

    }

public static String getUrlVideoRTSP(String urlYoutube)
    {
        try
        {
            String gdy = "http://gdata.youtube.com/feeds/api/videos/";
            DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            String id = extractYoutubeId(urlYoutube);
            URL url = new URL(gdy + id);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            Document doc = documentBuilder.parse(connection.getInputStream());
            Element el = doc.getDocumentElement();
            NodeList list = el.getElementsByTagName("media:content");///media:content
            String cursor = urlYoutube;
            for (int i = 0; i < list.getLength(); i++)
            {
                Node node = list.item(i);
                if (node != null)
                {
                    NamedNodeMap nodeMap = node.getAttributes();
                    HashMap<String, String> maps = new HashMap<String, String>();
                    for (int j = 0; j < nodeMap.getLength(); j++)
                    {
                        Attr att = (Attr) nodeMap.item(j);
                        maps.put(att.getName(), att.getValue());
                    }
                    if (maps.containsKey("yt:format"))
                    {
                        String f = maps.get("yt:format");
                        if (maps.containsKey("url"))
                        {
                            cursor = maps.get("url");
                        }
                        if (f.equals("1"))
                            return cursor;
                    }
                }
            }
            return cursor;
        }
        catch (Exception ex)
        {
            Log.e("Get Url Video RTSP Exception======>>", ex.toString());
        }
        return urlYoutube;

    }

protected static String extractYoutubeId(String url) throws MalformedURLException
    {
        String id = null;
        try
        {
            String query = new URL(url).getQuery();
            if (query != null)
            {
                String[] param = query.split("&");
                for (String row : param)
                {
                    String[] param1 = row.split("=");
                    if (param1[0].equals("v"))
                    {
                        id = param1[1];
                    }
                }
            }
            else
            {
                if (url.contains("embed"))
                {
                    id = url.substring(url.lastIndexOf("/") + 1);
                }
            }
        }
        catch (Exception ex)
        {
            Log.e("Exception", ex.toString());
        }
        return id;
    }
13
Nipun Gogia

En raison de la version actuelle de YouTube, vous risquez de recevoir une erreur «Impossible de lire cette vidéo» si vous utilisez VideoView pour afficher votre vidéo.

Jetez un coup d'oeil à cette approche avec YouTubePlayerView: http://xinyustudio.wordpress.com/2014/03/17/Android-development-play-youtube-video-in-your-app-cant-play- this-video-and-dépannage/

5
Sergii

Utilisez l'API du lecteur Android YouTube. Ça fonctionne parfaitement. Vérifiez mon exemple d'ici:

activity_main.xml:

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/activity_main"
Android:layout_width="match_parent"
Android:layout_height="match_parent"

tools:context="com.example.andreaskonstantakos.vfy.MainActivity">

<com.google.Android.youtube.player.YouTubePlayerView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:visibility="visible"
Android:layout_centerHorizontal="true"
Android:id="@+id/youtube_player"
Android:layout_alignParentTop="true" />

<Button
Android:text="Button"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentBottom="true"
Android:layout_centerHorizontal="true"
Android:layout_marginBottom="195dp"
Android:visibility="visible"
Android:id="@+id/button" />


</RelativeLayout>

MainActivity.Java:

package com.example.andreaskonstantakos.vfy;


import Android.os.Bundle;
import Android.view.View;
import Android.widget.Button;
import com.google.Android.youtube.player.YouTubeBaseActivity;
import com.google.Android.youtube.player.YouTubeInitializationResult;
import com.google.Android.youtube.player.YouTubePlayer;
import com.google.Android.youtube.player.YouTubePlayerView;



public class MainActivity extends YouTubeBaseActivity {

YouTubePlayerView youTubePlayerView;
Button button;
YouTubePlayer.OnInitializedListener onInitializedListener;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

     youTubePlayerView = (YouTubePlayerView) findViewById(R.id.youtube_player);
     button = (Button) findViewById(R.id.button);


     onInitializedListener = new YouTubePlayer.OnInitializedListener(){

         @Override
         public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) {

            youTubePlayer.loadVideo("Hce74cEAAaE");

             youTubePlayer.play();
     }

         @Override
         public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {

         }
     };

    button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

youTubePlayerView.initialize(PlayerConfig.API_KEY,onInitializedListener);
        }
    });
}
}

et la classe PlayerConfig.Java:

  package com.example.andreaskonstantakos.vfy;

/**
 * Created by Andreas Konstantakos on 13/4/2017.
 */

public class PlayerConfig {

PlayerConfig(){}

public static final String API_KEY = 
"xxxxx";
}

Remplacez "Hce74cEAAaE" par votre ID vidéo provenant de https://www.youtube.com/watch?v=Hce74cEAAaE . Obtenez votre API_KEY auprès de Console.developers.google.com et remplacez-la également sur le PlayerConfig.API_KEY. Pour plus d'informations, vous pouvez suivre pas à pas le didacticiel suivant: https://www.youtube.com/watch?v=3LiubyYpEUk

2

Commander ce lien . Il explique comment mettre en œuvre une vidéo youtube dans VideoView. 

1
Muhammad Adil

Cela dépend du format de codec vidéo que vous recevez votre rtsp. Certains périphériques ne prennent pas en charge l’exécution du fichier .mp4. Consultez Support Android Media pour plus d'informations. Vérifiez si vous pouvez lire d’autres fichiers .3gp ou non.

0
Rashmi.B

Après une longue recherche, j'ai trouvé ce moyen de mise en œuvre. 

 public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.about_fragment, container, false);

    String frameVideo = "<html><body><br><iframe width=\"320\" height=\"200\" src=\"https://www.youtube.com/embed/XDYbEuY8nIc\" frameborder=\"0\" allowfullscreen></iframe></body></html>";

    WebView displayYoutubeVideo = (WebView) rootView.findViewById(R.id.videoView);
    displayYoutubeVideo.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }
    });
    WebSettings webSettings = displayYoutubeVideo.getSettings();
    webSettings.setJavaScriptEnabled(true);
    displayYoutubeVideo.loadData(frameVideo, "text/html", "utf-8");
  return rootView;
    }

à l'intérieur du layout.xml:

 <WebView Android:id="@+id/videoView"
            Android:layout_height="wrap_content"
            Android:layout_width="match_parent"
            Android:layout_marginTop="-45dp"
            Android:layout_marginLeft="-5dp"/>

Cela fonctionnera bien.

0
Ahmed Sadek

Utilisation de la vue vidéo:

1. Code dans la mise en page XML:

<VideoView

       Android:layout_width=”wrap_content”

       Android:layout_height=”wrap_content”

       Android:id=”@+id/YoutubeVideoView” />

2. Code en classe Java:

VideoView v = (VideoView) findViewById(R.id.YoutubeVideoView);

v.setVideoURI(Uri.parse(“rtsp://v4.cache3.c.youtube.com/CjYLENy73wIaLQlW_ji2apr6AxMYDSANFEIJbXYtZ29vZ2xlSARSBXdhdGNoYOr_86Xm06e5UAw=/0/0/0/video.3gp”));

v.setMediaController(new MediaController(this)); //sets MediaController in the video view

// MediaController containing controls for a MediaPlayer                            

v.requestFocus();//give focus to a specific view

v.start();//starts the video

Nous paramétrons VideoUri en spécifiant le lien 3gp de la vidéo Youtube pour les plates-formes mobiles. Pour ajouter des contrôles multimédias tels que Lecture, Pause, Retour rapide, Avance rapide et un curseur de progression, nous ajoutons MediaController à VideoView.

uri.parse (lien 3GP de la vidéo) ... vous pouvez l'obtenir à partir de YouTube

0
Nipun Gogia