如何开发一套完整的直播平台源码,首先需要采集主播的视频和音频功能,然后传入流媒体服务器。本篇主要讲解如何采集主播的视频和音频功能,当前可以切换前置后置摄像头和焦点光标,直播APP拥有独立的美颜SDK,可以看见不一样的你,后续还会有直播的其他功能文章陆续发布。
首先:讲解一下在直播平台源码中系统捕获音视频步骤:

1.创建AVCaptureSession对象
2.获取AVCaptureDevicel录像设备(摄像头),录音设备(麦克风),注意不具备输入数据功能,只是用来调节硬件设备的配置。
3.根据音频/视频硬件设备(AVCaptureDevice)创建音频/视频硬件输入数据对象(AVCaptureDeviceInput),专门管理数据输入。
4.创建视频输出数据管理对象(AVCaptureVideoDataOutput),并且设置样品缓存代理(setSampleBufferDelegate)就可以通过它拿到采集到的视频数据
5.创建音频输出数据管理对象(AVCaptureAudioDataOutput),并且设置样品缓存代理(setSampleBufferDelegate)就可以通过它拿到采集到的音频数据
6.将数据输入对象AVCaptureDeviceInput、数据输出对象AVCaptureOutput添加到媒体会话管理对象AVCaptureSession中,就会自动让音频输入与输出和视频输入与输出产生连接.
7.创建视频预览图层AVCaptureVideoPreviewLayer并指定媒体会话,添加图层到显示容器layer中
8.启动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(@"采集到音频数据");}
}

其次:讲解一下在直播平台源码中视频采集额外功能一(切换摄像头)
切换摄像头步骤
1.获取当前视频设备输入对象
2.判断当前视频设备是前置还是后置
3.确定切换摄像头的方向
4.根据摄像头方向获取对应的摄像头设备
5.创建对应的摄像头输入对象
6.从会话中移除之前的视频输入对象
7.添加新的视频输入对象到会话中。

// 切换摄像头
- (IBAction)toggleCapture:(id)sender {// 获取当前设备方向AVCaptureDevicePosition curPosition = _currentVideoDeviceInput.device.position;    // 获取需要改变的方向AVCaptureDevicePosition togglePosition = curPosition == AVCaptureDevicePositionFront?AVCaptureDevicePositionBack:AVCaptureDevicePositionFront;// 获取改变的摄像头设备AVCaptureDevice *toggleDevice = [self getVideoDevice:togglePosition];// 获取改变的摄像头输入设备AVCaptureDeviceInput *toggleDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:toggleDevice error:nil];// 移除之前摄像头输入设备[_captureSession removeInput:_currentVideoDeviceInput];// 添加新的摄像头输入设备[_captureSession addInput:toggleDeviceInput];// 记录当前摄像头输入设备_currentVideoDeviceInput = toggleDeviceInput;
}

视频采集额外功能二(聚焦光标),聚焦光标步骤
1.监听屏幕的点击
2.获取点击的点位置,转换为摄像头上的点,必须通过视频预览图层(AVCaptureVideoPreviewLayer)转
3.设置聚焦光标图片的位置,并做动画
4.设置摄像头设备聚焦模式和曝光模式(注意:这里设置一定要锁定配置lockForConfiguration,否则报错)

