2010-11-02 64 views
5

我想使用UIImagePickerController委託將錄製的視頻保存到庫中。它適用於圖片,但不能保存,如果它是一個視頻,加上試圖保存視頻後,如果我打開照片應用程序,我收到一條消息「請稍等。更新庫」,和一個標籤爲「重建圖書館「。我的照片庫已恢復,但未添加視頻。在iPhone的庫上保存錄制的視頻問題

- (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 

有沒有人實現這樣的方法,可以點我朝着正確的方向嗎?

謝謝。

回答

6

我想我看到一個問題。

NSString* m_objMediaURL= [info objectForKey:UIImagePickerControllerMediaURL];

是錯誤的類型。我的正常工作的代碼使用:

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

我複製它,而不是將其保留,因爲有些問題我曾在低內存情況選擇器視圖是解僱後。雖然您使用保存方法可能會奏效,我用的是更新更好(因爲回調塊):

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

此外,你應該使用kUTTypeMoviekUTTypeImage而不是硬編碼@"public.image

+0

'UISaveVideoAtPathToSavedPhotosAlbum'似乎並沒有很好地工作。使用'ALAssetsLibrary'確實是更好的選擇。 – znq 2012-11-14 03:00:47

1

你爲什麼傳遞零,零,零到方法 - 如果你更多的選擇傳球,它會告訴你的錯誤;)

嘗試這樣的事情,而不是:

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); 
} 

希望的,輸出可以幫助你:)


編輯:

閱讀the docs多一點,你運行該方法來檢查,這是一個有效的視頻?

BOOL isVideoOK = UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(m_objMediaURL); 
if (NO == isVideoOK) 
    NSLog(@"Video at %@ is not compatible", m_objMediaURL); 
3

感謝Peter的幫助,我發現了這個問題。原來,[信息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]; 

此方法使用新的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]; 
}