【问题标题】:MPMoviePlayerController - Duration always 0MPMoviePlayerController - 持续时间始终为 0
【发布时间】:2011-05-12 18:49:22
【问题描述】:

iPhone4、iOS 4.3.3、iOS SDK4.3

大家好,

我正在创建视频上传功能。视频是使用 UIImagePickerController 检索的,可以使用相机捕获或从照片库中选取。我有一个最长 60 秒的应用程序限制。使用相机录制视频时,这很容易实现:

// 将视频限制为 60 秒

[选择器 setVideoMaximumDuration:60];

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

// 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 很好......

谢谢!

【问题讨论】:

  • 您可以收听 MPMovieDurationAvailableNotification。这将要求您将 moviePlayer 保留足够长的时间,以便它可以确定持续时间。照片库可能使用缓存值。
  • @imobilizer 如果以下答案有帮助,请标记为已接受。

标签: objective-c mpmovieplayercontroller


【解决方案1】:

我没有立即发现您的代码有任何问题。但是,对于这种类型的操作,使用 AVFoundation 要快得多。这是使用 AVFoundation 获取持续时间的代码 sn-p:

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

【讨论】:

  • 感谢 Harkonian,实际上这段代码并没有立即生效。
  • 感谢@Harkonian,实际上这段代码并没有立即工作,因为有一个指向整数转换警告的无效指针,当我运行它以检索在抛出 NSException 后收到的持续时间 SIGABRT 时。创建资产后,我需要按如下方式检索持续时间:CMTime assetsTime = [asset duration]; Float64 持续时间 = CMTimeGetSeconds(assetTime);
  • 修复:NSTimeInterval 持续时间 = 0.0; if (asset) duration = CMTimeGetSeconds(asset.duration) ;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-28
相关资源
最近更新 更多