iOS Swift 相机步骤与注意事项

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS Swift 相机步骤与注意事项相关的知识,希望对你有一定的参考价值。

参考技术A 第一步:初始化 AVCaptureDevice

let 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 相机步骤与注意事项的主要内容,如果未能解决你的问题,请参考以下文章

iOS ProtocolBuffer环境配置与使用

Swift和Objective-C混编的注意啦

iOS(Swift版)Flutter集成关键步骤

Swift和Objective-C混编的注意啦

iOS中OC与Swift互相桥接混编(注意项目中有多个TARGETS的情况)

iOS 定位服务通讯录日历提醒事项照片蓝牙共享麦克风相机等授权检测