// 点击屏幕,出现聚焦视图
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{// 获取点击位置UITouch *touch = [touches anyObject];CGPoint point = [touch locationInView:self.view];// 把当前位置转换为摄像头点上的位置CGPoint cameraPoint = [_previedLayer captureDevicePointOfInterestForPoint:point];// 设置聚焦点光标位置[self setFocusCursorWithPoint:point];// 设置聚焦[self focusWithMode:AVCaptureFocusModeAutoFocus exposureMode:AVCaptureExposureModeAutoExpose atPoint:cameraPoint];
}
/***  设置聚焦光标位置**  @param point 光标位置*/
-(void)setFocusCursorWithPoint:(CGPoint)point{self.focusCursorImageView.center=point;
self.focusCursorImageView.transform=CGAffineTransformMakeScale(1.5, 1.5);self.focusCursorImageView.alpha=1.0;[UIView animateWithDuration:1.0 animations:^{self.focusCursorImageView.transform=CGAffineTransformIdentity;} completion:^(BOOL finished) {self.focusCursorImageView.alpha=0;   }];
}
/***  设置聚焦*/
-(void)focusWithMode:(AVCaptureFocusMode)focusMode exposureMode:(AVCaptureExposureMode)exposureMode atPoint:(CGPoint)point{AVCaptureDevice *captureDevice = _currentVideoDeviceInput.device;// 锁定配置[captureDevice lockForConfiguration:nil];// 设置聚焦if ([captureDevice isFocusModeSupported:AVCaptureFocusModeAutoFocus]) {[captureDevice setFocusMode:AVCaptureFocusModeAutoFocus];}if ([captureDevice isFocusPointOfInterestSupported]) {[captureDevice setFocusPointOfInterest:point];}// 设置曝光if ([captureDevice isExposureModeSupported:AVCaptureExposureModeAutoExpose]) {[captureDevice setExposureMode:AVCaptureExposureModeAutoExpose];}if ([captureDevice isExposurePointOfInterestSupported]) {[captureDevice setExposurePointOfInterest:point];}// 解锁配置[captureDevice unlockForConfiguration];
}

最后:讲解一下直播平台源码运用的AVFoundation基本知识介绍。

AVFoundation: 音视频数据采集需要用AVFoundation框架。
AVCaptureDevice:硬件设备,包括麦克风、摄像头,通过该对象可以设置物理设备的一些属性(例如相机聚焦、白平衡等)
AVCaptureDeviceInput:硬件输入对象,可以根据AVCaptureDevice创建对应的AVCaptureDeviceInput对象,用于管理硬件输入数据。
AVCaptureOutput:硬件输出对象,用于接收各类输出数据,通常使用对应的子类AVCaptureAudioDataOutput(声音数据输出对象)、AVCaptureVideoDataOutput(视频数据输出对象)
AVCaptionConnection:当把一个输入和输出添加到AVCaptureSession之后,AVCaptureSession就会在输入、输出设备之间建立连接,而且通过AVCaptureOutput可以获取这个连接对象。
AVCaptureVideoPreviewLayer:相机拍摄预览图层,能实时查看拍照或视频录制效果,创建该对象需要指定对应的AVCaptureSession对象,因为AVCaptureSession包含视频输入数据,有视频数据才能展示。
AVCaptureSession:   协调输入与输出之间传输数据

系统作用:可以操作硬件设备
工作原理:让直播APP与系统之间产生一个捕获会话,相当于直播App与硬件设备有联系了, 我们只需要把硬件输入对象和输出对象添加到会话中,会话就会自动把硬件输入对象和输出产生连接,这样硬件输入与输出设备就能传输音视频数据。
以上就是直播平台源码与系统直接调动介绍,简单介绍了AVFoundation的具体功能在直播APP当中的重要作用

