直播带货系统开发功能讲解
2021-10-15要想开发一个完整的直播带货系统,首先要先采集到主播的视频和音频功能,然后传入流媒体服务器。本文主要讲解如何采集主播的视频及音频功能,目前可在前置后置摄像头和焦点光标之间进行切换,直播带货系统中有独立美颜SDK,可以看到不同的你,后续将会有直播的其他功能文章。
第一:解释一下在直播带货系统中捕获音视频的步骤:
1.创建一个AVCaptureSession对象。
2.获得AVCaptureDevicel视频设备(摄像机),录音设备(话筒),注意,没有输入数据功能,仅用于调整硬件设备的配置。
3.以音频/视频硬件设备(AVCaptureDevice)为基础(AVCaptureDeviceInput)创建音频/视频硬件输入数据对象(AVCaptureDeviceInput)。
4.创建VideoDataOutput(AVCaptureVideoDataOutput)并设置SetSampleBufferDelegate来获取所收集的视频数据。
5.创建一个音频输出数据管理对象(AVCaptureAudioDataOutput)并设置SetSampleBufferDelegate来获取所收集的音频数据。
6.将数据输入对象AVCaptureDeviceInput,向媒体会话管理对象AVCaptureOutput添加数据输出对象,将音频输入与输出以及视频输入与输出自动地连接起来。
7.创建视频预览层AVCaptureVideoPreviewLayer并指定媒体会话,在显示容器layer中添加一个图层。
8.启动AVCaptureSession,只有打开后,才开始输入输出数据的传递输。
//捕捉音像。
-(void)setupCaputureVideo。
{
//1.创建捕获会话,必须具有强引用,否则将被释放。
AVCaptureSession*captureSession=[AVCaptureSessionalloc]init];
_captureSession=captureSession;
//2.取相机装置,默认为后置相机。
AVCaptureDevice*videoDevice=[selfgetVideoDevice:AVCaptureDevicePositionFront];
//3.获得音响设备。
AVCaptureDevice*audioDevice=[AVCaptureDevicedefaultDeviceWithMediaTypeAudio];
//4.创建相应的视频设备输入对象。
AVCaptureDeviceInput*videoDeviceInput=[AVCaptureDeviceInputhDevice:videoDeviceDevice:nil];
_currentVideoDeviceInput=videoDeviceInput;
//5.创建相应的音频设备输入对象。
AVCaptureDeviceInput*audioDeviceInput=[AVCaptureDeviceInputWithDevice:audioDeviceDevice:audioDeviceInput=[
//6.将加入会议。
//注意“要知道是否可以添加输入,会话不能添加空。
//6.1添加视频。
if([captureSessioncanAddInput:videoDeviceInput]{
[captureSessionaddInput:videoDeviceInput];
}
//6.2添加音频。
if([captureSessioncanAddInput:audioDeviceInput]{
[captureSessionaddInput:audioDeviceInput];
}
//7.获得视频数据输出装置。
AVCaptureVideoDataOutput*videoOutput=[AVCaptureVideoDataOutputalloc]init];
//7.1建立代理,捕捉视频样本数据。
//注意:为了获取数据,队列必须是串行队列,并且不能为空。
dispatch_queue_tvideoQueue=dispatch_queue_create("VideoCaptureQueue");
[videoOutputsetSampleBufferDelegate:selfqueue:videoQueue];
if([captureSessioncanAddOutput:videoOutput]{
[captureSessionaddOutput:videoOutput];
}
//8.获得音频数据输出装置。
AVCaptureAudioDataOutput*audioOutput=`[AVCaptureAudioDataOutputalloc]init];
//8.2建立代理,捕捉视频样本数据。
//注意:为了获取数据,队列必须是串行队列,并且不能为空。
dispatch_queue_taudioQueue=dispatch_queue_create("AudioCaptureQueue");
[audioOutputsetSampleBufferDelegate:selfqueue:audioQueue];
if([captureSessioncanAddOutput:audioOutput]{
[captureSessionaddOutput:audioOutput];
}
//9.获得视频输入和输出连接,以区分音视频数据。
_videoConnection=[videoOutputconnectionWithMediaTypeVideo];
//10.添加视频层预览。
AVCaptureVideoPreviewLayer=[AVCaptureVideoPreviewLayerlayerWithSession:captureSession];
previedLayer.frame=[UIScreenmainScreen].bounds;
[self.view.layerinsertSublayer:previedLayeratIndex:0];
previedLayer=previedLayer;
//11.发起会议。
[captureSessionstartRunning];
}
//指定照相机方向获得照相机。
-(AVCaptureDevice*)getVideoDevice:(AVCaptureDevicePosition)position。
{
NS