如何使用目标c中的代码保存视频?

时间:2012-12-12 06:06:04

标签: iphone objective-c ios

我使用物镜c拍摄了一段视频,但我无法将其保存在iphone照片库中。我不想使用AlAssets库,我只想使用图像选择器。我看过很多堆栈溢出和其他站点上的方法,但他们要么使用存储位置路径(没有提到它是什么)或他们不工作。 这是我的一段代码。

-(IBAction)Onclick:(id)sender
{
    UIImagePickerController *imagePicker = [[UIImagePickerController

                                             alloc] init];
    imagePicker.sourceType =  UIImagePickerControllerSourceTypeCamera;
    imagePicker.mediaTypes =  [NSArray arrayWithObject:(NSString *)

                               kUTTypeMovie];
    imagePicker.delegate = self;
    //UISaveVideoAtPath
    imagePicker.allowsImageEditing = NO;
    [self.view addSubview:imagePicker.view];
    [imagePicker viewWillAppear:YES];

    CGRect overlayFrame = CGRectMake(0, 380, 320, 44);
    //UILabel *lbl=[[UILabel alloc]init];
    UIView *baseView = [[[UIView alloc] init] autorelease];
    baseView.backgroundColor =[UIColor greenColor];
    //lbl.text=@"dfgfdgfd";
    baseView.frame=overlayFrame;
    //view.delegate = self;
    //view.picker = picker;
    //[view customize];
    imagePicker.cameraOverlayView = baseView;


    [self presentModalViewController:imagePicker animated:YES]; 


}


- (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"]){

        NSURL *url = [[[info objectForKey:UIImagePickerControllerMediaURL] copy] autorelease];

//        ALAssetsLibrary* library = [[[ALAssetsLibrary alloc] init] autorelease];
//        [library writeVideoAtPathToSavedPhotosAlbum:url
//                                    completionBlock:^(NSURL *assetURL, NSError *error){/*notify of completion*/}];
UISaveVideoAtPathToSavedPhotosAlbum(url, nil, nil, nil);
    }

    [self dismissModalViewControllerAnimated:YES];

}

2 个答案:

答案 0 :(得分:7)

试试这个:

- (void) imagePickerController: (UIImagePickerController *) picker
 didFinishPickingMediaWithInfo: (NSDictionary *) info
{
        NSString *mediaType = [info objectForKey: UIImagePickerControllerMediaType];

         [self dismissViewControllerAnimated:YES completion:nil];

        // Handle a movie capture
        if (CFStringCompare (( CFStringRef) mediaType, kUTTypeMovie, 0)
            == kCFCompareEqualTo)
        {

            NSString *moviePath = [[info objectForKey:
                                    UIImagePickerControllerMediaURL] path];
            if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum (moviePath))
            {
                UISaveVideoAtPathToSavedPhotosAlbum (moviePath,self, @selector(video:didFinishSavingWithError:contextInfo:), nil);
            }


        }
    }
}
- (void)video:(NSString*)videoPath didFinishSavingWithError:(NSError*)error contextInfo:(void*)contextInfo
{
    if (error)
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Photo/Video Saving Failed"  delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil, nil];
        [alert show];
    }
    else
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Photo/Video Saved" message:@"Saved To Photo Album"  delegate:self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
        [alert show];
    }
}

希望它对你有所帮助。

答案 1 :(得分:1)

试试这个:

NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
NSURL *videoURL = [info objectForKey:UIImagePickerControllerMediaURL];

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeVideoAtPathToSavedPhotosAlbum:videoURL completionBlock:^(NSURL *assetURL, NSError *error){
       /*notify of completion*/
       NSLog(@"AssetURL: %@",assetURL);
       NSLog(@"Error: %@",error);
       if (!error) {
            //video saved

       }else{
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:error.domain delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
                [alert show];
                [alert release];
       }

}];