在Android上从Youtube Rtsp URL下载3gp视频
我正试图从Youtube的rtsp URL下载3gp视频文件并将其保存到我的外部存储器中,但我的方法似乎只适用于HTTP URL 我收到这个警告:在Android上从Youtube Rtsp URL下载3gp视频,android,ios,android-youtube-api,Android,Ios,Android Youtube Api,我正试图从Youtube的rtsp URL下载3gp视频文件并将其保存到我的外部存储器中,但我的方法似乎只适用于HTTP URL 我收到这个警告: 09-02 10:32:40.877: WARN/System.err(7988): java.net.MalformedURLException: Unknown protocol: rtsp 我的下载方法如下: public static void downloadFromURL(String url, File cacheDir, Strin
09-02 10:32:40.877: WARN/System.err(7988): java.net.MalformedURLException: Unknown protocol: rtsp
我的下载方法如下:
public static void downloadFromURL(String url, File cacheDir, String fileName) throws IOException {
long startTime = System.currentTimeMillis();
String TAG = "DL";
if (url != null) {
if (fileName.contains("/"))
fileName = fileName.replace("/", "-");
url = url.replace(" ", "%20");
URL mUrl = new URL(url);
URLConnection ucon = mUrl.openConnection();
ucon.setReadTimeout(TIMEOUT_CONNECTION);
ucon.setConnectTimeout(TIMEOUT_SOCKET);
File f = new File(cacheDir, fileName);
InputStream is = ucon.getInputStream();
BufferedInputStream inStream = new BufferedInputStream(is, BUFFER_SIZE);
FileOutputStream outStream = new FileOutputStream(f);
byte[] buff = new byte[BUFFER_SIZE];
int len;
while ((len = inStream.read(buff)) != -1) {
outStream.write(buff, 0, len);
}
// clean up
outStream.flush();
outStream.close();
inStream.close();
android.util.Log.d(TAG, "Download completed in " + ((System.currentTimeMillis() - startTime) / 1000) + " sec");
}
}
仅供参考,我在我的Nexus 7上通过Wi-Fi连接进行测试。
如果有人能解决我的问题,请告诉我
更新
总之,我找到了这些Objective-C代码片段,它们满足了我的请求,但我无法将其转换为Java代码:
NSString *urlString = @"http://www.youtube.com/get_video_info?&video_id=7ubt8AWa7SU"; //7ubt8AWa7SU gylfmQgtMJc
NSURL *infoUrl = [NSURL URLWithString:urlString];
NSError *error = NULL;
NSString *info = [NSString stringWithContentsOfURL:infoUrl encoding:NSUTF8StringEncoding error:&error];
if (info == nil)
{
NSLog(@"Error: %@", [error description]);
return;
}
NSArray *urlComponents = [info componentsSeparatedByString:@"&"];
NSArray *itemComponents;
NSString *urlEncodedFmtStreamMap = NULL;
for (NSString *item in urlComponents)
{
itemComponents = [item componentsSeparatedByString:@"="];
if (itemComponents)
{
NSString *first = [itemComponents objectAtIndex:0];
if ([first isEqualToString: @"url_encoded_fmt_stream_map"])
{
urlEncodedFmtStreamMap = [itemComponents objectAtIndex:1];
break;
}
}
}
NSString *type = NULL;
NSString *urlSeg1 = NULL;
NSString *sig = NULL;
if (urlEncodedFmtStreamMap)
{
NSArray *formats = [[urlEncodedFmtStreamMap stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding] componentsSeparatedByString:@","];
for (NSString *item in formats)
{
type = NULL;
urlSeg1 = NULL;
sig = NULL;
NSArray *pairs = [item componentsSeparatedByString:@"&"];
for (NSString *pair in pairs)
{
NSArray *varComps = [pair componentsSeparatedByString:@"="];
NSString *varName = [varComps objectAtIndex: 0];
NSString *varValue = [[varComps objectAtIndex: 1] stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
if ([varName isEqualToString: @"type"])
{
NSArray *typeSegments = [varValue componentsSeparatedByString: @";"];
type = [typeSegments objectAtIndex:0];
}
else if ([varName isEqualToString: @"url"])
{
urlSeg1 = [varValue stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
}
else if ([varName isEqualToString: @"sig"])
{
sig = varValue;
}
}
if ([type isEqualToString:@"video/mp4"] && urlSeg1 && sig)
{
self.videoUrl = [[urlSeg1 stringByAppendingString: @"&signature="] stringByAppendingString: sig];
break;
}
}
}
我认为没有一个简单的方法可以做到这一点。获取RTSP流不像HTTP GET请求那么简单。视频和音频数据包作为RTP发送,基本上是包含额外数据的UDP数据包,然后您可以使用RTSP和RTCP(可以忽略)进行服务器/客户端通信
我建议您查看MediaPlayer和Stagefright的源代码,特别是在它们设置了不同的数据源的地方,看看您是否可以提取RTSP握手和RTP会话设置的部分内容 仅供参考,我知道这在编程方面是离题的,但请检查5B您是否正在使用emulator?@66CLSjY根据wikipedia的说法,“下载意味着从远程系统接收数据到本地系统”。仅仅“观看”youtube视频也会被视为下载。当您打开web浏览器并单击显示“下载”的文本时,它是否只是一个下载?您最好使用firefox中的download helper扩展,或者作为某种BHO控制firefox中的download helper扩展。所有的艰苦工作都已经完成了,我想做一个包装而不是重新发明轮子。