热门标签 | HotTags
当前位置:  开发笔记 > IOS > 正文

零基础学习iOS直播之采集

直播的采集由采集的设备(摄像头、话筒)不同分为视频采集和音频采集,本篇文章会分别介绍,需要的朋友一起来看下吧

直播的采集由采集的设备(摄像头、话筒)不同分为视频采集和音频采集,本篇文章会分别介绍。

1.采集步骤

  1. 创建捕捉会话(AVCaptureSession),iOS调用相机和话筒之前都需要创建捕捉对话,把输入输出设备添加进对话中。
  2. 往会话中添加视频输入对象(AVCaptureDeviceInput)。
  3. 往会话中添加音频输入对象(AVCaptureDeviceInput)。
  4. 往会话中添加视频输出对象(AVCaptureVideoDataOutput)。
  5. 往会话中添加音频输出对象(AVCaptureAudioDataOutput)。
  6. 添加视屏预览图层(AVCaptureVideoPreviewLayer)。
  7. 开启会话。
  8. 推流(以后讲)。

2.效果图

这是后置摄像头采集的,直播一般用前置摄像头的,但是我实在没勇气放出我的自拍😂。

3.代码演示

// 采集
- (void)setupCaputureVideo {
 // 1.创建捕获对话,必须要强引用,否则会释放
 _captureSession = [[AVCaptureSession alloc] init];
 // 2.捕获摄像头设备,默认前置摄像头
 AVCaptureDevice *videoDevice = [self getVideoDevice:AVCaptureDevicePositionFront];
 // 3.获取声音设备
 AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
 // 4.创建对应视频设备输入对象
 _currentVideoDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:nil];
 // 5.创建对应音频设备输入对象
 AVCaptureDeviceInput *audioDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:nil];
 // 6.添加到会话中 注意:最好要判断是否能添加输入,会话不能添加空的
 // 6.1 添加视频
 if ([_captureSession canAddInput:_currentVideoDeviceInput]) {
 [_captureSession addInput:_currentVideoDeviceInput];
 }
 // 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 Capure Queue", DISPATCH_QUEUE_SERIAL);
 [videoOutput setSampleBufferDelegate: self queue:videoQueue];
 // 8.设置音频数据输出设备
 AVCaptureAudioDataOutput *audioOutput = [[AVCaptureAudioDataOutput alloc] init];
 // 8.1 设置代理,捕获音频样品数据 注意:必须是串行队列才能捕获到数据,而且不能为空
 dispatch_queue_t audioQueue = dispatch_queue_create("Audio Capure Queue", DISPATCH_QUEUE_SERIAL);
 [audioOutput setSampleBufferDelegate:self queue:audioQueue];
 // 9.添加到会话中 注意:最好要判断是否能添加输入,会话不能添加空的
 if ([_captureSession canAddOutput:videoOutput]) {
 [_captureSession addOutput:videoOutput];
 }
 if ([_captureSession canAddOutput:audioOutput]) {
 [_captureSession addOutput:audioOutput];
 }
 // 10.获取视屏输入与输出连接,用于分辨音视频数据
 _videoCOnnection= [videoOutput connectionWithMediaType:AVMediaTypeVideo];
 // 11.添加视屏预览图层
 _previewdLayer = [AVCaptureVideoPreviewLayer layerWithSession:_captureSession];
 _previewdLayer.frame = [UIScreen mainScreen].bounds;
 [self.view.layer insertSublayer:_previewdLayer atIndex:0];
 // 12.开启会话
 [_captureSession startRunning];
}
// 根据摄像头方向获取摄像头
- (AVCaptureDevice *)getVideoDevice: (AVCaptureDevicePosition)position {
 NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
 for (AVCaptureDevice *device in devices) {
 if (device.position == position) {
 return device;
 }
 }
 return nil;
}

分析:

(1)摄像头:每个手机都有且仅有两个摄像头,前置摄像头和后置摄像头,包括iPhone 7 Plus,它后面的两个摄像头统称为后置摄像头。所以获取的是摄像头数组,我们根据摄像头的方向获取指定的摄像头。对话里只能有一个摄像头设备。

(2)摄像头方向(AVCaptureDevicePosition):是一个枚举,有三个值可选择。不过如果选择

AVCaptureDevicePositionUnspecified,那么是不能调用摄像头的。
typedef NS_ENUM(NSInteger, AVCaptureDevicePosition) {
 AVCaptureDevicePositiOnUnspecified= 0, // 不指定
 AVCaptureDevicePositiOnBack= 1, //后置
 AVCaptureDevicePositiOnFront= 2 // 前置
}