直播平台源码中直播系统捕获音视频的步骤相关推荐

  1. 直播平台源码搭建教程之Android音视频开发

    直播平台源码搭建教程之Android音视频开发 音频 将声音保存成音频的过程,其实就是将模拟音频数字化的过程,为了实现这个过程,就需要对模拟音频进行采样.量化和编码.接下来我们详细讲解这一过程. 采样 ...

  2. 直播平台源码中的推拉流是什么

    关于直播平台源码中的推流和拉流,最常用的就是RTMP和RTSP协议了 推流,指的是把采集阶段封包好的内容传输到服务器的过程,推流是直播端需要完成的步骤.拉流是指服务器已有直播内容,用指定地址进行拉取的 ...

  3. 网红带货与直播平台源码,“直播+”的成熟模式

    为什么说KOL和网红催生出了网红直播平台源码开发市场? KOL是在其领域有号召力.影响力.公信力的账号,网红是具有巨大粉丝量和号召力的账号,他们拥有流量. 而电商卖家,他们缺少流量,如果有人能为其店铺 ...

  4. 直播平台开发时iOS 开发内购功能,直播平台源码搭建

    1.首先登录苹果账号,在直播平台源码搭建完成好后,进入后台管理中心添加商品,选择功能----App内购买项目------添加商品类型.商品的ID.以及说明信息. 2.在直播平台源码搭建后台创建沙盒测试 ...

  5. H5 直播的疯狂点赞动画如何通过php直播平台源码实现(附完整源码)

    php直播平台源码H5 直播的疯狂点赞动画如何通过php直播平台源码实现(附完整源码) 直播有一个很重要的互动:点赞. 为了烘托直播间的氛围,直播相对于普通视频或者文本内容,点赞通常有两个特殊需求: ...

  6. 开发一套完整的直播平台源码,必须具备完善的功能

    在直播过程当中会有用户发一些难听的话,这个时候就需要我们对这些难听的话整理成违禁词,然后再有用户发送这些词的时候可以自动屏蔽,所以一套完整的直播平台源码必须具备完善的功能. 一.首先我们需要将这些违禁 ...

  7. 直播平台源码实现状态栏滑动隐藏和tabbar的教程

    现在好多应用的首页都要求状态栏和tabbar支持滑动隐藏,直播平台源码又怎能甘心落后于人呢?对于此类需求,我们可以使用UICollectionView来进行功能实现,UICollectionView ...

  8. 如何在php直播平台源码里实现“查询附近主播”功能

    在php直播平台源码中,"发现同城主播"的功能是如何开发出来的?下面给大家介绍附近功能中的距离之间的换算,通过本文,你可以: 理解如何在php直播平台源码里换算经纬度 理解发现同城 ...

  9. 视频直播平台源码关于Facebook登录、分享接入流程

    现在,视频直播平台移民三方账号登录.分享功能是最基本的功能设置,而且随着互联网技术的发展,很多视频直播平台源码需要对Facebook.Twitter.Line等国外APP进行接入,从而实现用户流量的增 ...

最新文章

  1. linux某些汉字乱码,Linux汉字乱码解决办法
  2. web 开发之js---js 中的数组操作
  3. Ubuntu上安装配置JDK
  4. python机制_python 加载模块机制
  5. 大数据技术原理与应用-概述
  6. python3下载-python3
  7. 设计模式---解释器模式(C++实现)
  8. c swap方法在哪个库里面_IOT操作系统用C++库的经验总结
  9. 一文详解自动驾驶技术与挑战
  10. 【传感器大赏】80cm红外距离传感器
  11. 年终盘点,蔚来终于失去互联网造车老大地位,被小鹏取而代之
  12. 虚幻4实战 贪吃蛇制作
  13. 快速调用编辑器来写一条长,复杂或难的命令--用Enki学Linux系列(5)
  14. ngrok私有服务搭建(docker交叉编译)
  15. 【腾讯云原生降本增效大讲堂】云原生混部技术标准解读
  16. react中findDomNode的作用
  17. Linux常用工具介绍
  18. 学计算机类专业对电脑有要求,大学设计专业电脑配置须知
  19. Redis(1): SQL or NoSql
  20. mysql查询最小分数_MySQL数分:简单查询

热门文章

  1. 金算盘与金蝶的“全程电子商务“谁第一?
  2. 连载神器测评:这是我用过最好的免费看小说软件
  3. SIZE SSIZE
  4. 神器IDM | 不限速下载到底有多快?
  5. mac qq邮箱无法验证
  6. 人工智能带来的是大规模失业,还是“少干活多拿钱”?
  7. vue cli4 兼容IE浏览器
  8. 用python统计红楼梦出场人数最多的20位_《红楼梦》人物统计,统计前20位出场最多的人物。...
  9. PMP试题 | 每日一练,快速提分(二)
  10. 影视类APP软件开发作用