2011-05-12 30 views
8

的iPhone4,的iOS 4.3.3,iOS版SDK4.3的MPMoviePlayerController - 持续时间始终为0

大家好,

我创建的视频上传功能。这些视频使用UIImagePickerController进行检索,可以使用相机捕捉或从照片库中挑选。我有一个60秒的应用程序限制最大持续时间。记录通过使用相机的视频时,这是很容易实现:

//限制视频到60秒

[拾取器setVideoMaximumDuration: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是好的...

谢谢!

+1

您可以听取MPMovieDurationAvailableNotification。这就需要你将moviePlayer保持足够长的时间,以确定持续时间。照片库可能使用缓存值。 – omz 2011-05-12 19:51:48

+0

@imobilizer如果以下答案有帮助,请标记为已接受。 – memmons 2014-04-02 17:14:55

回答

16

我没有看到任何与您的代码立即出现错误。但是,对于这种类型的操作,使用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) ; 
+0

谢谢Harkonian,其实这段代码并没有直接工作。 – imobilizer 2011-05-16 13:32:05

+0

感谢@Harkonian,实际上这段代码并没有直接工作,因为有一个无效的整型转换警告指针,而且我在运行NSException之后运行它来检索收到SIGABRT的持续时间。 ASSET创建后,我需要检索持续时间,如下所示:CMTime assetTime = [资产持续时间]; Float64 duration = CMTimeGetSeconds(assetTime); – imobilizer 2011-05-16 13:41:53

+0

修复:NSTimeInterval持续时间= 0.0;如果(资产)持续时间= CMTimeGetSeconds(asset.duration); – konradowy 2011-06-27 09:04:42