如何在Androidvideo视图中播放Youtubevideo?

我正在开发一个android应用程序,需要embedded一个YouTubevideo播放器。 我成功地从API获取了RTSPvideoURL,但在Androidvideo视图中尝试加载此rtspurl时,显示“ Can't play this video. ”。 以前我在这个方法中开发了一个类似的应用程序,当时它运行良好,但是现在也没有加载。

我很确定,我从API获取正确的RTSPurl。 rtsp://v6.cache6.c.youtube.com/CiULENy73wIaHAlV9VII3c64lRMYESARFEgGUglwbGF5bGlzdHMM/0/0/0/video.3gp

这是我的活动代码:

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

编辑从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 

请给我一个方法来加载YouTubevideovideo的YouTubevideo。

提前致谢…

编辑只需检查另一个设备,HTC Desire(2.2)。 代码工作正常。 我想知道思考,Nexus(4.1)会有什么问题?

Solutions Collecting From Web of "如何在Androidvideo视图中播放Youtubevideo?"

由于我找不到任何方法来加载video视图中的rtsp URL(所有设备和Android版本),我解决了我的问题与另一个解决方法。 我用了一个webview将youtube播放器embedded其中,而且这种方法在所有testing过的设备中都能正常工作。

这是我的代码:

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

非常感谢你们的帮助。

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

由于当前版本的YouTube,如果您将使用VideoView来显示您的video,您可能会收到“无法播放此video”错误。

看看这个与YouTubePlayerView认识: http ://xinyustudio.wordpress.com/2014/03/17/android-development-play-youtube-video-in-your-app-cant-play-this-video-and -故障排除/

使用video视图:

1.在布局xml中编码:

 <VideoView android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:id=”@+id/YoutubeVideoView” /> 

2.在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 

我们通过指定用于移动平台的Youtubevideo的3gp链接来设置VideoUri。 要添加媒体控件,例如播放,暂停,后退,快进和进度滑块,我们将MediaController添加到VideoView。

uri.parse(video的3gp链接)…你可以从YouTube获得这个

这取决于您接收rtsp的video编解码器格式。 有某些设备不支持运行.mp4文件。 通过Android媒体支持了解更多信息。 检查是否可以播放其他.3gp文件。

检出这个链接 。 它解释了如何在VideoView中实现YouTubevideo。

使用YouTube Android播放器API。 它完美的作品。 从这里检查我的例子:

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

和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"; } 

https://www.youtube.com/watch?v=Hce74cEAAaE中的videoIDreplace“Hce74cEAAaE”&#x3002; 从Console.developers.google.com获取您的API_KEY,并将其replace为PlayerConfig.API_KEY。 有关更多信息,您可以按照以下教程逐步进行操作: https : //www.youtube.com/watch?v = 3LiubyYpEUk