Как проверить разрешение, битрейт видео в iOS
Я разрабатываю функциональное сжатие видео; мои идеи приведены ниже:
- получение разрешения и скорости передачи видео.
- проверьте разрешение видео. Если он больше 640x480, я буду сжимать это видео пополам и регулировать скорость передачи данных в 1/4 . Например, если разрешение видео 1920x1080, оно будет сжато до 960x540 и 1920x1080 на 4mbps будет сжато до 960x540 на 1mbps.
У меня есть несколько вопросы:
- как получить разрешение и скорость передачи видео в iOS?
- если сжать 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);
}];
}
пожалуйста, дайте мне совет. Спасибо заранее.
3 ответов
чтобы получить разрешение видео, используйте это : -
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);
разрешение видео в 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
не возвращают правильные значения для некоторых видео на новейших устройств!
вот ответ 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))
}