添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

AVCaptureSession

我们先来了解一下 AVCaptureSession 的基本使用。

一个 session 需要有 input 和 output,这样数据才能在其中流动(处理),下面这个 session 包含了音视频输入,预览、图片、视频输出:

session.sessionPreset = AVCaptureSessionPresetHigh; // 选择后置广角相机 AVCaptureDeviceTypeBuiltInWideAngleCamera // 新款 iPhone 可以选择双摄相机 AVCaptureDeviceTypeBuiltInDualCamera AVCaptureDevice* videoDevice = [AVCaptureDevice defaultDeviceWithDeviceType:AVCaptureDeviceTypeBuiltInWideAngleCamera mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionBack]; // 创建 video input device AVCaptureDeviceInput* videoDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error]; if ([session canAddInput:videoDeviceInput]) { // 添加 video input device [session addInput:videoDeviceInput]; // 选择音频设备 AVCaptureDevice* audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; // 创建 audio input device AVCaptureDeviceInput* audioDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:&error]; if ([session canAddInput:audioDeviceInput]) { // 添加 audio input device [session addInput:audioDeviceInput]; // 创建视频录制 AVCaptureMovieFileOutput* movieFileOutput = [[AVCaptureMovieFileOutput alloc] init]; if ([session canAddOutput:movieFileOutput]) { // 添加视频录制 [session addOutput:movieFileOutput]; AVCaptureConnection* connection = [movieFileOutput connectionWithMediaType:AVMediaTypeVideo]; if (connection.isVideoStabilizationSupported) { connection.preferredVideoStabilizationMode = AVCaptureVideoStabilizationModeAuto; // 提交配置 [session commitConfiguration];

选好了设备和参数之后,开始采集的逻辑实现在 startCaptureWithDevice:format:fps:completionHandler 中,其过程和前面介绍的 AVCaptureSession 使用说明基本一致,但有几个要点:

  • WebRTC 封装了一个 RTCDispatcher 类,用来实现三种类型的任务调度:主线程,AVCaptureSession 线程,AudioSession 线程;
  • 在 init 函数中添加 output device,但并未调用 beginConfiguration commitConfiguration ,因为这里只做了添加一个 output device 的操作,本身是原子的;
  • 调用了 AVCaptureDevice lockForConfiguration unlockForConfiguration 来实现对硬件资源配置的独占访问;
  • 配置 input device 时,先移除老的 device,再添加新的 device,那这就需要利用事务机制了;

获取采集数据

setupVideoDataOutput 函数中,把 self 设置为 AVCaptureVideoDataOutput 的 delegate,在 captureOutput:didOutputSampleBuffer:fromConnection 中收到采集的数据,在 captureOutput:didDropSampleBuffer:fromConnection 中收到丢弃数据的通知。

采集到的数据封装在 CMSampleBufferRef 对象中,我们可以从中获取 CVPixelBufferRef (关于 CoreVideo 里的各种 image buffer,后面我们再仔细介绍)。

iOS 获取图像方向的逻辑还是比安卓要简单得多,这主要得益于 Apple 对硬件和系统的强硬控制:

#if TARGET_OS_IPHONE
  switch (_orientation) {
    case UIDeviceOrientationPortrait:
      _rotation = RTCVideoRotation_90;
      break;
    case UIDeviceOrientationPortraitUpsideDown:
      _rotation = RTCVideoRotation_270;
      break;
    case UIDeviceOrientationLandscapeLeft:
      _rotation = usingFrontCamera ? RTCVideoRotation_180 : RTCVideoRotation_0;
      break;
    case UIDeviceOrientationLandscapeRight:
      _rotation = usingFrontCamera ? RTCVideoRotation_0 : RTCVideoRotation_180;
      break;
    case UIDeviceOrientationFaceUp:
    case UIDeviceOrientationFaceDown:
    case UIDeviceOrientationUnknown:
      // Ignore.
      break;
#else
  // No rotation on Mac.
  _rotation = RTCVideoRotation_0;
#endif
int64_t timeStampNs =
    CMTimeGetSeconds(CMSampleBufferGetPresentationTimeStamp(sampleBuffer)) *
    kNanosecondsPerSecond;

原文链接:https://blog.piasy.com/2018/04/28/WebRTC-iOS-Camera-Capture/index.html

版权声明:本文内容转自互联网,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908#qq.com 举报,一经查实,本站将立刻删除。

(0)
  • 保障Zoom和用户的网络安全:2022年Zoom“漏洞奖金”计划回顾
  • 小程序websocket开发指南(小程序websocket用法)
  • VisualOn 将在 IBC2023 上推出通用内容自适应编码解决方案
  • AI和ChatGPT正在元宇宙中销售汽车
  • Haivision助力Mediapro对加拿大超级联赛的报道
  • 为什么要使用 CDN 进行直播?如何选择合适的直播CDN
  • 专注于3D视觉,「迁移科技」获数百万美元A轮融资
  • Edgio 公布 2023 年第二季度业绩
  • 梦想无限:META的AR眼镜在2027年会是什么样子的?
  • 图像采集:机器视觉图像采集优化方法
  •