给定一个电影的URL,如何检索它的信息?

在iOS下,我需要获取用于制作animation的编解码器(H.264,MJPEG等),电影的宽度和高度,文件大小以及电影中的帧数。 我试图使用AVAsset的电影持续时间等,但持续时间始终为零。 相同的宽度/高度。 我也尝试使用电影播放器​​控制器,但也没有工作(见下面的代码)。 文件有点混乱,并有多种方式到达相同的地方,你似乎无法到达同一个地方。

有没有人得到上述信息正常工作? 我相信我错过了一些东西,但我希望的示例代码和/或指针?

编辑:我添加了一个更好的代码示例。 但是,还存在一些问题。 如何获取电影的创builddate,用于压缩的编解码器以及电影的文件大小? 有人弄清楚这些吗?

谢谢

- (IBAction)getMovieInfo { int hours = 0, minutes = 0, seconds = 0; NSURL* sourceMovieURL = [NSURL URLWithString:@"http://trailers.apple.com/movies/summit/stepuprevolution/stepuprevolution-tlr1_h480p.mov"]; AVURLAsset* movieAsset = [AVURLAsset URLAssetWithURL:sourceMovieURL options:nil]; NSArray *tracks = [movieAsset tracksWithMediaType:AVMediaTypeVideo]; if ([tracks count] != 0) { AVAssetTrack *videoTrack = [tracks objectAtIndex:0]; NSTimeInterval durationSeconds = CMTimeGetSeconds([movieAsset duration]); CGSize videoSize = videoTrack.naturalSize; // // Let's get the movie's meta data // // Start with the duration of the movie hours = durationSeconds / 3600; minutes = durationSeconds / 60; seconds = (int)durationSeconds % 60; durationLabel.text = [NSString stringWithFormat:@"%d:%d:%d", hours, minutes, seconds]; // Next is the creation (posting) date of the movie //postedLabel.text = AVMetadataQuickTimeUserDataKeyCreationDate; //The resolution of the movie resolutionLabel.text = [NSString stringWithFormat:@"%gx %g", videoSize.width, videoSize.height]; // The frame rate of the movie rateLabel.text = [NSString stringWithFormat:@"%g fps", [videoTrack nominalFrameRate]]; // The frame count of the movie countLabel.text = [NSString stringWithFormat:@"%g", [videoTrack nominalFrameRate] * durationSeconds]; // Get the codec used to compress the movie // And lastly, let's generate a thumbnail of the movie AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:movieAsset]; if (imageGenerator != NULL) { CMTime thumbPoint = CMTimeMakeWithSeconds(15.0, 600); NSError *error = nil; CGImageRef thumbnail = [imageGenerator copyCGImageAtTime:thumbPoint actualTime:nil error:&error]; if (thumbnail != NULL) { // Convert CGImage thumbnail to UIImage and then scale it. UIImage *tempImage = [[UIImage alloc] initWithCGImage:thumbnail]; if (tempImage != NULL) { // Let's scale the image and put the it into the imageview. self.thumbDisplay.image=[self scaleAndRotateImage:tempImage]; CGImageRelease(thumbnail); } } } } } - (UIImage *)scaleAndRotateImage:(UIImage *)image { CGImageRef imgRef = image.CGImage; CGFloat width = 135.0; CGFloat height = 75.0; CGAffineTransform transform = CGAffineTransformIdentity; CGRect bounds = CGRectMake(0, 0, width, height); CGFloat scaleRatio = bounds.size.width / width; CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef)); CGFloat boundHeight; UIImageOrientation orient = image.imageOrientation; switch (orient) { case UIImageOrientationUp: //EXIF = 1 transform = CGAffineTransformIdentity; break; case UIImageOrientationUpMirrored: //EXIF = 2 transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0); transform = CGAffineTransformScale(transform, -1.0, 1.0); break; case UIImageOrientationDown: //EXIF = 3 transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height); transform = CGAffineTransformRotate(transform, M_PI); break; case UIImageOrientationDownMirrored: //EXIF = 4 transform = CGAffineTransformMakeTranslation(0.0, imageSize.height); transform = CGAffineTransformScale(transform, 1.0, -1.0); break; case UIImageOrientationLeftMirrored: //EXIF = 5 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width); transform = CGAffineTransformScale(transform, -1.0, 1.0); transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0); break; case UIImageOrientationLeft: //EXIF = 6 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeTranslation(0.0, imageSize.width); transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0); break; case UIImageOrientationRightMirrored: //EXIF = 7 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeScale(-1.0, 1.0); transform = CGAffineTransformRotate(transform, M_PI / 2.0); break; case UIImageOrientationRight: //EXIF = 8 boundHeight = bounds.size.height; bounds.size.height = bounds.size.width; bounds.size.width = boundHeight; transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0); transform = CGAffineTransformRotate(transform, M_PI / 2.0); break; default: [NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"]; } UIGraphicsBeginImageContext(bounds.size); CGContextRef context = UIGraphicsGetCurrentContext(); if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) { CGContextScaleCTM(context, -scaleRatio, scaleRatio); CGContextTranslateCTM(context, -height, 0); } else { CGContextScaleCTM(context, scaleRatio, -scaleRatio); CGContextTranslateCTM(context, 0, -height); } CGContextConcatCTM(context, transform); CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef); UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return imageCopy; } 

NSURL的方法getResourceValue:forKey:error允许你获得总字节数:

 NSURL *fileUrl = [NSURL fileURLWithPath:filePath]; NSString *size = NULL; [fileUrl getResourceValue:&size forKey:NSURLFileSizeKey error:nil]; NSLog(@"Bytes : %@",size); 

检查返回的错误是一个很好的做法。

尝试:

 CMTime lengthTime = [movieAsset duration]; Float64 seconds = CMTimeGetSeconds(lengthTime); NSLog(@"Asset is %g seconds long", seconds);