iOS Swift 相机步骤与注意事项
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS Swift 相机步骤与注意事项相关的知识,希望对你有一定的参考价值。
参考技术A 第一步:初始化 AVCaptureDevicelet capDevice = AVCaptureDevice.default(for: .video)
第二步:初始化 设备会话管理器 管理输入输出
let capDevicetureSession = AVCaptureSession.init()
///设置
capDevicetureSession?.canSetSessionPreset(AVCaptureSession.Preset.init(rawValue: "AVCaptureSessionPreset1280x720"))
capDevicetureSession?.sessionPreset = AVCaptureSession.Preset.init(rawValue: "AVCaptureSessionPreset1280x720")
第三步:初始化相机设备输入流
do
///初始化输入流
let capDeviceInput= try AVCaptureDeviceInput.init(device:capDevice!)
///添加输入流
if capDevicetureSession?.canAddInput(capDeviceInput!) == true
capDevicetureSession?.addInput(capDeviceInput!)
catch
print("相机初始化失败")
第四步: 拍照 初始化照片输出流
///初始化照片输出流
let capDeviceImgOutput = AVCapturePhotoOutput.init()
///添加输出流
if capDevicetureSession?.canAddOutput(capDeviceImgOutput!) == true
capDevicetureSession?.addOutput(capDeviceImgOutput!)
第五步:录像 初始化视频输出流
///初始化视频数据输出流
let capDeviceVideoOutput = AVCaptureVideoDataOutput.init()
///添加输出流
if capDevicetureSession?.canAddOutput(capDeviceVideoOutput!) == true
capDevicetureSession?.addOutput(capDeviceVideoOutput!)
capDeviceVideoOutput?.alwaysDiscardsLateVideoFrames = true //kCVPixelBufferPixelFormatTypeKey
capDeviceVideoOutput?.videoSettings = [String(kCVPixelBufferPixelFormatTypeKey):kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange]
capDeviceVideoOutput?.setSampleBufferDelegate( self , queue:DispatchQueue.init(label:"video"))
第六步:因为录像肯定还需要同步录制音频所以初始化音频的输入 输出
因为音频不能用上面的相机device所以
///初始化麦克风设备
let audioDevice =AVCaptureDevice.default(for: .audio)
do
// Wrap the audio device in a capture device input.
capDeviceAudioInput= try AVCaptureDeviceInput(device: audioDevice!)
// If the input can be added, add it to the session.
if capDevicetureSession!.canAddInput(capDeviceAudioInput!)
capDevicetureSession!.addInput(capDeviceAudioInput!)
catch
print("麦克风失败")
///初始化音频输出流
let capDeviceAudioOutput= AVCaptureAudioDataOutput.init()
if capDevicetureSession!.canAddOutput(capDeviceAudioOutput!)
capDevicetureSession!.addOutput(capDeviceAudioOutput!)
capDeviceAudioOutput?.setSampleBufferDelegate( self , queue:DispatchQueue.init(label:"audio"))
第七步:初始化视频连接器
let videoConnection = capDeviceVideoOutput?.connection(with: .video)
videoConnection?.automaticallyAdjustsVideoMirroring = false
//设置视频输出方向
videoConnection?.videoOrientation = .portrait
//判断是否支撑视频稳定 可以显著提高视频的质量 只会在录制视频文件涉及到
if videoConnection!.isVideoStabilizationSupported
videoConnection?.preferredVideoStabilizationMode = .auto
第八步:最重要的一步:将所有的输入输出流都添加到设备会话管理器
前面几步已经添加了
最后就是初始化预览相机的视图了
///初始化相机输出流预览图层
let capDevicePreViewLayer = AVCaptureVideoPreviewLayer.init(session: capDevicetureSession!)
capDeviceContentView=SYDIYCameraContentView.init(frame: preViewLayerFrame)
capDevicePreViewLayer?.frame=CGRect.init(x:0, y:0, width: preViewLayerFrame.size.width, height: preViewLayerFrame.size.height)
capDevicePreViewLayer?.videoGravity = .resizeAspectFill
然后开启会话管理器启动设备运行
capDevicetureSession?.startRunning()
注意事项就是:所有设置必须在会话管理器启动前初始化并且设置,不然拍照 和 录像 会有很多小问题
(Agora, iOS, Swift) ScreenShare 的示例代码问题 - 它共享相机而不是屏幕
【中文标题】(Agora, iOS, Swift) ScreenShare 的示例代码问题 - 它共享相机而不是屏幕【英文标题】:(Agora, iOS, Swift) Example Code Issue for ScreenShare - It shares camera instead of screen 【发布时间】:2022-01-24 03:04:05 【问题描述】:我已经成功运行并构建了 Agora 编写的 ScreenShare 示例代码: https://github.com/AgoraIO/API-Examples/tree/master/iOS/APIExample/Examples/Advanced/ScreenShare
但是,当我使用该应用程序并使用 ScreenShare 功能时,它会共享我的前视摄像头而不是我的屏幕。我已经通过在此处连接到相同的 AppId 和 Channel 来验证这一点: https://webdemo.agora.io/agora-websdk-api-example-4.x/shareTheScreen/index.html
有人知道问题出在哪里吗?我不确定为什么示例代码没有按预期工作。
我尝试过的事情:
点击 RPSystemBroadcastPickerView 后,已验证广播扩展正在运行。疑似修复:
使用 AgoraRtcEngine 的方法将 Video Source 更改为 Screen。 (不确定如何)非常感谢。
【问题讨论】:
【参考方案1】:解决了。
需要在 AgoraUploader.swift 中改成:
sharedAgoraEngine.joinChannel(byToken: KeyCenter.Token, channelId: channel, info: nil, uid: SCREEN_SHARE_UID, joinSuccess: nil)
【讨论】:
以上是关于iOS Swift 相机步骤与注意事项的主要内容,如果未能解决你的问题,请参考以下文章