媒体流采集
介绍如何开启、结束音视频录制;介绍如何进行录制布局;介绍预览、闪光灯、对焦、镜像、切换摄像头等常用操作。
开启/关闭视频采集
开启摄像头采集后,才能看到摄像头预览画面
- (void)startCapture;
关闭摄像头采集后
- (void)stopCapture;
音频采集
音频采集由 SDK 内部自动控制,如果发布媒体流时允许发布音频流,那么在发布成功时 SDK 内部便会自动开启音频采集,同时在停止发布/离开房间时关闭音频采集。
摄像头相关配置
采集摄像头的位置 captureDevicePosition,默认使用 AVCaptureDevicePositionFront 前置摄像头
@property (nonatomic, assign) AVCaptureDevicePosition captureDevicePosition;
连麦过程中,可通过调用 toggleCamera 切换摄像头
- (void)toggleCamera;
采集摄像头的旋转方向 videoOrientation,默认使用 AVCaptureVideoOrientationPortrait 竖屏采集,横屏采集时可以配置为 AVCaptureVideoOrientationLandscapeRight 或 AVCaptureVideoOrientationLandscapeLeft
@property (nonatomic, assign) AVCaptureVideoOrientation videoOrientation;
previewView
摄像头的预览视图
@property (nonatomic, strong, readonly) UIView *previewView;
注意:摄像头的预览视图 previewView,需要调用 startCapture 后才会有画面。
可通过 fillMode 调整 previewView 的填充方式
@property(readwrite, nonatomic) QNVideoFillModeType fillMode;
画面缩放
videoZoomFactor 默认为 1.0,设置的数值需要小于等于 videoActiveForat.videoMaxZoomFactor,如果大于会设置失败。
@property (nonatomic, assign) CGFloat videoZoomFactor;
分辨率
采集的视频的 sessionPreset 分辨率,默认为 AVCaptureSessionPreset640x480
@property (nonatomic, copy) NSString *sessionPreset;
帧率
采集视频数据的帧率,默认为 24
@property (nonatomic, assign) NSUInteger videoFrameRate;
预览镜像
前置摄像头预览是否开启镜像,默认为 YES
@property (nonatomic, assign) BOOL previewMirrorFrontFacing;
后置摄像头预览是否开启镜像,默认为 NO
@property (nonatomic, assign) BOOL previewMirrorRearFacing;
编码镜像
前置摄像头,对方观看时是否开启镜像,默认 NO
@property (nonatomic, assign) BOOL encodeMirrorFrontFacing;
后置摄像头,对方观看时是否开启镜像,默认 NO
@property (nonatomic, assign) BOOL encodeMirrorRearFacing;
注意:编码镜像决定了观看者的画面是否镜像。
连麦码率
设置连麦的最大、最小码率,根据网络条件在该范围值之间自动调整。
- (void)setMinBitrateBps:(nullable NSNumber *)minBitrateBps
maxBitrateBps:(nullable NSNumber *)maxBitrateBps;
连麦编码尺寸
设置连麦编码时的尺寸,即使用预览的尺寸
@property (nonatomic, assign) CGSize videoEncodeSize;
对焦
连续自动对焦,默认为 YES
@property (nonatomic, assign, getter=isContinuousAutofocusEnable) BOOL continuousAutofocusEnable;
手动点击屏幕进行对焦,默认为 YES
@property (nonatomic, assign, getter=isTouchToFocusEnable) BOOL touchToFocusEnable;
自动对焦,适用于视频拍摄过程中用来减缓因自动对焦产生的镜头伸缩,使画面不因快速的对焦而产生抖动感,默认为 YES
@property (nonatomic, assign, getter=isSmoothAutoFocusEnabled) BOOL smoothAutoFocusEnabled;
手动对焦的位置,默认为 (0.5, 0.5), (0,0) 代表左上方, (1,1) 代表右下方
@property (nonatomic, assign) CGPoint focusPointOfInterest;
美颜
是否开启美颜
-(void)setBeautifyModeOn:(BOOL)beautifyModeOn;
设置美颜 Beauty 的程度值,范围从 0 ~ 1,0 为不美颜
-(void)setBeautify:(CGFloat)beautify;
注意:若美颜未开启,则设置以下两个参数无效
设置美白 whiten 的程度值,范围从 0 ~ 1,0 为不美白
-(void)setWhiten:(CGFloat)whiten;
设置红润 redden 的程度值,范围从 0 ~ 1,0 为不红润
-(void)setWhiten:(CGFloat)whiten;
扬声器
是否使扬声器静音
@property (nonatomic, assign, getter=isMuteSpeaker) BOOL muteSpeaker;
手电筒
设备手电筒,默认为 NO
@property (nonatomic, assign, getter=isTorchOn) BOOL torchOn;
设备授权
通过类方法 cameraAuthorizationStatus,获取摄像头的授权状态
+ (QNAuthorizationStatus)cameraAuthorizationStatus;
调用如下方法,可获取摄像头权限,且 handler 将会在主线程中回调。
+ (void)requestCameraAccessWithCompletionHandler:(void (^)(BOOL granted))handler;
通过类方法 microphoneAuthorizationStatus,获取麦克风的授权状态
+ (QNAuthorizationStatus)microphoneAuthorizationStatus;
调用如下方法,可获取麦克风权限,且 handler 将会在主线程中回调。
+ (void)requestMicrophoneAccessWithCompletionHandler:(void (^)(BOOL granted))handler;
外部导入媒体流
一般情况下,我们建议使用 SDK 内置的音视频采集模块。但是如果您需要实现一些特定的需求(如:录屏),可以关闭 SDK 内置的音视频采集模块,然后导入自己的音视频数据。具体步骤如下:
创建 session 对象
通过以下方法创建 session 对象,captureEnabled 参数传入 NO
- (instancetype)initWithCaptureEnabled:(BOOL)captureEnabled;
导入视频数据
通过如下方法导入视频数据
/**
* 导入视频数据,仅在 captureEnabled 为 NO 时才支持导入视频数据
*/
- (void)pushPixelBuffer:(CVPixelBufferRef)pixelBuffer;
如果视频数据是 CMSampleBufferRef 格式,也可以通过如下方法导入
/**
* 导入视频数据,仅在 captureEnabled 为 NO 时才支持导入视频数据
*/
- (void)pushVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer;
导入音频数据
通过如下方法导入视频数据
/**
* 导入音频数据,仅在 captureEnabled 为 NO 时才支持导入音频数据
* 支持的音频数据格式为:PCM 格式,48000 采样率,16 位宽,单声道
*/
- (void)pushAudioBuffer:(AudioBuffer *)audioBuffer;
录屏
从 iOS 11 开始,ReplayKit 录屏接口支持回调原始数据,我们仅需将其回调的视频数据导入到 SDK 中,即可实现屏幕分享等功能,关于如何导入视频数据,可参考上一小节内容。使用 ReplayKit 录屏并导入数据示例如下:
if (@available(iOS 11.0, *)) {
[[RPScreenRecorder sharedRecorder] startCaptureWithHandler:^(CMSampleBufferRef _Nonnull sampleBuffer, RPSampleBufferType bufferType, NSError * _Nullable error) {
if (bufferType == RPSampleBufferTypeVideo) {
CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
[self.session pushPixelBuffer:pixelBuffer];
}
} completionHandler:^(NSError * _Nullable error) {
if (error) {
NSLog(@"startCaptureWithHandler error: %@", error);
}
}];
} else {
// Fallback on earlier versions
}