diff --git a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController.swift b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController.swift index 181f82c..69b8b0d 100644 --- a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController.swift +++ b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController.swift @@ -29,7 +29,7 @@ enum SpatialType : Int { case fsbs } -class CCSpatialVideoDisplayController: BaseController { +class CCSpatialVideoDisplayController: BaseController, AVPlayerViewControllerDelegate { var isAirPlayActive:Bool = false { didSet{ @@ -50,12 +50,15 @@ class CCSpatialVideoDisplayController: BaseController { //更新串流UI setttinisScreenMirroring(isScreenMirroring: isAirPlayActive) } + + } var assetReader:AVAssetReader? var assetOutput:AVAssetReaderTrackOutput? + var assetTrack:AVAssetTrack? var link = false//是否已连接设备 @@ -68,6 +71,8 @@ class CCSpatialVideoDisplayController: BaseController { } } + + let videoTranserConvertor = PlayByTransferConvertor() lazy var videoOriginalAsset:AVAsset = { @@ -201,14 +206,35 @@ class CCSpatialVideoDisplayController: BaseController { }() + //监听播放完毕 + @objc func notification_PlayerEndTime(notification:Notification){ + print("PlayerEndTime....") + } + + //监听拖动播放的进度事件 + @objc func notification_PlayerTimeJump(notification:Notification){ + +// self.player?.play() +// Task { +// await self.loadVideoAssetReader() +// DispatchQueue.main.async { +// self.player?.play() +// } +// } + print("time jump....") + + + } override func viewDidLoad() { super.viewDidLoad() Task { + print("ccs viewdid load ---------") await self.loadVideoAssetReader() } + let playerItem = self.getPlayerItem() player = AVPlayer(playerItem: playerItem) @@ -233,6 +259,7 @@ class CCSpatialVideoDisplayController: BaseController { playerController = AVPlayerViewController() playerController?.player = player + playerController?.delegate = self playerController!.view.backgroundColor = .clear playerController?.view.frame = CGRect.init(x: 0, y: 170, width: self.view.frame.size.width, height: 400) self.addChild(playerController!) @@ -244,6 +271,9 @@ class CCSpatialVideoDisplayController: BaseController { // 监听 AirPlay 设备的连接状态 NotificationCenter.default.addObserver(self, selector: #selector(airPlayStatusDidChange(_:)), name: AVAudioSession.routeChangeNotification, object: nil) self.player!.play() + + NotificationCenter.default.addObserver(self, selector: #selector(notification_PlayerEndTime(notification:)), name: AVPlayerItem.didPlayToEndTimeNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(notification_PlayerTimeJump(notification:)), name: AVPlayerItem.timeJumpedNotification, object: nil) } func getPlayerItem() -> AVPlayerItem { @@ -251,6 +281,9 @@ class CCSpatialVideoDisplayController: BaseController { //实时播放回调可以做滤镜操作 temItem.videoComposition = AVVideoComposition(asset: temItem.asset) { [self] request in let compositionTime = request.compositionTime + let end:CMTime = CMTimeMake(value: Int64(compositionTime.value+1), timescale: compositionTime.timescale) + let tr = CMTimeRange(start: compositionTime, end: end) + self.quickLoadAReader(timeRange: tr) var ciImg:CIImage? = nil switch self.selectedIndex { case .crossedEyes://交叉眼 @@ -273,9 +306,11 @@ class CCSpatialVideoDisplayController: BaseController { break } + if let ciImg { request.finish(with: ciImg, context: nil) } + } return temItem } @@ -283,26 +318,42 @@ class CCSpatialVideoDisplayController: BaseController { //加载assetReader和output func loadVideoAssetReader() async { do { - if(assetReader != nil && assetReader!.status == .reading){ - assetReader?.cancelReading() + if self.assetTrack == nil { + assetTrack = try await self.videoOriginalAsset.loadTracks(withMediaType: .video).first! } - assetReader = try AVAssetReader(asset: self.videoOriginalAsset) - assetOutput = try await AVAssetReaderTrackOutput( - track: self.videoOriginalAsset.loadTracks(withMediaType: .video).first!, - outputSettings: [ - AVVideoDecompressionPropertiesKey: [ - kVTDecompressionPropertyKey_RequestedMVHEVCVideoLayerIDs: [0, 1] as CFArray, - ], - ] - ) - assetReader!.timeRange = CMTimeRange(start: .zero, duration: .positiveInfinity) - assetReader!.add(assetOutput!) - assetReader!.startReading() + let timeRange = CMTimeRange(start: .zero, duration: .positiveInfinity) + self.quickLoadAReader(timeRange: timeRange) + } catch { print("Error loading video: \(error)") } } + func quickLoadAReader(timeRange:CMTimeRange) { + if(assetOutput != nil){ + assetOutput?.markConfigurationAsFinal() + } + if(assetReader != nil){ + assetReader?.cancelReading() + } + assetReader = try! AVAssetReader(asset: self.videoOriginalAsset) + + assetOutput = AVAssetReaderTrackOutput( + track: self.assetTrack!, + outputSettings: [ + AVVideoDecompressionPropertiesKey: [ + kVTDecompressionPropertyKey_RequestedMVHEVCVideoLayerIDs: [0, 1] as CFArray, + ], + ] + ) + assetOutput?.supportsRandomAccess = true + assetReader!.timeRange = timeRange + assetReader!.add(assetOutput!) + assetReader!.startReading() + + + } + override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // 检查当前是否已连接到 AirPlay 设备 @@ -388,6 +439,8 @@ class CCSpatialVideoDisplayController: BaseController { } deinit { + print("patialvideodisplaycontroler deinit......") + assetReader?.cancelReading() NotificationCenter.default.removeObserver(self) } @@ -530,5 +583,10 @@ class CCSpatialVideoDisplayController: BaseController { } return isSpatialVideo } + + + + //AVPlayerViewControllerDelegate + }