xcode ALAssetsLibrary 获取视频路径并稍后播放
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/11556100/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
ALAssetsLibrary getting the path of a video and play it later
提问by holtmann
Using below code I am able to get the video files in tableview. But I am unable to get the path to the video so that I would save it and use it later to play.
使用下面的代码,我可以在 tableview 中获取视频文件。但是我无法获得视频的路径,以便我可以保存它并在以后使用它来播放。
- (void)viewDidLoad {
[super viewDidLoad];
[activity startAnimating];
assets = [[NSMutableArray alloc] init];
library = [[ALAssetsLibrary alloc] init];
UIImage *viewImage;
[library writeImageToSavedPhotosAlbum:[viewImage CGImage] orientation:(ALAssetOrientation)[viewImage imageOrientation] completionBlock:^(NSURL *assetURL, NSError *error){
if (error) {
NSLog(@"error");
} else {
NSLog(@"url %@", assetURL);
}
}];
[library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop){
if (group != NULL) {
[group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop){
if ([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypeVideo]) {
NSLog(@"asset: %@", result);
[assets addObject:result];
}
}];
}
[self.tableview reloadData];
[self.activity stopAnimating];
[self.activity setHidden:YES];
}
failureBlock:^(NSError *error){
NSLog(@"failure"); }];
}
// Customize the number of sections in the table view.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [assets count];
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
ALAsset *asset = [assets objectAtIndex:indexPath.row];
[cell.imageView setImage:[UIImage imageWithCGImage:[asset thumbnail]]];
[cell.textLabel setText:[NSString stringWithFormat:@"Video %d", indexPath.row+1]];
return cell;
}
This is my output:
这是我的输出:
2012-07-19 12:37:42.135 mptest[17310:707] asset: ALAsset - Type:Video, URLs:{
"com.apple.quicktime-movie" = "assets-library://asset/asset.MOV?id=336068EA-C1B1-481C-82DA-F2419561A91A&ext=MOV";
}
2012-07-19 12:37:42.147 mptest[17310:707] asset: ALAsset - Type:Video, URLs:{
"com.apple.quicktime-movie" = "assets-library://asset/asset.MOV?id=A1CBDDE4-4BC1-48F2-84E0-028D7B7F4879&ext=MOV";
}
2012-07-19 12:37:42.156 mptest[17310:707] asset: ALAsset - Type:Video, URLs:{
"com.apple.quicktime-movie" = "assets-library://asset/asset.MOV?id=3D76ABC7-515C-42E7-A940-B149C78FBAB6&ext=MOV";
}
2012-07-19 12:37:42.262 mptest[17310:707] error
Can anyone help me wih this issue?
谁能帮我解决这个问题?
回答by holtmann
You can't get the actual file-path from the AssetsLibrary because of sandboxing. However, you have various options to access/play the video file.
由于沙盒,您无法从 AssetsLibrary 获取实际文件路径。但是,您有多种选项可以访问/播放视频文件。
1) Query the URL of the Asset using the url
method of ALAssetRepresentation
and pass it to an instance of MPMoviePlayerController to play the video. This url starts with assets-library:// and is not a file-system url, but MPMoviePlayerController
knows how to handle such an URL.
1) 使用 的url
方法查询Asset 的URLALAssetRepresentation
并将其传递给MPMoviePlayerController 的一个实例来播放视频。这个 url 以 assets-library:// 开头,不是文件系统 url,但MPMoviePlayerController
知道如何处理这样的 URL。
2) Get the video contents by using the getBytes:fromOffset:length:error:
of ALAssetsRepresentation
to save the video to your own app sandbox to play/edit/share it or use getBytes:fromOffset:length:error:
to stream the video contents.
2)通过获取视频内容getBytes:fromOffset:length:error:
的ALAssetsRepresentation
将视频保存到自己的应用程序沙箱播放/编辑/股,或使用getBytes:fromOffset:length:error:
流式传输的视频内容。