SwiftUI - 如何在画中画模式下显示摄像头画面

问题描述 投票:0回答:1

我正在构建一个应用程序,我可以在组件中播放相机预览,代码如下:

import SwiftUI
import AVFoundation
import AVKit

struct CameraPreview: UIViewControllerRepresentable {
    func makeUIViewController(context: Context) -> UIViewController {
        let controller = CameraPreviewViewController()
        return controller
    }

    func updateUIViewController(_ uiViewController: UIViewController, context: Context) { }
}

class CameraPreviewViewController: UIViewController {
    var session: AVCaptureSession?
    var previewLayer: AVCaptureVideoPreviewLayer?
    var player: AVPlayer?
    var playerLayer: AVPlayerLayer?
    var pipController: AVPictureInPictureController?

    override func viewDidLoad() {
        super.viewDidLoad()
        setupSession()
        setupPreview()
        startPIP()
    }

    func setupSession() {
        session = AVCaptureSession()
        let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaType.video, position: .front)
        guard let device = deviceDiscoverySession.devices.first else { return }
        guard let input = try? AVCaptureDeviceInput(device: device) else { return }
        session?.addInput(input)
    }

    func setupPreview() {
        previewLayer = AVCaptureVideoPreviewLayer(session: session!)
        previewLayer?.videoGravity = AVLayerVideoGravity.resize
        previewLayer?.frame = CGRect(x: 0, y: 0, width: 200, height: 200)
        view.layer.insertSublayer(previewLayer!, at: 0)
        player = AVPlayer()
        playerLayer = AVPlayerLayer(player: player)
        playerLayer?.frame = previewLayer!.frame
        view.layer.addSublayer(playerLayer!)
        session?.startRunning()
        player?.play()
    }

    func startPIP() {
        guard AVPictureInPictureController.isPictureInPictureSupported() else { return }
        pipController = AVPictureInPictureController(playerLayer: playerLayer!)
        pipController?.startPictureInPicture()        
    }
}

我一直在尝试使用 Pipify 包以画中画模式启动此视图。

import SwiftUI
import Pipify


struct ContentView: View {
    @State var isPresentedThree = false

    var body: some View {
        VStack {
            HStack{
                Image(systemName: "camera")
                    .imageScale(.large)
                    .foregroundColor(.accentColor)
                Image(systemName: "person")
                    .imageScale(.large)
                    .foregroundColor(.accentColor)
            }
            Text("FLOATING CAMERA")
                .padding(6.0)
            Button("Launch PiP mode") { isPresentedThree.toggle() }
                            .pipify(isPresented: $isPresentedThree) {
                                CameraPreview()
                                    .foregroundColor(.red)
                                    .padding()
                                    .onPipSkip { _ in }
                                    .onPipPlayPause { _ in }
                            }

        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

我是 SwiftUI 新手,所以我很困惑,该代码不适用于我的 CameraPreview,但适用于文本等。

我该如何解决这个问题或以其他方式进行? 谢谢!

我希望用户单击“启动画中画模式”按钮后,相机预览就会以画中画形式显示。

ios swift iphone swiftui picture-in-picture
1个回答
0
投票

我也面临着类似的问题。您能解决这个问题吗?谢谢

© www.soinside.com 2019 - 2024. All rights reserved.