Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iPhone上保存录制的视频时出现问题';s图书馆_Iphone_Objective C - Fatal编程技术网

在iPhone上保存录制的视频时出现问题';s图书馆

在iPhone上保存录制的视频时出现问题';s图书馆,iphone,objective-c,Iphone,Objective C,我正在尝试使用UIImagePickerController委托将录制的视频保存到库中。它可以很好地用于图片,但如果是视频,它不会保存。另外,如果我打开照片应用程序尝试保存视频,我会收到一条消息“请稍候。更新库”,以及一个带有标签“重建库”的进度条。我的照片库已恢复,但视频未添加到其中 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionar

我正在尝试使用UIImagePickerController委托将录制的视频保存到库中。它可以很好地用于图片,但如果是视频,它不会保存。另外,如果我打开照片应用程序尝试保存视频,我会收到一条消息“请稍候。更新库”,以及一个带有标签“重建库”的进度条。我的照片库已恢复,但视频未添加到其中

- (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];
}