3

在 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;
}
4

2 回答 2

1

NSURL的方法getResourceValue:forKey:error允许您获取总字节数:

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

检查返回的任何错误是一种很好的做法。

于 2013-08-01T13:13:23.563 回答
0

尝试:

CMTime lengthTime = [movieAsset duration];
Float64 seconds = CMTimeGetSeconds(lengthTime);
NSLog(@"Asset is %g seconds long", seconds);
于 2012-11-28T16:30:15.167 回答