2012-06-18 37 views
2

在iOS下,我需要獲取用於製作動畫的編解碼器(H.264,MJPEG等),電影的寬度和高度,文件大小以及電影中的幀數。我試圖使用AVAsset的電影持續時間等,但持續時間始終爲零。寬度/高度相同。我也嘗試過使用電影播放器​​控制器,但也沒有奏效(請參閱下面的代碼)。這些文檔有點令人困惑,並且有多種方式可以到達同一個地方,但您無法看到同一個地方。給定一個電影的URL,如何檢索它的信息?

有沒有人得到上述信息正常工作?我相信我錯過了一些東西,但我希望看到示例代碼和/或指針?

編輯:我添加了一個更好的代碼示例。但是,仍然存在一些問題。我如何獲得電影的創建日期,用於壓縮它的編解碼器和電影的文件大小?有人弄清楚這些嗎?

感謝

- (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

經過一番抨擊之後,我到目前爲止已經有了這塊。但我仍然需要弄清楚如何獲得電影的創建日期以及其文件大小。 – user1462486

回答

0

嘗試:

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

NSURL的方法getResourceValue:forKey:error可以讓你得到的總字節數:

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

這是很好的做法來檢查任何錯誤返回。

+0

NSURLFileSizeKey返回一個NSNumber – klefevre