我需要以相同的布局播放youtube视频和录制视频. 为了执行此操作,我搜索youtube api,发现android版本需要高于2.2,这没关系,但是,我想使用VideoView. 我在这里看到一些关于这个问题的帖子,并决
为了执行此操作,我搜索youtube api,发现android版本需要高于2.2,这没关系,但是,我想使用VideoView.
我在这里看到一些关于这个问题的帖子,并决定最终使用此代码在VideoView中观看视频.
videoView = (VideoView) findViewById(R.id.your_video_view); Log.d(TAG,getUrlVideoRTSP(current_url) + " id yotube1 " ); //here type the url... videoView.setVideoURI(Uri.parse(getUrlVideoRTSP(current_url))); videoView.setMediaController(new MediaController(this)); //sets MediaController in the video view videoView.requestFocus();//give focus to a specific view videoView.start();//starts the video
这段代码有效,但只需使用rtsp链接:
String exemple = "rtsp://v4.cache3.c.youtube.com/CjYLENy73wIaLQlW_ji2apr6AxMYDSANFEIJbXYtZ29vZ2xlSARSBXdhdGNoYOr_86Xm06e5UAw=/0/0/0/video.3gp";
我在url中有多个链接因此我需要代码将url转换为RTSP,我不能手动执行此操作,我检查一些代码并且所有代码都不起作用…
我试试这个:从这里开始
How to get RTSP URL?
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; }
我使用上面这样的方法:
getUrlVideoRTSP(current_url)
当currnt_url要测试时:
current_url = "http://m.youtube.com/#/watch?v=FlsBObg-1BQ"
我尝试这个代码,它不起作用
private class Syncyoutube extends AsyncTask <Void , Void , Void>{ @Override protected void onPostExecute(Void result) { // TODO Auto-generated method stub super.onPostExecute(result); /** videoView.setMediaController(new MediaController(this)); //sets MediaController in the video view // MediaController containing controls for a MediaPlayer videoView.requestFocus();//give focus to a specific view videoView.start();//starts the video */ } public String getRstpLinks(String code){ String[] urls = new String[3]; String link = "http://gdata.youtube.com/feeds/api/videos/" + code + "?alt=json"; String json = getJsonString(link); // here you request from the server try { JSONObject obj = new JSONObject(json); String entry = obj.getString("entry"); JSONObject enObj = new JSONObject(entry); String group = enObj.getString("media$group"); JSONObject grObj = new JSONObject(group); String content = grObj.getString("media$content"); JSONObject cntObj = new JSONObject(group); JSONArray array = grObj.getJSONArray("media$content"); for(int j=0; j<array.length(); j++){ JSONObject thumbs = array.getJSONObject(j); String url = thumbs.getString("url"); urls[j] = url; Log.d(TAG, url); //data.setThumbUrl(thumbUrl); } Log.v(TAG, content); } catch (Exception e) { Log.e(TAG, e.toString()); urls[0] = urls[1] = urls[2] = null; } return urls[2]; } public String getJsonString(String url){ Log.e("Request URL", url); StringBuilder buffer = new StringBuilder(); HttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet( url ); HttpEntity entity = null; try { HttpResponse response = client.execute(request); if( response.getStatusLine().getStatusCode() == 200 ){ entity = response.getEntity(); InputStream is = entity.getContent(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line = null; while( (line = br.readLine() )!= null ){ buffer.append(line); } br.close(); } } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { entity.consumeContent(); } catch (Exception e) { Log.e(TAG, "Exception = " + e.toString() ); } } return buffer.toString(); } @Override protected Void doInBackground(Void... params) { // TODO Auto-generated method stub code = id_current_url(current_url); //here type the url... String rstp_url = getRstpLinks(code); videoView.setVideoURI(Uri.parse(rstp_url)); // the code crech in this line because null exeption // i chack this and discover that code variable is =tFXS9krT2VY , ok.. // but rstp_url variable in null Log.d(TAG,getRstpLinks(code) + " idan id yotube1 " ); return null; } } public String id_current_url (String url) { String c_id = null ; c_id = url.substring((url.lastIndexOf("=")), url.length()); return c_id ; } }
代码崩溃在“videoView.setVideoURI(Uri.parse(rstp_url));”行因为null exeption
我查这个并发现代码变量= tFXS9krT2VY,好吧..
但是rstp_url变量为null
UdayKiran将这个答案写成类似的Q,有人可以解释他的意思吗?
我不明白他的回答
他的回答是:
Element rsp = (Element)entry.getElementsByTagName("media:content").item(1); String anotherurl=rsp.getAttribute("url");
在gdata api中我们只有这种类型的链接:rtsp://v3.cache7.c.youtube.com/CiILENy73wIaGQlOCTh0GvUeYRMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp
这些是在VideoView中播放.
最后,我不使用此代码和视频浏览
我使用youtube android api,它的工作来自android 2.2而不是4.2就像我一样
在我的Q中写道,这是奶油.
使用rtsp的结果是视频质量差,需要处理宽高比.
以下适用于我:在你的情况下代码= FlsBObg-1BQ.
你将获得很多网址,我选择返回最好的质量.
private String getRstpLinks(String code){ String[] urls = new String[3]; String link = "http://gdata.youtube.com/feeds/api/videos/" + code + "?alt=json"; String json = getJsonString(link); // here you request from the server try { JSONObject obj = new JSONObject(json); String entry = obj.getString("entry"); JSONObject enObj = new JSONObject(entry); String group = enObj.getString("media$group"); JSONObject grObj = new JSONObject(group); String content = grObj.getString("media$content"); JSONObject cntObj = new JSONObject(group); JSONArray array = grObj.getJSONArray("media$content"); for(int j=0; j<array.length(); j++){ JSONObject thumbs = array.getJSONObject(j); String url = thumbs.getString("url"); urls[j] = url; Log.d(TAG, url); //data.setThumbUrl(thumbUrl); } Log.v(TAG, content); } catch (Exception e) { Log.e(TAG, e.toString()); urls[0] = urls[1] = urls[2] = null; } return urls[2]; }
getJsonString()方法.
public static String getJsonString(String url){ Log.e("Request URL", url); StringBuilder buffer = new StringBuilder(); HttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet( url ); HttpEntity entity = null; try { HttpResponse response = client.execute(request); if( response.getStatusLine().getStatusCode() == 200 ){ entity = response.getEntity(); InputStream is = entity.getContent(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line = null; while( (line = br.readLine() )!= null ){ buffer.append(line); } br.close(); } } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { entity.consumeContent(); } catch (Exception e) { Log.e(TAG, "Exception = " + e.toString() ); } } return buffer.toString(); }
由于网络请求,不要忘记将其包装在异步任务中.