如何检查分辨率,在iOS的video比特率

我正在开发video压缩function, 我的想法如下:

  1. 获得video的分辨率和比特率。
  2. 检查video的分辨率。 如果它大于640×480,我会将这个video压缩一半,并将比特率调整为1/4。 例如,如果video的分辨率是1920×1080,它将被压缩到960×540,在4mbps的1920×1080将被压缩到1mbps的960×540。

我有几个问题:

  1. 如何在iOS中获得video的分辨率和比特率?
  2. 如果把1920×1080压缩到960×540,比特率也会自适应调整,还是需要手动设置比特率? 怎么可能呢?

我试着下面的代码来压缩video,但我不知道它压缩到哪个分辨率:

- (void)convertVideoToLowQuailtyWithInputURL:(NSURL*)inputURL outputURL:(NSURL*)outputURL handler:(void (^)(AVAssetExportSession*))handler { [[NSFileManager defaultManager] removeItemAtURL:outputURL error:nil]; AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:inputURL options:nil]; AVAssetExportSession *session = [[AVAssetExportSession alloc] initWithAsset: urlAsset presetName:AVAssetExportPresetLowQuality]; session.outputURL = outputURL; session.outputFileType = AVFileTypeQuickTimeMovie; [session exportAsynchronouslyWithCompletionHandler:^(void) { handler(session); }]; } 

请给我一些build议。 提前致谢。

要获得video的分辨率使用这个:

 AVAssetTrack *videoTrack = nil; AVURLAsset *asset = [AVAsset assetWithURL:[NSURL fileURLWithPath:originalVideo]]; NSArray *videoTracks = [asset tracksWithMediaType:AVMediaTypeVideo]; CMFormatDescriptionRef formatDescription = NULL; NSArray *formatDescriptions = [videoTrack formatDescriptions]; if ([formatDescriptions count] > 0) formatDescription = (CMFormatDescriptionRef)[formatDescriptions objectAtIndex:0]; if ([videoTracks count] > 0) videoTrack = [videoTracks objectAtIndex:0]; CGSize trackDimensions = { .width = 0.0, .height = 0.0, }; trackDimensions = [videoTrack naturalSize]; int width = trackDimensions.width; int height = trackDimensions.height; NSLog(@"Resolution = %d X %d",width ,height); 

你可以得到frameRate和比特率如下: –

 float frameRate = [videoTrack nominalFrameRate]; float bps = [videoTrack estimatedDataRate]; NSLog(@"Frame rate == %f",frameRate); NSLog(@"bps rate == %f",bps); 

video分辨率在Swift中:

 func resolutionForLocalVideo(url:NSURL) -> CGSize? { guard let track = AVAsset(URL: url).tracksWithMediaType(AVMediaTypeVideo).first else { return nil } let size = CGSizeApplyAffineTransform(track.naturalSize, track.preferredTransform) return CGSize(width: fabs(size.width), height: fabs(size.height)) } 

没有preferredTransform解决scheme不会为最新设备上的某些video返回正确的值!

这里是Avt的答案更新和testingSwift 3:

 func resolutionForLocalVideo(url:URL) -> CGSize? { guard let track = AVURLAsset(url: url).tracks(withMediaType: AVMediaTypeVideo).first else { return nil } let size = track.naturalSize.applying(track.preferredTransform) return CGSize(width: fabs(size.width), height: fabs(size.height)) }