目前我知道如何流式传输视频并如何下载它,然后再次播放它,但是这里有个棘手的问题:可以流式传输一次,将其存储在设备上,并在未来从设备中播放吗?
这种可能性存在吗?
目前我知道如何流式传输视频并如何下载它,然后再次播放它,但是这里有个棘手的问题:可以流式传输一次,将其存储在设备上,并在未来从设备中播放吗?
这种可能性存在吗?
在这里不太确定你是如何获取流的,但可以查看AVAssetWriter、AVAssetWriterInput和AVAssetWriterPixelBufferAdaptor。一旦接收到数据,你应该能够使用以下方法将数据追加到像素缓冲适配器中:
appendPixelBuffer:withPresentationTime:
不确定这对你是否有效,但是通过一些调整,你应该能够使你的输入适应这种方法。有很多设置编写器的示例代码。
保存视频非常容易。做类似于这样的事情:
//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 *。
我知道你想要实现什么,但我只有一个变通方法。我不得不实现相同的行为,并最终通过从服务器流式传输视频并在流式传输旁边进行下载来解决问题。下次用户尝试流式传输视频时,请确定它是否已下载到磁盘上,否则再次进行流式传输。在正常情况下,视频已经成功下载并可以离线查看。
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;
在你获取数据并实时推送到AVAssetWriter
或电影播放器层之前,可以对data
进行任何数据转码。完成后,资产仍应保存以便稍后使用。
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:somePath];
和
fileURLWithPath:isDirectory:
使用指定的路径初始化并返回一个新创建的NSURL对象,作为文件URL。
+ (id)fileURLWithPath:(NSString *)path isDirectory:(BOOL)isDir
参数
path
NSURL对象将表示的路径。路径应该是一个有效的系统路径。如果路径以波浪线开头,必须首先通过stringByExpandingTildeInPath进行扩展。如果路径是相对路径,则被视为相对于当前工作目录。 传递此参数的nil会产生异常。
isDir
一个布尔值,指定在解析相对路径组件时是否将路径视为目录路径。如果路径表示目录,则传递YES,否则传递NO。 返回值 使用路径初始化的NSURL对象。
可用性
iOS 2.0及更高版本可用。
您不能同时流式传输和保存它,特别是对于大型视频文件,因为Apple文档指出,您必须使用传输流进行HTTP Live Streaming。