如何在iOS中查看视频的分辨率、比特率

问题描述 投票:0回答:4

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

  1. 获取视频的分辨率和比特率。
  2. 检查视频的分辨率。如果它更大 640x480,我会将该视频压缩一半并调整比特率 1/4 。例如,如果视频分辨率为 1920x1080,它将被压缩为 960x540,而 4mbps 的 1920x1080 将被压缩为 1mbps 的 960x540。

我有几个问题:

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

     }];
}

请给我一些建议。预先感谢。

ios objective-c cocoa-touch avfoundation avassetwriter
4个回答
25
投票

要获取视频的分辨率,请使用以下命令:-

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

7
投票

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


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

0
投票

基于 @Avt 在 swift 6 中的回答

func resolutionForLocalVideo(url: URL) async throws -> CGSize? {
        guard let track = try await AVAsset(url: url).loadTracks(withMediaType: .video).first else { return nil }
        let size = try await CGSizeApplyAffineTransform(try track.load(.naturalSize), track.load(.preferredTransform))
        return CGSize(width: abs(size.width), height: abs(size.height))
}
© www.soinside.com 2019 - 2024. All rights reserved.