Как проверить разрешение, битрейт видео в iOS

Я разрабатываю видеоизображение функционально; мои идеи ниже:

  1. Получение разрешения и скорость передачи видео.
  2. Проверьте разрешение видео. Если он будет больше 640x480, я сплю это видео пополам и отрегулирую бит в 1/4. Например, если разрешение видео составляет 1920x1080, оно будет сжато до 960x540 и 1920x1080 при 4 Мбит/с будет сжато до 960x540 при 1 Мбит/с.

У меня есть несколько вопросов:

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

     }];
}

Пожалуйста, дайте мне совет. Заранее спасибо.

Ответ 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 и битрейт следующим образом:

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

Ответ 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

Здесь 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))
}