2010-12-20 11 views
1

私はビデオを保存するためにUISaveVideoAtPathToSavedPhotosAlbumを使用しようとしています(アプリケーション内でローカルに保存されています)。しかし、保存しようとすると、ビデオファイルが無効で再生できないため、「操作が失敗しました」というエラーが表示されます。ファイルは約1分の長さで、.mp4ファイルです。私はMPMoviePlayerで再生するのに問題はありませんが、保存しません。コードは次のとおりです。ビデオをiPadビデオに保存するアプリケーション

NSString *path = [[NSBundle mainBundle] pathForResource:@"videoFile" ofType:@"mp4"]; 
UISaveVideoAtPathToSavedPhotosAlbum(path, self, @selector(status:didFinishSavingWithError:contextInfo), nil); 

この方法はiPad用に設計されていませんか?それは "SavedPhotosAlbum"と言います。それは私がそれを見るために写真アプリを通らなければならないことを意味しますか、それはちょうどメソッドの名前であり、それはビデオアプリにありますか?私がこれを手助けすることができれば、私はそれを高く評価します。

答えて

1

UIVideoAtPathIsCompatibleWithSavedPhotosAlbum()がtrueを返す限り動作するはずです。しかし、私は前にこの問題を持っていた、より良い運を作成し、ALAssetsLibraryオブジェクトとそのメソッドを使用して持っているように見えました:

- (void)writeVideoAtPathToSavedPhotosAlbum:(NSURL *)videoPathURL completionBlock:(ALAssetsLibraryWriteVideoCompletionBlock)completionBlock 

私は、これは一般的なまたは100%移植を編集しようとしませんでした。

- (void) saveVideoFile:(NSString *)fullpathVideoFile completionTarget:(id)theCompletionTarget action:(SEL)theCompletionAction context:(id)theContext 
    { 
    writeFailed = NO; 

    completionTarget = theCompletionTarget; 
    completionAction = theCompletionAction; 
    completionContext = theContext; 

    // ALAssetsLibraryWriteVideoCompletionBlock 
    // 
    void (^completionBlock)(NSURL *, NSError *) = ^(NSURL *assetURL, NSError *error) 
     { 
     if (error != nil) 
      { 
      writeFailed = YES; 
      } 

     writingToLibrary = NO; 

     [self notifyCompletionTarget]; 
     }; 


    // clean up from previous calls 
    // 
    if (assetURL != nil) 
     { 
     [assetURL release]; 
     assetURL = nil; 
     } 

    if (assetFullPathName != nil) 
     { 
     [assetFullPathName release]; 
     assetFullPathName = nil; 
     } 

    writingToLibrary = YES; 


    // make sure we have a good file 
    // 
    if ([[NSFileManager defaultManager] fileExistsAtPath:fullpathVideoFile] == NO) 
     { 
     writingToLibrary = NO; 
     writeFailed = YES; 
     [self notifyCompletionTarget]; 
     return; 
     } 


    // set assetURL for sending to the library 
    // 
    assetFullPathName = [[NSMutableString alloc] initWithCapacity:(NSUInteger)1024]; 
    [assetFullPathName setString:fullpathVideoFile]; 

    assetURL = [[NSURL alloc] initFileURLWithPath:assetFullPathName isDirectory:NO]; 


    // Use possible alternative method if this method doesn't want to work 
    // 
    if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:assetURL]==NO) 
     { 
     if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(assetFullPathName)) 
      { 
      UISaveVideoAtPathToSavedPhotosAlbum(assetFullPathName, self, @selector(video:didFinishSavingWithError:contextInfo:), nil); 
      } 
     else 
      { 
      writingToLibrary = NO; 
      writeFailed = YES; 
      [self notifyCompletionTarget]; 
      } 

     return; 
     } 


    // Write the video to the library 
    // 
    [library writeVideoAtPathToSavedPhotosAlbum:assetURL completionBlock:completionBlock]; 
    } 
+0

返信いただきありがとうございます。 UIVideoAtPathIsCompatibleWithSavedPhotosAlbum()を実行したときにコンソールに「ムービーを再生できませんでした」というエラーが表示されました。パスを正しく設定していませんか?それは私がxcodeプロジェクトにドラッグアンドドロップしたファイルです。なぜ私はそれが救われることができない他の理由を知らない。 MPMoviePlayerで正常に動作します – Brian

+0

この機能が失敗する理由については、ドキュメントは最小限です。しかし、AVAssetLayerアプローチを試しても、それでもエラーが発生する場合は、より詳細な情報が得られます。私はビデオを保存するための私の関数を含める答えを更新しました –

+0

私はあなたのコードに圧倒されています。私はiPhone/iPad開発にあまり経験はありません。ですから、ALAssetsLibraryの実装方法は本当にわかりません。私はフレームワークを追加して、少しあなたのコードで遊んだが、私はそれを理解することができませんでした。私はもう少し明日それを調べなければならないでしょう。その間、誰かがこの問題を解決する別の方法を持っている場合は、私に教えてください。ありがとう。 – Brian

4

ここではフォトアルバムに映画/ビデオを保存する必要があり、私のプロジェクトの一つからいくつかの単純な作業コードがあります:私はちょうど私があなたの代わりにALAssetLibraryを使用するための良い出発点を与えるためにビデオを保存するために書いたコードをつかん下記のfilePathStringに存在し、デバイスのフォトアルバムと互換性がある場合。私は、入力されたファイルパスにファイルがなかったか、またはムービーのサイズとフォーマットがiPad/iPhoneのフォトアルバムと互換性がない(より可能性が高い)と推測しています。 See the question about video formats compatible with iOS device photo albums for more details.

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
// don't forget to link to the AssetsLibrary framework 
// and also #import <AssetsLibrary/AssetsLibrary.h> 

NSString *filePathString = [[NSBundle mainBundle] pathForResource:@"videoFile" ofType:@"mp4"]; 
NSURL *filePathURL = [NSURL fileURLWithPath:filePathString isDirectory:NO]; 
if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:filePathURL]) { 
    [library writeVideoAtPathToSavedPhotosAlbum:filePathURL completionBlock:^(NSURL *assetURL, NSError *error){ 
     if (error) { 
      // TODO: error handling 
     } else { 
      // TODO: success handling 
     } 
    }]; 
} 
[library release]; 
関連する問題