我正在构建一个应用程序,我可以在组件中播放相机预览,代码如下:
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,但适用于文本等。
我该如何解决这个问题或以其他方式进行? 谢谢!
我希望用户单击“启动画中画模式”按钮后,相机预览就会以画中画形式显示。
我也面临着类似的问题。您能解决这个问题吗?谢谢