行业动态
INDUSTRY DYNAMIC
陪玩app开发中实现采集音视频功能的完整源代码
发布来源:云豹软件开发    Date:2020-04-29 10:28:45   

陪玩app开发中,我们会根据用户需求打造音视频连麦功能、多人聊天室功能等用户需要的音视频连线功能,而这类与音视频连线功能的实现流程是:

1、 通过摄像头和收音器,采集视频图像和声音

2、 对其进行美颜/美声处理后,压缩编码推流到服务器

3、 由服务器处理后,推流至分发网络

4、 当用户拉流时,音视频流将被传输给用户

5、 用户手机对视频进行解码、渲染和播放操作

 

陪玩2.png


一、 如何开发音视频采集功能

那么,在陪玩app开发音视频采集功能,要怎么做呢?代码如下:

1.首先,创建AVCaptureSession对象

2.获取AVCaptureDevicel录像设备(如手机摄像头),录音设备(麦克风之类的调节硬件设备的配置。

3.根据音频/视频硬件设备(AVCaptureDevice)创建音频/视频硬件输入数据对象(AVCaptureDeviceInput),专门管理数据输入。

4.创建音频、视频输出数据管理对象并设置样品缓存代理

5.将数据输入对象AVCaptureDeviceInput、数据输出对象AVCaptureOutput添加到媒体会话管理对象AVCaptureSession,就会自动让音频输入与输出和视频输入与输出产生连接.

6.创建视频预览图层AVCaptureVideoPreviewLayer并指定媒体会话,添加图层到显示容器layer

7.启动AVCaptureSession,只有开启,才会开始输入到输出数据流传输。//


陪玩9.png

 

二、 通过这些操作,陪玩源码就可以开始实现捕获音视频流的操作了,陪玩app开发进入第二阶段——捕获会话

 

// 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];

    }


陪玩源码.png


    // 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(@"采集到音频数据");

    }

}

陪玩8.png

这样,陪玩app开发就实现了音视频采集功能,接下来就是美颜SDK上场的时候了,美颜SDK是能够实现美颜功能的软件开发工具包,陪玩app开发时,只需将其接入到程序中,进行测试即可。

采集完毕、加上美颜,就可以编码压缩打包推到服务端了,采集端的活动到此为止,是不是很简单呢。

 

声明:部分资料来源网络,本文禁止转载www.yunbaokj.cn


标签: 陪玩app开发