【问题标题】:How to check Resolution, bitrate of video in iOS如何在 iOS 中检查视频的分辨率、比特率
【发布时间】:2014-03-04 02:13:37
【问题描述】:

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

  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


    【解决方案1】:

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

    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和bitrate如下:-

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

    【讨论】:

    • 这仅适用于 mp4 视频,有没有办法找到 m3u8 url 的比特率?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这是针对 Swift 3 更新和测试的 Avt 答案:

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

      【讨论】:

      • 对于 HLS .m3u8 视频,这几乎总是返回 CGSizeZero。应该指出这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 2022-11-03
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多