如何检查iOS中的分辨率,视频比特率

use*_*941 13 cocoa-touch objective-c avfoundation ios avassetwriter

我正在开发一个功能上的视频压缩; 我的想法如下:

  1. 获得视频的分辨率和比特率.
  2. 检查视频的分辨率.如果它更大640x480,我会将这个视频压缩一半,并将比特率调整为1/4.例如,如果视频的分辨率为1920x1080,则将其压缩为960x540,将4xps的1920x1080压缩为960x540,速度为1mbps.

我有几个问题:

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

     }];
}
Run Code Online (Sandbox Code Playgroud)

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

小智 23

要获得视频的分辨率,请使用:

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);
Run Code Online (Sandbox Code Playgroud)

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

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


Avt*_*Avt 6

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))
}
Run Code Online (Sandbox Code Playgroud)

解决方案没有preferredTransform为最新设备上的某些视频返回正确的值!


alg*_*gal 5

这是 Avt 为 Swift 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))
}
Run Code Online (Sandbox Code Playgroud)

  • 在 HLS `.m3u8` 视频的情况下,这几乎总是返回 `CGSizeZero`。应该指出这一点。 (3认同)