我一直在研究这个话题一段时间,但我真的不知道如何实现这一目标。假设我们有一个来自 HTTP 流的视频,我希望能够在我的应用程序中播放该视频,同时该视频也保存在磁盘上。我知道我可以使用AVFoundation
或 MediaPlayer 框架播放视频,并且可以通过 NSURLRequest
.
这是两个不同的过程,需要两次加载视频。我不知道是否以及如何将这两者结合起来。这可能/可行吗?
我一直在研究这个话题一段时间,但我真的不知道如何实现这一目标。假设我们有一个来自 HTTP 流的视频,我希望能够在我的应用程序中播放该视频,同时该视频也保存在磁盘上。我知道我可以使用AVFoundation
或 MediaPlayer 框架播放视频,并且可以通过 NSURLRequest
.
这是两个不同的过程,需要两次加载视频。我不知道是否以及如何将这两者结合起来。这可能/可行吗?
这是可能的。但是,出于您的 YouTube 视频的目的,如果您喜欢我不想推荐。因为遵循 Youtbe TOS。
出于以下原因:
22.4
我们发现您的应用包含可能允许其用户下载 YouTube 内容的信息,这不符合 YouTube 服务条款。
“......您不得下载任何内容,除非您看到 YouTube 在服务上针对该内容显示的“下载”或类似链接。您不得复制、复制、分发、传输、广播、展示、出售、许可或未经 YouTube 或内容的相应许可方事先书面同意,将任何内容用于任何其他目的。YouTube 及其许可方保留未明确授予服务和内容的所有权利。
另请参阅以下站点问题。这很重要。你肯定需要阅读。
http://www.iphonedevsdk.com/forum/business-legal-app-store/88260-youtube-downloader.html
无论如何,现在我将告诉您如何实现它们。
一个。Streaming Service 实现起来并不难。根据苹果的示例代码可以很容易地实现。请注意以下事项。这使用 AVPlayer。在 3G 时,我测试了 Wifi。没关系。如何测试?上传到您的服务器的视频或获取视频链接。并复制并粘贴到源代码 xib textField 中。
湾。同时提供视频下载。我会推荐AFNetworking。ARC 支持它。所以如果应用程序状态是后台,下载继续。
如何下载?
NSURLRequest *request = [NSURLRequest requestWithURL:"your_http_video_url" cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:20];
AFURLConnection *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
NSArray *docPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath = [[docPaths objectAtIndex:0] stringByAppendingPathComponent:"your_save_video_name.mp4"];
operation.outputStream = [NSOutputStream outputStreamToFileAtPath:path append:NO];
[operation setDownloadProgressBlock:^(NSInteger bytesRead, long long
totalBytesRead, long long totalBytesExpectedToRead)
{
//do stuff. about upadte progressbar...
}];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
{
NSLog(@"downloadComplete"); // show alertView to user.
}];
[operation start];
您应该查看这个出色的答案:
https://stackoverflow.com/a/23754994/1509392
它解释了如何使用 AVURLAsset 完成此操作并向 resourceLoader 对象提供数据。这个想法是 resourceLoader 将向您的代理询问媒体数据,然后您可以从源下载并保存到磁盘。