Objective c MPMoviePlayerController-持续时间始终为0
iPhone4、iOS 4.3.3、iOS SDK4.3 大家好 我正在创建一个视频上传功能。使用UIImagePickerController检索视频,可以使用相机拍摄或从照片库中拾取视频。我有一个最大持续时间为60秒的应用程序限制。这在使用摄像机通过以下方式录制视频时很容易实现: //将视频限制为60秒 [选择器设置视频最大持续时间:60] 但是,当从照片库中选择视频时,我看到获取持续时间的唯一方法是通过MPMoviePlayerController duration属性,如下所示: //MediaType可以是kUTTypeImage或kUTTypeMovie NSString*mediaType=[info objectForKey:UIImagePickerControllerMediaType]; NSLog(@“%@”,mediaType) //如果是电影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
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(资产持续时间);