在应用程序中将Youtube视频保存到iPhone

28

在应用程序中播放Youtube视频很容易,并且有很好的文档支持。

但是,存在两个问题:

  1. 关闭Youtube播放器后,如果用户想再次播放视频,则必须等待在线流媒体
  2. 不能离线播放(在家中加载视频以便在路上观看)

是否有人有以下功能的代码:

  1. 将Youtube视频下载到文档文件夹并显示下载进度
  2. 通过从文档文件夹加载文件来播放已下载的视频(即使未连接到互联网)
6个回答

43

从YouTube下载视频的方法如下:

  1. 通过YouTube API或其他方式获取要下载的URL。
  2. 创建一个在临时文件(在NSTemporaryDirectory()或您的文档目录中的临时命名文件)上打开的 NSOutputStreamNSFileHandle
  3. 设置进度条和任何其他需要执行的操作。
  4. 分配并启动一个NSURLConnection来从URL获取文件。当然,不要使用sendSynchronousRequest:returningResponse:error:
  5. connection:didReceiveResponse:代理方法中,读取要下载的数据长度以便正确更新进度条。
  6. connection:didReceiveData:代理方法中,将数据写入输出流/文件句柄,并根据需要更新进度条。
  7. connectionDidFinishLoading:connection:didFailWithError:中,关闭输出流/文件句柄,并根据需要重命名或删除临时文件。

播放视频,只需使用NSURL的fileURLWithPath:方法创建指向文档目录中本地文件的URL,然后像播放任何远程视频一样进行播放。


很棒的答案Anomie - 我会尽快尝试它。 - Biko
MiRAGe卡在了清理https://github.com/iosdeveloper/MyTube代码的过程中 - 决定看看那里使用的机制是否稳健。之后我会检查Anomie的解决方案。 - Biko
你如何从Youtube API获取下载URL? - zakdances
1
@yourfriendzak 可以使用PSYouTubeExtractor来实现。下面的答案中提到了很多开源应用程序也可以做到同样的事情。 - Tatvamasi
@Biko #Anomie 你讨论的中国应用可能是“ystream” - 我不确定这种方法(直接访问mp4网址)是否违反了条款和条件(YouTube)?而且,提取网址的方法看起来相当原始。它是否强大可靠?是否可以依赖它? - Tatvamasi
有人能提供一个演示吗? - Sneha

7

我使用了这个项目里的类:https://github.com/larcus94/LBYouTubeView 对我来说它很好用,我可以下载Youtube视频。

我使用了下面这段代码:

LBYouTubeExtractor *extractor = [[[LBYouTubeExtractor alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:(@"http://www.youtube.com/watch?v=%@"), self.videoID ]] quality:LBYouTubeVideoQualityLarge] autorelease];
[extractor extractVideoURLWithCompletionBlock:^(NSURL *videoURL, NSError *error) {
    if(!error) {
        NSLog(@"Did extract video URL using completion block: %@", videoURL);

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSData *data = [NSData dataWithContentsOfURL: videoURL];
            NSString *pathToDocs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
            NSString *filename = [NSString stringWithFormat:(@"video_%@.mp4"), self.videoID ];
            [data writeToFile:[pathTODocs stringByAppendingPathComponent:filename] atomically:YES];
            NSLog(@"File %@ successfully saved", filename);
        });
    } else {
        NSLog(@"Failed extracting video URL using block due to error:%@", error);
    }
}];

您可以使用上面帖子中描述的技术来显示下载进度。

@Petr,这对我现在不起作用。你能告诉我现在它是否有效吗? - Jatin Patel - JP
我们放弃了这个项目... :( 现在我无法告诉您这个解决方案的当前状态(如果我理解您的意思)。 - Petr
@Petr,谢谢。还有一个问题,如果这是我的,苹果是否允许YouTube视频下载功能? - Jatin Patel - JP

6
这是我的例子:https://github.com/comonitos/youtube_video 我使用了Peter Steinberger的PSYouTubeExtractor.h类,可以获取YouTube MP4视频的URL,下载和查看都不是问题。
NSURLConnection + NSNotificationCenter + PSYouTubeExtractor + NSMutableData

5

我个人不知道如何下载YouTube视频(代码太大了,无法在此处回答)。

但是,这里有一个完整的YouTube下载示例:这里。 它是一个名为LoadTube的开源YouTube下载器:这里是源代码链接


谢谢提供链接 - 这会有所帮助! - Biko

5

1
应用程序无法下载视频。如果我在代码中漏掉了任何内容,请告诉我。 - Warrior

1
我会播放视频并找出临时文件存储的位置。如果您可以访问它,请将其复制到某个文档文件夹以供离线查看。

Sean,这是一个好建议。但是我在一些中国应用程序中看到的实现方式显示了自定义进度下载,并允许在下载后随时播放,无需先播放。一个人可以同时进行多个下载。 - Biko
在我的沙盒(https://github.com/comonitos/youtube_video)中,我将视频从YouTube下载到文档文件夹中。为了显示进度,您可以使用NSURLConnection代理或ASIHTTPRequest(allseeing-i.com/ASIHTTPRequest):1- 应用程序获取YouTube URL。2 ASIHTTPRequest || NSURLConnection - 下载并显示进度。 - Tim Kozak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接