直播的学习与使用-----采集

本文详细介绍了如何在iOS平台使用Objective-C实现音视频的采集功能。通过创建AVCaptureSession并配置视频与音频输入输出,实现了从摄像头和麦克风捕获音视频数据的过程,并通过设置代理方法来处理捕获到的数据。

// 捕获音视频

- (void)setupCaputureVideo

{

// 1.创建捕获会话,必须要强引用,否则会被释放

AVCaptureSession *captureSession = [[AVCaptureSession alloc] init];

_captureSession = captureSession;

// 2.获取摄像头设备,默认是后置摄像头

AVCaptureDevice *videoDevice = [self getVideoDevice:AVCaptureDevicePositionFront];

// 3.获取声音设备

AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];

// 4.创建对应视频设备输入对象

AVCaptureDeviceInput *videoDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:nil];

_currentVideoDeviceInput = videoDeviceInput;

// 5.创建对应音频设备输入对象

AVCaptureDeviceInput *audioDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:nil];

// 6.添加到会话中

// 注意“最好要判断是否能添加输入,会话不能添加空的

// 6.1 添加视频

if ([captureSession canAddInput:videoDeviceInput]) {

[captureSession addInput:videoDeviceInput];

}

// 6.2 添加音频

if ([captureSession canAddInput:audioDeviceInput]) {

[captureSession addInput:audioDeviceInput];

}

// 7.获取视频数据输出设备

AVCaptureVideoDataOutput *videoOutput = [[AVCaptureVideoDataOutput alloc] init];

// 7.1 设置代理,捕获视频样品数据

// 注意:队列必须是串行队列,才能获取到数据,而且不能为空

dispatch_queue_t videoQueue = dispatch_queue_create("Video Capture Queue", DISPATCH_QUEUE_SERIAL);

[videoOutput setSampleBufferDelegate:self queue:videoQueue];

if ([captureSession canAddOutput:videoOutput]) {

[captureSession addOutput:videoOutput];

}

// 8.获取音频数据输出设备

AVCaptureAudioDataOutput *audioOutput = [[AVCaptureAudioDataOutput alloc] init];

// 8.2 设置代理,捕获视频样品数据

// 注意:队列必须是串行队列,才能获取到数据,而且不能为空

dispatch_queue_t audioQueue = dispatch_queue_create("Audio Capture Queue", DISPATCH_QUEUE_SERIAL);

[audioOutput setSampleBufferDelegate:self queue:audioQueue];

if ([captureSession canAddOutput:audioOutput]) {

[captureSession addOutput:audioOutput];

}

// 9.获取视频输入与输出连接,用于分辨音视频数据

_videoConnection = [videoOutput connectionWithMediaType:AVMediaTypeVideo];

// 10.添加视频预览图层

AVCaptureVideoPreviewLayer *previedLayer = [AVCaptureVideoPreviewLayer layerWithSession:captureSession];

previedLayer.frame = [UIScreen mainScreen].bounds;

[self.view.layer insertSublayer:previedLayer atIndex:0];

_previedLayer = previedLayer;

// 11.启动会话

[captureSession startRunning];

}

// 指定摄像头方向获取摄像头

- (AVCaptureDevice *)getVideoDevice:(AVCaptureDevicePosition)position

{

NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];

for (AVCaptureDevice *device in devices) {

if (device.position == position) {

return device;

}

}

return nil;

}

#pragma mark - AVCaptureVideoDataOutputSampleBufferDelegate

// 获取输入设备数据,有可能是音频有可能是视频

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

{

if (_videoConnection == connection) {

NSLog(@"采集到视频数据");

} else {

NSLog(@"采集到音频数据");

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值