2011-05-12 15 views
8

iPhone4の、iOSの4.3.3、iOSのSDK4.3MPMoviePlayerController - 持続時間は常に0

こんにちはすべて、

私はビデオのアップロード機能を作成しています。ビデオはUIImagePickerControllerを使用して取得され、カメラを使用してキャプチャするか、フォトライブラリから取得することができます。私は最大60秒間のアプリケーション制約があります。 60秒

[ピッカーsetVideoMaximumDuration:60]に

//リミット動画:カメラを使用してビデオを録画するときこれは簡単に介して達成されます。

ビデオは、フォトライブラリから選択されたときに、次のようにしかし、私は時間を得るための参照唯一の方法はMPMoviePlayerControllerのdurationプロパティを経由する:

//のMediaTypeがkUTTypeImageまたはkUTTypeMovieことができます。

NSString * mediaType = [info objectForKey:UIImagePickerControllerMediaType]; NSLog(@ "%@"、mediaType);期間は常に0です。しかし

//その場合、ムービー

if ([mediaType isEqualToString:(NSString*)kUTTypeMovie]) { 

    // get the URL 
    NSURL* mediaURL = [info objectForKey:UIImagePickerControllerMediaURL]; 
    NSLog(@"%@",mediaURL); 

    // can use MPMoviePlayerController class to get duration 
    int duration = -1; 
    MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL: mediaURL]; 
    if (moviePlayer != nil) { 

     duration = moviePlayer.duration; 
     NSString *path = moviePlayer.contentURL; 

     [moviePlayer release]; 
    } 

私はフォトライブラリにそれを選択する際に時間が字幕の一部として表示されるので、ビデオは時間を持って知っています。期間はいつも利用できるとは限りませんが、この場合は期間が写真に表示されます。私はcontentURLプロパティもチェックし、それは良い値を持っています。私は、ファイルのNSURLが良いことを知っているので、ファイルサイズなどを取得することができます...

ありがとう!

+1

あなたはMPMovieDurationAvailableNotificationのために聞くことができます:ここでAVFoundationを使って時間を取得するためのコードスニペットです。そうすれば、durationを決定するのに十分長い間、moviePlayerを周りに置いておく必要があります。フォトライブラリは、キャッシュされた値を使用する可能性があります。 – omz

+0

@imobilizer下記の回答が役に立った場合は、マークを付けてください。 – memmons

答えて

16

コードにすぐに間違ったことはありません。しかし、このタイプの操作では、AVFoundationを使用するほうがはるかに高速です。

AVURLAsset *asset = [[[AVURLAsset alloc] initWithURL:anURI 
         options:[NSDictionary dictionaryWithObjectsAndKeys: 
         [NSNumber numberWithBool:YES], 
         AVURLAssetPreferPreciseDurationAndTimingKey, 
         nil]] autorelease]; 

NSTimeInterval durationInSeconds = 0.0; 
if (asset) 
    durationInSeconds = CMTimeGetSeconds(asset.duration) ; 
+0

ありがとうHarkonian、実際にこのコードはstaight離れて動作しませんでした。 – imobilizer

+0

ありがとう@ハルコニアン、実際にこのコードは整数変換の警告への無効なポインタがあり、NSnExceptionをスローした後にSIGABRTを受け取った時間を取得する行を実行したため、実際にはこのコードは機能しませんでした。 ASSETの作成後、次のように期間を取得する必要があります。CMTime assetTime = [asset duration]; Float64 duration = CMTimeGetSeconds(assetTime); – imobilizer

+0

修正:NSTimeInterval duration = 0.0; if(asset)duration = CMTimeGetSeconds(asset.duration); – konradowy

関連する問題