从实时流播放视频,同时还将流保存到iOS上的磁盘

时间:2012-08-12 23:26:40

标签: objective-c ios streaming avfoundation nsurlrequest

我一直在研究这个话题已有一段时间了,我无法弄清楚如何实现这一目标。假设我们有来自HTTP Stream的视频,我希望能够在我的应用中播放该视频,同时视频也会保留在磁盘上。我知道我可以使用AVFoundation或MediaPlayer框架播放视频,我可以通过NSURLRequest加载文件/流。

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

2 个答案:

答案 0 :(得分:7)

这是可能的。但是,如果您愿意,为了您的YouTube视频,我不想推荐。因为跟随Youtbe TOS。

出于以下原因:

  

22.4

     

我们发现您的应用包含可能允许其用户使用的信息   下载不符合的YouTube内容   YouTube服务条款。

     

“......除非您看到”下载“或,否则不得下载任何内容   YouTube上针对该内容的服务显示的类似链接。您   不得复制,复制,分发,传播,播放,展示,   出于任何其他目的出售,许可或以其他方式利用任何内容   未经YouTube或相关人员事先书面同意   内容的许可人。 YouTube及其许可方保留所有权利   未明确授予服务和内容。“

也请参考以下网站问题。这非常重要。你肯定需要阅读。

http://www.iphonedevsdk.com/forum/business-legal-app-store/88260-youtube-downloader.html


无论如何,现在我会告诉你如何实现它们。

  

一个。流媒体服务并不难实现。根据Apple的示例代码可以轻松实现。请注意以下事项。这使用AVPlayer。在3G,我测试了Wifi。很好。怎么测试?上传到您的服务器视频或获取视频链接。并复制并粘贴源代码xib textField。

StitchedStreamPlayer

  

湾视频下载可同时使用。我会推荐AFNetworking。 ARC支持它。因此,如果应用状态为后台,请继续下载。

AFNetworking

如何下​​载?

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];

答案 1 :(得分:1)

你应该看看这个优秀的答案:

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

解释了如何使用AVURLAsset并向resourceLoader对象提供数据。我们的想法是,resourceLoader会向您的代表询问媒体数据,然后您可以从源代码下载并保存到磁盘。