iOSvideostream,然后存储在设备上
到目前为止,我知道如何stream式传输video,以及如何下载video,然后进行stream式传输,但这里有一个棘手的问题:stream式传输一次,将其存储在设备上,以后再从设备上播放。
那可能吗?
在这里不太确定你如何得到你的stream,但看看AVAssetWriter,AVAssetWriterInput和AVAssetWriterPixelBufferAdaptor,一旦你收到数据,你应该能够将数据追加到像素缓冲适配器使用:
appendPixelBuffer:withPresentationTime:
不知道它会为你工作,但有一些摆弄你应该能够适应你的input,以匹配这种方法。 有很多示例代码来设置编写器
保存video很容易。 做类似的事情:
//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 *,每一步都有一次。
我知道你想达到什么,我只有一个解决方法。 我不得不实施相同的行为,最后从服务器上stream式传输video,然后将其下载到stream媒体中。 下次用户尝试stream式传输video时,请确定是否将其下载到磁盘,否则再次stream式传输。 在正常情况下,video被正确下载,可以离线查看。
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:somePath];
和
fileURLWithPath:isDirectory:
初始化并返回一个新创build的NSURL对象作为具有指定path的文件URL。
+ (id)fileURLWithPath:(NSString *)path isDirectory:(BOOL)isDir
参数
path
NSURL对象将表示的path。 path应该是有效的系统path。 如果path以波形开始,则必须首先使用stringByExpandingTildeInPath进行扩展。 如果path是一个相对path,则视为相对于当前工作目录。 对此parameter passingnil会产生一个exception。
ISDIR
一个布尔值,指定在parsing相对path组件时是否将path视为目录path。 如果path指示目录,则传递YES;否则,传递否。 返回值用path初始化的NSURL对象。
可用性
在iOS 2.0及更高版本中可用。
您无法同时对其进行stream式处理并保存,尤其是对于苹果电脑公司的大型video文件,您必须使用传输stream进行HTTP实时stream传输。
ASIHttpRequest可能会让你的生活更轻松。
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; [request setDownloadDestinationPath:@"video.m4v"]; // use [NSBundle mainBundle] to find a better place
从你的委托,处理这个:
- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data;
不pipe你使用的是什么数据,你都可以用数据代码进行转码,然后将其推送到AVAssetWriter
或者电影播放器层。 完成后,资产仍应保存,以便稍后获取。