(3)代理:AVCaptureVideoDataOutputSampleBufferDelegate, AVCaptureAudioDataOutputSampleBufferDelegate,分别为视频和音频输出设备对象的代理,两个代理都有下面的方法:

// 获取输出设备数据,有可能是音频,有可能是视频
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
 if (_videoCOnnection== connection) {
 NSLog(@"采集到视屏数据");
 }else {
 NSLog(@"采集到音频数据");
 }
}

4.切换摄像头

#pragma mark - 切换摄像头
- (IBAction)toggleCapture:(id)sender {
 // 1.获取当前设备方向
 AVCaptureDevicePosition cureentPosition = _currentVideoDeviceInput.device.position;
 // 2.获取需要改变的方向
 AVCaptureDevicePosition togglePosition = (cureentPosition == AVCaptureDevicePositionFront ? AVCaptureDevicePositionBack : AVCaptureDevicePositionFront);
 // 3.获取需要改变的摄像头设备
 AVCaptureDevice *toggleDevice = [self getVideoDevice:togglePosition];
 // 4.获取需要改变的摄像头输入设备
 AVCaptureDeviceInput *toggleDeviceInput = [[AVCaptureDeviceInput alloc] initWithDevice:toggleDevice error:nil];
 // 5.停止会话,否则会有一瞬间的白屏
 [_captureSession stopRunning];
 // 6.移除之前的摄像头输入设备,否则会崩溃,因为会话里只能有一个摄像头设备
 [_captureSession removeInput:_currentVideoDeviceInput];
 // 7.添加新的摄像头输入设备
 [_captureSession addInput:toggleDeviceInput];
 // 8.重新开始会话
 [_captureSession startRunning];
 // 记录当前摄像头输入设备
 //9.重新开始
 _currentVideoDeviceInput = toggleDeviceInput;
}

demo里还有其他的功能,但是感觉没什么太大用处,就不讲了,有兴趣的可以去我的GitHub上下载看看。

demo下载

demo下载地址。下载下来运行,发现报错。

那是因为我没有在工程里上传ijkplayer视屏直播框架,我能上传上去,但下载太慢了,什么原因大家都懂得。我把ijkplayer视屏直播框架放到百度云上了,没有密码,下载下来之后,放到LiveAppDemo-master文件夹里,重新打开就可以运行了。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


推荐阅读
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • 本文介绍了iOS开发中检测和解决内存泄漏的方法,包括静态分析、使用instruments检查内存泄漏以及代码测试等。同时还介绍了最能挣钱的行业,包括互联网行业、娱乐行业、教育行业、智能行业和老年服务行业,并提供了选行业的技巧。 ... [详细]
  • 我一直都有记录信息的习惯,不知是从什么时候开始,大约是在工作后不久。如今还真有点庆幸从那时开始记了点东西,当然是电子版的,写 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • 爱奇艺如何使用扫码登录二维码
    本文介绍了在使用爱奇艺时如何通过扫码登录二维码的具体操作方法,包括打开爱奇艺app、点击“我的”按钮、点击扫码按钮等步骤。同时提供了操作环境的相关信息,包括手机品牌型号、系统版本和软件版本。 ... [详细]
  • Python教学练习二Python1-12练习二一、判断季节用户输入月份,判断这个月是哪个季节?3,4,5月----春 ... [详细]
  • 苹果手机home键设置1.我们点击打开iPhone手机桌面上的设置图标。2.点击打开页面中的通用选项。 ... [详细]
  • 苹果iPhone性能模式怎么开启_苹果开启iPhone电池性能优先功能方法一览
    苹果iphone性能模式怎么开启?相信很多用户对于这个功能还不是很清楚,那么iphone电池性能优先功能在哪里呢?下面小编为大家带来苹果开启iPhone电池性能优先功能方法一览,需 ... [详细]
  • 苹果新手机必须需要设置什么软件?
    第一、设置iCloud账户,这会非常重要,很多服务和资料同步都依赖你设置的这个iCloud账户,而且请一定是要你自己可以控制的iCloud账户,并且也只有你才能控制;第二、在iCl ... [详细]
  • 1.webkit内核中的一些私有的meta标签,这些meta标签在开发webapp时起到非常重要的作用(1) ... [详细]
author-avatar
紫陌红尘一笑_423
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有