Iphone iOS视频流和存储在设备上

Iphone iOS视频流和存储在设备上,iphone,objective-c,ios,ios4,video-streaming,Iphone,Objective C,Ios,Ios4,Video Streaming,到目前为止,我知道如何流式传输视频,以及如何下载视频,然后再流式传输,但这里有一个棘手的问题:流式传输一次,存储在设备上,将来从设备上播放 这可能吗?保存视频很容易。执行类似的操作: //Saving Movie NSMutableData *data = [[NSMutableData alloc] init]; NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

到目前为止,我知道如何流式传输视频,以及如何下载视频,然后再流式传输,但这里有一个棘手的问题:流式传输一次,存储在设备上,将来从设备上播放


这可能吗?

保存视频很容易。执行类似的操作:

//Saving Movie
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];          
[archiver encodeObject:*MovieObject* forKey:@"MovieObjectDataKey"];
[archiver finishEncoding];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"MovieObjectDefaultsDataKey"];
[archiver release];
[data release];

//Retrieving movie 
NSData *savedMovieData = [[NSUserDefaults standardUserDefaults] objectForKey:@"MovieObjectDefaultsDataKey"];
if (savedMovieData != nil) {
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:savedMovieData];
    *MovieObject* = [[unarchiver decodeObjectForKey:@"MovieObjectDataKey"] retain];
    [unarchiver finishDecoding];
    [savedMovieData release];
    [unarchiver release];
} else {
    //Download Stream of Your Movie
}

您唯一真正需要更改的是*MovieObject*,每一步一次。

这里不太清楚您是如何获得流的,但请查看AVAssetWriter、AVAssetWriterInput和AvassetWriterPixelbufferAdapter,一旦收到数据,您应该能够使用以下方法将数据附加到像素缓冲区适配器:

appendPixelBuffer:withPresentationTime:

不确定它是否适合您,但通过一些调整,您应该能够调整您的输入以匹配此方法。有很多设置编写器的示例代码

我知道您想要实现什么,我只有一个解决方法。我必须实现同样的行为,最后从服务器上下载视频,然后再下载。下次用户尝试流式传输视频时,请确定是否已将其下载到磁盘,否则请再次流式传输。在正常情况下,视频下载正确,可以脱机查看

BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:somePath];

fileURLWithPath:isDirectory:

初始化新创建的NSURL对象并将其作为具有指定路径的文件URL返回

+ (id)fileURLWithPath:(NSString *)path isDirectory:(BOOL)isDir
参数

路径

NSURL对象将表示的路径。路径应为有效的系统路径。如果路径以波浪形开头,则必须首先使用stringByExpandingTildeInPath展开路径。如果路径是相对路径,则将其视为相对于当前工作目录。 为此参数传递nil将生成异常

isDir

一个布尔值,指定在根据相对路径组件进行解析时,路径是否被视为目录路径。如果路径指示目录,则传递“是”,否则传递“否”。 返回值 使用路径初始化的NSURL对象

可用性

在iOS 2.0及更高版本中提供

您不能同时对其进行流式传输和保存,尤其是对于大型视频文件,正如Apple doc所说,您必须使用传输流进行HTTP实时流式传输。

可能会让您的生活更轻松

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadDestinationPath:@"video.m4v"]; // use [NSBundle mainBundle] to find a better place
从您的代表处,处理以下事项:

- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data;

使用
数据
进行任何数据转码,并将其实时推送到
AVAssetWriter
或电影播放器层,无论您使用什么。完成后,该资源仍应保存,以便以后可以获取。

对于将来遇到此问题的任何人,我找到了一个粗略的解决方案:使用NSURLConnection将视频URL的内容异步下载到本地文件中,并在下载了某一部分(我使用了2MB)后播放该文件。NSURLConnection with connection:didReceiveData委托方法起作用。它并不聪明,因为它不能完全工作。“iPhone操作系统注意:由于不鼓励直接下载到文件系统,所以在iPhone操作系统中不提供NSURLConnection类。请改为使用NSURLConnection类。有关详细信息,请参阅“使用NSURLConnection”您是否尝试过在iPhone上创建HTTP服务器,并在下载文件时从localhost重新流式传输?@Steven,听起来很有趣。你有关于这个的链接/提示吗?我不知道你在那里做什么?存档什么?*MovieObject*是存储电影的变量。只是为了澄清一下,您已经下载了一部电影,希望保存它以便下次可以再次加载,是吗?或者您正在流式播放电影并希望将其存储在局部变量中?我希望开始下载视频并开始播放,即使部分下载。这有点像流,但在磁盘上缓存时。下次电影播放时,它会播放磁盘版本。明白了。你已经可以在下载时播放它了吗?是的,但我使用的是一种丑陋的方法:连接:从NSURLConnection接收数据,每10秒后,我从磁盘重新加载电影,从以前的播放位置。下载完成后,我会最后一次重新加载它。这很难看,因为很多原因,当视频重新加载时,丑八怪是一个短的黑色帧。嗯……我不确定这是否适合图片。你从某处收到视频流?如果您可以获取流帧,并将每个流帧附加到AvassetWriterPixelBufferAdapter,则会将其写入一个文件,然后您可以从存储在设备上的任何位置播放它。我看到了另一个关于如何下载视频的答案,但您有一个隐藏的安装部分:“你得到它,并将它实时推送到你的AVAssetWriter或电影播放器层,无论你在使用什么”。你能详细说明这一点吗?这就是我想知道的。你目前是如何流视频的?还是你还没有?我知道医生这么说,我想知道是否有可能绕过这一点。