在 iOS 下,我需要获取用于进行移动的编解码器(H.264、MJPEG 等)、电影的宽度和高度、文件大小以及电影中的帧数。我尝试将 AVAsset 用于电影持续时间等,但持续时间始终为零。宽度/高度相同。我也尝试使用电影播放器控制器,但这也不起作用(见下面的代码)。这些文档有点令人困惑,并且有多种到达同一个地方的方式,你似乎无法到达同一个地方。
有没有人让上述信息正常工作?我确定我遗漏了一些东西,但我希望获得示例代码和/或指针?
编辑:我添加了一个更好的代码示例。但是,仍然存在一些问题。如何获取电影的创建日期、用于压缩它的编解码器以及电影的文件大小?有人想出这些吗?
谢谢
- (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:@"%g x %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;
}