VideoToolbox 硬编码 h.264

1、前言

VideoToolboxAppleiOS 8 之后推出的用于视频硬编码、解码的工具库。 平时所说的软编解码是指使用 ffmpeg 这个第三方库去做编码解码。

2、原始裸流 CMSampleBuffer 获取

一般在做音视频应用开发的时候,我们都是用 AVFoundation 去做原始数据采集的,使用前置摄像头或者后置摄像头采集视频数据,使用麦克风采集音频数据。

AVCaptureVideoDataOutputSampleBufferDelegate这个代理的

- (void)captureOutput:(AVCaptureOutput *)output didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection

回调方法里面可以获取采集的视频裸流信息。注意AVCaptureAudioDataOutputSampleBufferDelegate音频输出的代理方法也是这个,那么我们如何区分到底是音频数据还是视频数据呢?这里有两种方案:

  • 判断 outputAVCaptureAudioDataOutput(音频) 还是 AVCaptureVideoDataOutput(视频)

  • 判断 connectionaudioConnection(音频) 还是 videoConnection(视频), 我自己在代码里使用属性声明了 audioConnectionvideoConnection

3、 H.264 硬编码

3.1 初始化编码会话

  • 创建编码会话

    创建编码会话的时候注意传入了我们的编码回调函数 VideoEncodeCallback,这个函数会多次调用。

    //创建编码会话
    OSStatus status = VTCompressionSessionCreate(kCFAllocatorDefault, (int32_t)_config.width, (int32_t)_config.height, kCMVideoCodecType_H264, NULL, NULL, NULL, VideoEncodeCallback, (__bridge void * _Nullable)(self), &_encodeSession);
    if (status != noErr) {
        NSLog(@"VTCompressionSession create failed. status=%d", (int)status);
        return self;
    } else {
        NSLog(@"VTCompressionSession create success");
    }
  • 设置编码会话属性

    //设置实时编码
    VTSessionSetProperty(_encodeSession, kVTCompressionPropertyKey_RealTime, kCFBooleanTrue);
    //指定编码比特流的配置文件和级别。直播一般使用baseline,可减少由于b帧带来的延时
    VTSessionSetProperty(_encodeSession, kVTCompressionPropertyKey_ProfileLevel, kVTProfileLevel_H264_Baseline_AutoLevel); 
    ​
    //设置码率均值(比特率可以高于此。默认比特率为零,表示视频编码器。应该确定压缩数据的大小。注意,比特率设置只在定时时有效)
    CFNumberRef bit = (__bridge CFNumberRef)@(_config.bitrate);
    VTSessionSetProperty(_encodeSession, kVTCompressionPropertyKey_AverageBitRate, bit); 
    ​
    //设置码率上限
    CFArrayRef limits = (__bridge C
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值