Objective c MPMoviePlayerController-持续时间始终为0

Objective c MPMoviePlayerController-持续时间始终为0,objective-c,mpmovieplayercontroller,Objective C,Mpmovieplayercontroller,iPhone4、iOS 4.3.3、iOS SDK4.3 大家好 我正在创建一个视频上传功能。使用UIImagePickerController检索视频,可以使用相机拍摄或从照片库中拾取视频。我有一个最大持续时间为60秒的应用程序限制。这在使用摄像机通过以下方式录制视频时很容易实现: //将视频限制为60秒 [选择器设置视频最大持续时间:60] 但是,当从照片库中选择视频时,我看到获取持续时间的唯一方法是通过MPMoviePlayerController duration属性,如下所示: //M

iPhone4、iOS 4.3.3、iOS SDK4.3

大家好

我正在创建一个视频上传功能。使用UIImagePickerController检索视频,可以使用相机拍摄或从照片库中拾取视频。我有一个最大持续时间为60秒的应用程序限制。这在使用摄像机通过以下方式录制视频时很容易实现:

//将视频限制为60秒

[选择器设置视频最大持续时间:60]

但是,当从照片库中选择视频时,我看到获取持续时间的唯一方法是通过MPMoviePlayerController duration属性,如下所示:

//MediaType可以是kUTTypeImage或kUTTypeMovie

NSString*mediaType=[info objectForKey:UIImagePickerControllerMediaType]; NSLog(@“%@”,mediaType)

//如果是电影

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];
    }
但是,持续时间始终为0。我知道视频有一个持续时间,因为在照片库中选择它时,持续时间显示为字幕的一部分。我知道持续时间可能并不总是可用的,但在这种情况下,持续时间显示在照片库中。我还检查了contentURL属性,它有一个很好的值。我能够检索文件,获取其文件大小等,所以我知道该文件的NSURL是好的


谢谢

我看不出你的代码有什么问题。但是,对于这种类型的操作,使用AVFoundation要快得多。以下是使用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) ;

您可以收听MPMovieDurationAvailableNotification。这就需要你让电影播放器呆在你身边足够长的时间,这样它就可以决定电影的持续时间。照片库可能使用了缓存的值。@imobilizer如果下面的答案有帮助,请将其标记为已接受。谢谢Harkonian,实际上此代码暂时无法运行。谢谢@Harkonian,实际上,这段代码并没有立即工作,因为有一个指向整数转换警告的无效指针,我在抛出NSException后运行了一行来检索收到的SIGABRT的持续时间。创建资产后,我需要按如下方式检索持续时间:CMTime assetTime=[ASSET duration];Float64持续时间=CMTimeGetSeconds(assetTime);修复:NSTimeInterval持续时间=0.0;如果(资产)持续时间=CMTimeGetSeconds(资产持续时间);