如何在 iOS 中检查视频的分辨率、比特率
Posted
技术标签:
【中文标题】如何在 iOS 中检查视频的分辨率、比特率【英文标题】:How to check Resolution, bitrate of video in iOS 【发布时间】:2014-03-04 02:13:37 【问题描述】:我正在开发一种视频压缩功能;我的想法如下:
-
获取视频的分辨率和比特率。
检查视频分辨率。如果它更大 640x480,我会将此视频压缩一半并将比特率调整为 1/4 。例如,如果视频的分辨率为 1920x1080,它将被压缩为 960x540,4mbps 的 1920x1080 将被压缩为 1mbps 的 960x540。
我有几个问题:
-
如何在 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);
];
请给我一些建议。提前致谢。
【问题讨论】:
【参考方案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
。应该指出这一点。以上是关于如何在 iOS 中检查视频的分辨率、比特率的主要内容,如果未能解决你的问题,请参考以下文章
码流 | 码率 | 比特率 | 帧速率 | 分辨率 | 高清的区别