在iPhone上保存录制的视频时出现问题';s图书馆
我正在尝试使用UIImagePickerController委托将录制的视频保存到库中。它可以很好地用于图片,但如果是视频,它不会保存。另外,如果我打开照片应用程序尝试保存视频,我会收到一条消息“请稍候。更新库”,以及一个带有标签“重建库”的进度条。我的照片库已恢复,但视频未添加到其中在iPhone上保存录制的视频时出现问题';s图书馆,iphone,objective-c,Iphone,Objective C,我正在尝试使用UIImagePickerController委托将录制的视频保存到库中。它可以很好地用于图片,但如果是视频,它不会保存。另外,如果我打开照片应用程序尝试保存视频,我会收到一条消息“请稍候。更新库”,以及一个带有标签“重建库”的进度条。我的照片库已恢复,但视频未添加到其中 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionar
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
if ([mediaType isEqualToString:@"public.image"]){
UIImage *picture = [info objectForKey:UIImagePickerControllerOriginalImage];
UIImageWriteToSavedPhotosAlbum(picture, nil, nil, nil);
}
else if ([mediaType isEqualToString:@"public.movie"]){
NSString* m_objMediaURL= [info objectForKey:UIImagePickerControllerMediaURL];
NSLog(@"URL is %@", m_objMediaURL);
UISaveVideoAtPathToSavedPhotosAlbum(m_objMediaURL, nil, nil, nil);
}
[self dismissModalViewControllerAnimated:YES];
}
上面的NSLog输出以下内容:
URL is
file://localhost/private/var/mobile/Applications/3800A5FB-2A96-4A7A-85DF-B635E8D9A66C/tmp/capture-T0x1061f0.tmp.JMdxHq/capturedvideo.MOV
有人实施过这样的方法吗?请给我指出正确的方向
谢谢。为什么要将nil,nil,nil传递到方法中-如果传递更多选项,它将告诉您错误;) 请尝试以下方法:
UISaveVideoAtPathToSavedPhotosAlbum(m_objMediaURL, self, @selector(video:didFinishSavingWithError:contextInfo:), nil);
后来在你的课堂上把这个方法
- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
// Let's see what happened
NSLog(@"path : %@", path);
NSLog(@:error : %@", error);
}
希望它的输出对您有所帮助:)
编辑: 再读一点,你有没有运行这个方法来检查它是否是一个有效的视频
BOOL isVideoOK = UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(m_objMediaURL);
if (NO == isVideoOK)
NSLog(@"Video at %@ is not compatible", m_objMediaURL);
我想我看到了一个问题
NSString*m_objMediaURL=[info-objectForKey:UIImagePickerControllerMediaURL]代码>
这是错误的类型。我的正常工作代码使用:
NSURL*url=[[info-objectForKey:UIImagePickerControllerMediaURL]copy]autorelease]代码>
我复制了它,而不是保留它,因为在取消picker视图后,我在内存不足的情况下遇到了一些问题。虽然您使用的save方法可能有效,但我使用了更新更好的方法(因为回调块):
另外,您应该使用KuttypeMoine
和kUTTypeImage
而不是硬编码@“public.image
,多亏了Peter的帮助,我发现了这个问题。结果是[info objectForKey:UIImagePickerControllerMediaURL]返回的是NSURL而不是NSString。最后,我的方法是这样的
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
NSURL *videoURL= [info objectForKey:UIImagePickerControllerMediaURL];
if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:videoURL])
{
[library writeVideoAtPathToSavedPhotosAlbum:videoURL
completionBlock:^(NSURL *assetURL, NSError *error){}
];
}
[library release];
此方法使用新的库框架。整个方法支持保存图片或电影,如下所示:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
if ([mediaType isEqualToString:@"public.image"]){
UIImage *picture= [info objectForKey:UIImagePickerControllerOriginalImage];
NSDictionary *metadata = [info objectForKey:UIImagePickerControllerMediaMetadata];
[library writeImageToSavedPhotosAlbum:[picture CGImage] metadata:metadata
completionBlock:^(NSURL *assetURL, NSError *error){}
];
}
else if ([mediaType isEqualToString:@"public.movie"]){
NSURL *videoURL= [info objectForKey:UIImagePickerControllerMediaURL];
if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:videoURL])
{
[library writeVideoAtPathToSavedPhotosAlbum:videoURL
completionBlock:^(NSURL *assetURL, NSError *error){}
];
}
}
[library release];
[self dismissModalViewControllerAnimated:YES];
}
UISaveVideoAtPathToSavedPhotosAlbum
似乎效果不太好。使用ALAssetsLibrary
显然是更好的选择。
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
if ([mediaType isEqualToString:@"public.image"]){
UIImage *picture= [info objectForKey:UIImagePickerControllerOriginalImage];
NSDictionary *metadata = [info objectForKey:UIImagePickerControllerMediaMetadata];
[library writeImageToSavedPhotosAlbum:[picture CGImage] metadata:metadata
completionBlock:^(NSURL *assetURL, NSError *error){}
];
}
else if ([mediaType isEqualToString:@"public.movie"]){
NSURL *videoURL= [info objectForKey:UIImagePickerControllerMediaURL];
if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:videoURL])
{
[library writeVideoAtPathToSavedPhotosAlbum:videoURL
completionBlock:^(NSURL *assetURL, NSError *error){}
];
}
}
[library release];
[self dismissModalViewControllerAnimated:YES];
}