在VideoView中播放流,将url转换为rtsp [英] play streaming in VideoView, convert url to rtsp
问题描述
我需要播放youtube视频并以相同的布局录制视频.
I need to play youtube video and record video in the same layout.
要执行此操作,我搜索了youtube api,发现android版本需要高于2.2,这很好,但是,我想使用VideoView.
To perform this I search for youtube api and found that android version need to be higher than 2.2, this ok but, i want to use VideoView.
我在此处看到有关此问题的一些文章,并最终决定使用此代码在VideoView中观看视频.
I saw some post here about this issue and decide eventually to use this code to watch video in 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 链接:
this code works, but just with rtsp link like this :
String exemple = "rtsp://v4.cache3.c.youtube.com/CjYLENy73wIaLQlW_ji2apr6AxMYDSANFEIJbXYtZ29vZ2xlSARSBXdhdGNoYOr_86Xm06e5UAw=/0/0/0/video.3gp";
我在url中有多个链接,因此我需要将url转换为RTSP的代码,我无法手动执行此操作,我检查了一些代码,但所有这些代码均无效...
I have multiple link in url therefore I need code to convert url to RTSP, I can't do this manually, I check some code and all of them do not work...
我尝试这个:从这里开始 如何获取RTSP URL?
I try this: from here 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是:
when currnt_url to test is :
current_url = "http://m.youtube.com/#/watch?v=FlsBObg-1BQ"
我尝试使用此代码,但它不起作用
I try this code and it does not work
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));"行中崩溃,因为空表达式 我c了一下,发现代码变量是= tFXS9krT2VY,好.. 但是rstp_url变量为空
the code crash in " videoView.setVideoURI(Uri.parse(rstp_url)); " line because null exeption i chack this and discover that code variable is =tFXS9krT2VY , ok.. but rstp_url variable in null
UdayKiran用类似的Q回答了这个问题,有人可以解释他的意思吗? 我听不懂他的回答
UdayKiran wrote this answer to similar Q , someone could explain what he means? i dont understand his answer
他的回答:
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
In gdata api only we are getting this type of links : rtsp://v3.cache7.c.youtube.com/CiILENy73wIaGQlOCTh0GvUeYRMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp
这些正在VideoView中播放.
These are playing in VideoView.
最后我不使用此代码和videoview进行蒸蒸
finally i dont use this code and videoview for steaming
我使用youtube android api,它是从android 2.2而不是从4.2像我一样工作 在我的Q中写道,这是Masake.
i use youtube android api , it's work from android 2.2 not from 4.2 like i wrote in my Q , it was mastake.
使用rtsp的结果是视频质量较差,需要处理宽高比.
the result of using rtsp it's poor video quality and need to deal with aspect ratio.
推荐答案
以下对我有用:
代码= FlsBObg-1BQ.
您将获得很多网址,而我选择返回最佳质量.
The following works for me:
code = FlsBObg-1BQ in your case.
You will get lots of urls, and I choose to return the best quality.
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()方法.
getJsonString() method.
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();
}
不要因为网络请求而将其包装在异步任务中.
Don't forget to wrap it inside async task because of a network request.
这篇关于在VideoView中播放流,将url转换为rtsp的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!