在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;
}
答案 0 :(得分:1)
NSURL
的方法getResourceValue:forKey:error
允许您获取总字节数:
NSURL *fileUrl = [NSURL fileURLWithPath:filePath];
NSString *size = NULL;
[fileUrl getResourceValue:&size forKey:NSURLFileSizeKey error:nil];
NSLog(@"Bytes : %@",size);
最好检查返回的错误。
答案 1 :(得分:0)
尝试:
CMTime lengthTime = [movieAsset duration];
Float64 seconds = CMTimeGetSeconds(lengthTime);
NSLog(@"Asset is %g seconds long", seconds);