2014-03-04 520 views
13

我正在开发视频压缩功能;我的想法如下:如何检查iOS中视频的分辨率,比特率

  1. 获取视频的分辨率和比特率。
  2. 检查视频的分辨率。如果它大于640x480,我会将此视频压缩一半,并将比特率调整为1/4。例如,如果视频分辨率是1920×1080,则它将被压缩到960×540,并且在4mbps下的1920×1080将以1mbps被压缩到960×540。

我有几个问题:

  1. 如何能在iOS视频的分辨率和比特率?
  2. 如果将1920x1080的一半压缩到960x540,比特率也会自适应调整,还是需要手动设置比特率?怎么可以做到这一点?

我想下面的代码来压缩视频,但我不知道它压缩至分辨率:

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

    }]; 
} 

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

回答

21

为了获得视频使用的分辨率是: -

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); 

,你可以得到的帧率和比特率如下: -

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

感谢这么多。这非常有帮助 – user3214941

6

视频分辨率斯威夫特:

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的解决方案不会为最新设备上的某些视频返回正确的值!

3

这里是AVT的回答更新和测试雨燕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)) 
}