/
PiPVideoPlayerView.swift
85 lines (72 loc) · 2.46 KB
/
PiPVideoPlayerView.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
//
// PiPVideoPlayerView.swift
// AudioMasterApp
//
// Created by 遠藤拓弥 on 2024/04/09.
//
import SwiftUI
import AVKit
import AudioMaster
class VideoPlayerViewController: UIViewController, AVPictureInPictureControllerDelegate {
private var playerLayer: AVPlayerLayer?
var player: AVPlayer?
private var pipController: AVPictureInPictureController?
override func viewDidLoad() {
super.viewDidLoad()
setupPlayer()
setupPiP()
}
private func setupPlayer() {
guard let player = player else { return }
playerLayer = AVPlayerLayer(player: player)
playerLayer?.frame = self.view.bounds
playerLayer?.videoGravity = .resizeAspect
if let playerLayer = playerLayer {
self.view.layer.addSublayer(playerLayer)
}
}
private func setupPiP() {
guard AVPictureInPictureController.isPictureInPictureSupported() else {
print("PiP is not supported on this device.")
return
}
pipController = AVPictureInPictureController(playerLayer: playerLayer!)
pipController?.delegate = self
}
func startPiP() {
pipController?.startPictureInPicture()
}
}
// SwiftUI wrapper for VideoPlayerViewController
struct VideoPlayerView: UIViewControllerRepresentable {
let player: AVPlayer
func makeUIViewController(context: Context) -> VideoPlayerViewController {
let viewController = VideoPlayerViewController()
viewController.player = player
return viewController
}
func updateUIViewController(_ uiViewController: VideoPlayerViewController, context: Context) {
}
}
struct PiPVideoPlayerView: View {
@State private var player = AVPlayer(url: Bundle.main.url(forResource: "sample2", withExtension: "mp4")!)
var body: some View {
VStack {
VideoPlayerView(player: player)
.onAppear { self.player.play() }
.onDisappear { self.player.pause() }
.edgesIgnoringSafeArea(.all)
Button("Start PiP") {
// Access your VideoPlayerViewController and start PiP
if let viewController = UIApplication.shared.windows.first?.rootViewController as? VideoPlayerViewController {
viewController.startPiP()
}
}
}
}
}
struct PiPVideoPlayerView_Previews: PreviewProvider {
static var previews: some View {
PiPVideoPlayerView()
}
}