6

我一直在研究这个话题一段时间,但我真的不知道如何实现这一目标。假设我们有一个来自 HTTP 流的视频,我希望能够在我的应用程序中播放该视频,同时该视频也保存在磁盘上。我知道我可以使用AVFoundation或 MediaPlayer 框架播放视频,并且可以通过 NSURLRequest.

这是两个不同的过程,需要两次加载视频。我不知道是否以及如何将这两者结合起来。这可能/可行吗?

4

2 回答 2

8

这是可能的。但是,出于您的 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 支持它。所以如果应用程序状态是后台,下载继续。

AF网络

如何下载?

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];
于 2012-08-13T00:48:30.933 回答
1

您应该查看这个出色的答案:

https://stackoverflow.com/a/23754994/1509392

它解释了如何使用 AVURLAsset 完成此操作并向 resourceLoader 对象提供数据。这个想法是 resourceLoader 将向您的代理询问媒体数据,然后您可以从源下载并保存到磁盘。

于 2014-08-29T10:16:14.520 回答