human: 如何处理七牛云的实时音视频音视频采集

gpt: [实时音视频](https://developer.qiniu.com/rtc) > 使用指南 > iOS >音视频采集

#  音视频采集

最近更新时间: 2022-09-08 11:58:18

音视频 [Track](https://developer.qiniu.com/rtc/quick_start/9909/the-rtc-basic-
concept#track) 为音视频交互的基本单位，本部分介绍音视频 Track 的创建及采集等功能的使用。

>   * 一路 Track 代表一路音频或者视频的数据
>   * SDK 支持创建并发布多路视频 Track，但是仅支持同时创建一路音频 Track，重复创建将会失败
>

# 摄像头视频 Track

[QNCameraVideoTrack](https://developer.qiniu.com/rtc/api/8640/QNCameraVideoTrack)
为摄像头采集的本地 Track，其创建方式如下：

    
    
    // 初始化视频编码配置
    QNVideoEncoderConfig *config = [[QNVideoEncoderConfig alloc] initWithBitrate:2500 videoEncodeSize:CGSizeMake(720, 1280)];
    QNCameraVideoTrackConfig *cameraVideoTrackConfig = [[QNCameraVideoTrackConfig alloc] initWithSourceTag:@"camera" config:config multiStreamEnable:NO]; 
    QNCameraVideoTrack *cameraVideoTrack = [QNRTC createCameraVideoTrackWithConfig:cameraVideoTrackConfig];
    

其中，[QNVideoEncoderConfig](https://developer.qiniu.com/rtc/api/11944/QNVideoEncoderConfig-
iOS) 用来配置视频的编码参数，包括分辨率、帧率和码率（kbps）等。

> 注意：编码分辨率配置 `videoEncodeSize` 时，需要同步设置预览分辨率
> `videoFormat`，保证预览分辨率的宽高大于编码分辨率的宽高，否则设置不生效。

在创建好
[QNCameraVideoTrack](https://developer.qiniu.com/rtc/api/8852/QNCameraVideoTrack-
iOS) 之后，就可以通过调用 SDK 提供的相关方法进行摄像头的相关操作：

## 开始/停止摄像头采集

通过调用
[QNCameraVideoTrack.startCapture](https://developer.qiniu.com/rtc/api/8852/QNCameraVideoTrack-
iOS#startCapture) 接口进行摄像头采集，通过调用
[QNCameraVideoTrack.stopCapture](https://developer.qiniu.com/rtc/api/8852/QNCameraVideoTrack-
iOS#stopCapture) 接口停止摄像头采集，通过添加
[QNVideoGLView](https://developer.qiniu.com/rtc/api/11950/QNVideoGLView-iOS)
设置摄像头采集的预览视图。

    
    
    // 开始摄像头采集
    [cameraVideoTrack startCapture];
    // 停止摄像头采集
    [cameraVideoTrack stopCapture];
    // 设置摄像头预览视图
    QNVideoGLView *preview = [[QNVideoGLView alloc] init];
    preview.frame = CGRectMake(0, 0, 360, 640);
    [self.view addSubview:preview];
    

> 注意：App 在进退前后台的过程中，进入后台需要通过调用 `stopCapture` 停止采集，回到前台调用 `startCapture` 恢复采集。

## 开启/关闭预览

通过调用
[QNCameraVideoTrack.play](https://developer.qiniu.com/rtc/api/8852/QNCameraVideoTrack-
iOS#play) 接口进行预览画面的开关控制：

    
    
    // 开启预览
    [cameraVideoTrack play:preview];
    // 关闭预览
    [cameraVideoTrack play:nil];
    

## 开启/关闭手电筒

通过设置属性
[QNCameraVideoTrack.torchOn](https://developer.qiniu.com/rtc/api/8852/QNCameraVideoTrack-
iOS#torchOn) 接口开启和关闭手电筒

    
    
    // 开启手电筒
    cameraVideoTrack.torchOn = YES;
    // 关闭手电筒
    cameraVideoTrack.torchOn = NO;
    

## 切换摄像头

通过调用
[QNCameraVideoTrack.switchCamera](https://developer.qiniu.com/rtc/api/8852/QNCameraVideoTrack-
iOS#switchCamera) 接口进行摄像头的切换。

    
    
    [cameraVideoTrack switchCamera];
    

## 设置缩放

通过设置属性
[QNCameraVideoTrack.videoZoomFactor](https://developer.qiniu.com/rtc/api/8852/QNCameraVideoTrack-
iOS#videoZoomFactor) 对相机采集的画面进行缩放。

> 注意：设置的数值需要小于等于 `videoActiveFormat.videoMaxZoomFactor`，如果大于会设置失败
    
    
    cameraVideoTrack.videoZoomFactor = 1.0;
    

## 开启/关闭镜像

SDK 内提供了前置预览镜像、后置预览镜像、前置编码镜像以及后置编码镜像共四种镜像接口，通过调用对应的属性接口即可开启或关闭镜像。

    
    
    // 开启前置预览镜像
    cameraVideoTrack.previewMirrorFrontFacing = YES;
    // 关闭后置预览镜像
    cameraVideoTrack.previewMirrorRearFacing = NO;
    // 开启前置编码镜像
    cameraVideoTrack.encodeMirrorFrontFacing = YES;
    // 关闭后置编码镜像
    cameraVideoTrack.encodeMirrorRearFacing = NO;
    

> 注意：开启了预览镜像仅仅在本地预览才会镜像，远端看还是正常的画面；编码镜像则决定了远端观看您的用户，观看时是否会有镜像效果。

## 美颜

通过调用
[QNCameraVideoTrack.setBeautifyModeOn](https://developer.qiniu.com/rtc/api/8852/QNCameraVideoTrack-
iOS#setBeautifyModeOn) 接口进行内置美颜的开关。

    
    
    // 打开内置美颜
    [cameraVideoTrack setBeautifyModeOn:YES];
    

美颜的具体参数可以通过以下三个方法进行设置：

    
    
    // 设置磨皮程度为 0.5
    [cameraVideoTrack setSmoothLevel:0.5];
    // 设置美白程度为 0.5
    [cameraVideoTrack setWhiten:0.5];
    // 设置红润程度为 0.5
    [cameraVideoTrack setRedden:0.5];
    

> 如需接入第三方美颜或者滤镜，可以通过
> [QNLocalVideoTrackDelegate.didGetPixelBuffer](https://developer.qiniu.com/rtc/api/11970/QNLocalVideoTrackDelegate#didGetPixelBuffer)
> 的视频数据回调来实现。

######

# 屏幕录制视频 Track

[QNScreenVideoTrack](https://developer.qiniu.com/rtc/api/8850/QNScreenVideoTrack-
iOS) 为屏幕录制的本地 Track，使用方式如下：

## 判断设备是否支持屏幕录制

屏幕录制依赖 iOS 的系统版本，可通过 SDK 提供的如下接口判断是否支持：

    
    
    + (BOOL)isScreenRecorderAvailable;
    

示例代码如下：

    
    
    BOOL isSupported = [QNScreenVideoTrack isScreenRecorderAvailable];
    

## 创建 Screen Track

在通过了屏幕录制申请后，可以通过如下方式进行录屏
[Track](https://developer.qiniu.com/rtc/quick_start/9909/the-rtc-basic-
concept#track) 的创建：

    
    
    // 初始化视频编码配置
    QNVideoEncoderConfig *config = [[QNVideoEncoderConfig alloc] initWithBitrate:600 videoEncodeSize:CGSizeMake(720, 1280)];
    QNScreenVideoTrackConfig *screenVideoTrackConfig = [[QNScreenVideoTrackConfig alloc] initWithSourceTag:@"screen" config:config multiStreamEnable:NO];
    QNScreenVideoTrack *screenVideoTrack = [QNRTC createScreenVideoTrackWithConfig:screenVideoTrackConfig];
    

# 外部导入视频 Track

SDK 外部导入视频连麦支持导入的视频数据格式有 **kCVPixelFormatType_420YpCbCr8BiPlanarFullRange** 以及
**kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange** 两种格式的数据，使用方式如下：

## 创建外部导入视频 Track

[QNCustomVideoTrack](https://developer.qiniu.com/rtc/api/8853/QNCustomVideoTrack-
iOS) 为外部数据导入视频 Track，创建方式如下：

    
    
    QNVideoEncoderConfig *config = [[QNVideoEncoderConfig alloc] initWithBitrate:600];
    QNCustomVideoTrackConfig *customVideoTrackConfig = [[QNCustomVideoTrackConfig alloc] initWithTag:@"custom" config:config];
    QNCustomVideoTrack *customVideoTrack = [QNRTC createCustomVideoTrackWithConfig:customVideoTrackConfig];
    

## 数据导入

### 导入 CMSampleBufferRef 数据

SDK 支持导入视频数据，使用
[QNCustomVideoTrack.pushVideoSampleBuffer](https://developer.qiniu.com/rtc/api/8853/QNCustomVideoTrack-
iOS#pushVideoSampleBuffer) 推送视频数据：

    
    
    [customVideoTrack pushVideoSampleBuffer:sampleBuffer];
    

### 导入 CVPixelBufferRef 数据

SDK 支持导入纹理数据，使用
[QNCustomVideoTrack.pushPixelBuffer](https://developer.qiniu.com/rtc/api/8853/QNCustomVideoTrack-
iOS#pushPixelBuffer) 推送纹理数据：

    
    
    [customVideoTrack pushPixelBuffer:pixelBuffer];
    

# 麦克风音频 Track

[QNMicrophoneAudioTrack](https://developer.qiniu.com/rtc/api/8855/QNMicrophoneAudioTrack-
iOS) 为麦克风采集的音频 ，如需以麦克风采集数据作为音频源，仅需创建一个
[QNMicrophoneAudioTrack](https://developer.qiniu.com/rtc/api/8855/QNMicrophoneAudioTrack-
iOS) 为麦克风采集的音频 Track 并发布即可，其创建方式如下：

    
    
    QNAudioQuality *audioQuality = [[QNAudioQuality alloc] initWithBitrate:64];
    QNMicrophoneAudioTrackConfig *microphoneAudioTrackConfig = [[QNMicrophoneAudioTrackConfig alloc] initWithTag:@"microphone" audioQuality:audioQuality];
    QNMicrophoneAudioTrack *microphoneAudioTrack = [QNRTC createMicrophoneAudioTrackWithConfig:microphoneAudioTrackConfig];
    

其中，[QNAudioQuality](https://developer.qiniu.com/rtc/api/11936/QNAudioQuality-
iOS) 代表音频的质量参数，包括编码码率。

> 注意：SDK 当前仅支持一路音频 Track，因此，在创建了
> [QNMicrophoneAudioTrack](https://developer.qiniu.com/rtc/api/8855/QNMicrophoneAudioTrack-
> iOS) 之后，将无法再创建
> [QNCustomAudioTrack](https://developer.qiniu.com/rtc/api/8856/QNCustomAudioTrack-
> iOS) 实例。

# 外部导入音频 Track

SDK 外部导入音频支持的音频数据格式为：**PCM 格式，48000 采样率，16 位宽，单声道** 。 使用方式如下：

## 创建外部导入音频 Track

[QNCustomAudioTrack](https://developer.qiniu.com/rtc/api/8856/QNCustomAudioTrack-
iOS) 为外部数据导入音频 Track，创建方式如下：

    
    
    QNAudioQuality *audioQuality = [[QNAudioQuality alloc] initWithBitrate:64];
    QNCustomAudioTrackConfig *customAudioTrackConfig = [[QNCustomAudioTrackConfig alloc] initWithTag:@"custom" audioQuality:audioQuality];
    QNCustomAudioTrack *customAudioTrack = [QNRTC createCustomAudioTrackWithConfig:customAudioTrackConfig];
    

## 数据导入：

可通过调用
[QNCustomAudioTrack.pushAudioBuffer](https://developer.qiniu.com/rtc/api/8856/QNCustomAudioTrack-
iOS#pushAudioBuffer%5B1/2%5D) 进行外部音频数据的导入，使用方式如下：

    
    
    [customAudioTrack pushAudioBuffer:audioBuffer];
    

> 注意：SDK 当前仅支持一路音频 Track，因此，在创建了
> [QNCustomAudioTrack](https://developer.qiniu.com/rtc/api/8856/QNCustomAudioTrack-
> iOS) 之后，将无法再创建
> [QNMicrophoneAudioTrack](https://developer.qiniu.com/rtc/api/8855/QNMicrophoneAudioTrack-
> iOS) 实例。

# 示例代码

音视频采集场景的示例代码可参考 [API-Examples-iOS](https://github.com/pili-engineering/QNRTC-
iOS/blob/master/QNRTC-API-Examples/Api-Examples-
iOS/Module/Video/CameraVideo/CameraVideoExample.m)

以上内容是否对您有帮助？