iOS8视频硬编码-压缩率关键参数设置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS8视频硬编码-压缩率关键参数设置相关的知识,希望对你有一定的参考价值。

参考技术A AVVideoCompressionPropertiesKey:设置对应的值为以下的compressionProperties。

NSMutableDictionary *compressionProperties = [[NSMutableDictionary alloc]init]

[compressionProperties setObject: [NSNumber numberWithInt:height*width*7.5] forKey:AVVideoAverageBitRateKey];

[compressionPropertiessetObject: [NSNumber numberWithInt:10] forKey:AVVideoMaxKeyFrameIntervalKey];

[compressionProperties setObject:AVVideoProfileLevelH264Main30 forKey:AVVideoProfileLevelKey];

AVVideoAverageBitRateKey:视频尺寸*比率,10.1相当于AVCaptureSessionPresetHigh,数值越大,显示越精细

AVVideoMaxKeyFrameIntervalKey:关键帧最大间隔,1为每个都是关键帧,数值越大压缩率越高

AVVideoProfileLevelKey: 

P-Baseline Profile:基本画质。支持I/P 帧,只支持无交错(Progressive)和CAVLC;

EP-Extended profile:进阶画质。支持I/P/B/SP/SI 帧,只支持无交错(Progressive)和CAVLC;

MP-Main profile:主流画质。提供I/P/B 帧,支持无交错(Progressive)和交错(Interlaced),也支持CAVLC 和CABAC 的支持;

HP-High profile:高级画质。在main Profile 的基础上增加了8×8内部预测、自定义量化、 无损视频编码和更多的YUV 格式;

实时直播:

低清Baseline Level 1.3

标清Baseline Level 3

半高清Baseline Level 3.1

全高清Baseline Level 4.1

存储媒体:

低清 Main Level 1.3

标清 Main Level 3

半高清 Main Level 3.1

全高清 Main Level 4.1

高清存储:

半高清 High Level 3.1

全高清 High Level 4.1

iPad 支持:

Baseline Level 1-3.1

Main Level 1-3.1

High Level 1-3.1

iphone 支持 H.264 视频最高可达 720p,每秒 30 帧,Main Profile level 3.1

在iOS7.0以上,可以直接选择AVVideoProfileLevelH264BaselineAutoLevel,之前的版本既然我们是实时直播,那就应该选择Baseline级别的了,根据视频分辨率和比特率,选择编码标准,例如标清视频使用AVVideoProfileLevelH264Baseline30。

Github有一个非常好硬编码封装库,简化了编码设置的工作,建议直接使用 VideoToolboxPlus

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

【中文标题】如何在 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。应该指出这一点。

以上是关于iOS8视频硬编码-压缩率关键参数设置的主要内容,如果未能解决你的问题,请参考以下文章

H.264硬编码&硬解码

[技术杂谈][转载]ffmpeg压缩视频几个参数解析

视频转码软件使用手册

linux压缩/解压xz

ios 视频流H264硬编码---分解LFLiveKit

直播常见面试题