如何在Android Video View中播放Youtubevideo?

我正在开发一个Android应用程序,需要在其中嵌入youtubevideo播放器。 我成功地从API获得了RTSPvideoURL,但在我的Androidvideo视图中尝试加载此rtsp url时,它显示“ 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中find一些其他信息:

 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 

请建议我在Androidvideo视图中加载youtubevideo的方法。

提前致谢…

编辑刚刚检查了另一台设备HTC Desire(2.2)。 代码工作正常。 我想知道,Nexus(4.1)会出现什么问题?

Solutions Collecting From Web of "如何在Android Video View中播放Youtubevideo?"

由于我找不到任何方法在video视图中加载rtsp URL(对于所有设备和Android版本),我解决了我的问题与另一种解决方法。 我使用webview将youtube播放器嵌入其中,这种方法可以很好地适用于所有经过测试的设备。

这是我的代码:

 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 { 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 maps = new HashMap(); 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查看此approcach: http ://xinyustudio.wordpress.com/2014/03/17/android-development-play-youtube-video-in-your-app-cant-play-this-video-and -故障排除/

使用YouTube Android Player API。 它完美地运作。 从这里检查我的例子:

activity_main.xml中:

  < ?xml version="1.0" encoding="utf-8"?>     

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

将“Hce74cEAAaE”替换为您的videoID, url为https://www.youtube.com/watch?v=Hce74cEAAaE 。 从Console.developers.google.com获取API_KEY,并在PlayerConfig.API_KEY上替换它。 有关更多信息,您可以按照以下教程一步一步地操作: https : //www.youtube.com/watch?v = 3LiubyYpEUk

查看此链接 。 它解释了如何在VideoView中实现YouTubevideo。

使用video视图:

1.在布局xml中编码:

  

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 Media支持 。 检查您是否可以播放任何其他.3gp文件。