实现可拖动边转边播

This commit is contained in:
bluesea 2024-03-13 15:54:24 +08:00
parent 271d5ca96b
commit 0993c911a4

View File

@ -29,7 +29,7 @@ enum SpatialType : Int {
case fsbs case fsbs
} }
class CCSpatialVideoDisplayController: BaseController { class CCSpatialVideoDisplayController: BaseController, AVPlayerViewControllerDelegate {
var isAirPlayActive:Bool = false { var isAirPlayActive:Bool = false {
didSet{ didSet{
@ -50,12 +50,15 @@ class CCSpatialVideoDisplayController: BaseController {
//UI //UI
setttinisScreenMirroring(isScreenMirroring: isAirPlayActive) setttinisScreenMirroring(isScreenMirroring: isAirPlayActive)
} }
} }
var assetReader:AVAssetReader? var assetReader:AVAssetReader?
var assetOutput:AVAssetReaderTrackOutput? var assetOutput:AVAssetReaderTrackOutput?
var assetTrack:AVAssetTrack?
var link = false// var link = false//
@ -68,6 +71,8 @@ class CCSpatialVideoDisplayController: BaseController {
} }
} }
let videoTranserConvertor = PlayByTransferConvertor() let videoTranserConvertor = PlayByTransferConvertor()
lazy var videoOriginalAsset:AVAsset = { 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() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
Task { Task {
print("ccs viewdid load ---------")
await self.loadVideoAssetReader() await self.loadVideoAssetReader()
} }
let playerItem = self.getPlayerItem() let playerItem = self.getPlayerItem()
player = AVPlayer(playerItem: playerItem) player = AVPlayer(playerItem: playerItem)
@ -233,6 +259,7 @@ class CCSpatialVideoDisplayController: BaseController {
playerController = AVPlayerViewController() playerController = AVPlayerViewController()
playerController?.player = player playerController?.player = player
playerController?.delegate = self
playerController!.view.backgroundColor = .clear playerController!.view.backgroundColor = .clear
playerController?.view.frame = CGRect.init(x: 0, y: 170, width: self.view.frame.size.width, height: 400) playerController?.view.frame = CGRect.init(x: 0, y: 170, width: self.view.frame.size.width, height: 400)
self.addChild(playerController!) self.addChild(playerController!)
@ -244,6 +271,9 @@ class CCSpatialVideoDisplayController: BaseController {
// AirPlay // AirPlay
NotificationCenter.default.addObserver(self, selector: #selector(airPlayStatusDidChange(_:)), name: AVAudioSession.routeChangeNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(airPlayStatusDidChange(_:)), name: AVAudioSession.routeChangeNotification, object: nil)
self.player!.play() 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 { func getPlayerItem() -> AVPlayerItem {
@ -251,6 +281,9 @@ class CCSpatialVideoDisplayController: BaseController {
// //
temItem.videoComposition = AVVideoComposition(asset: temItem.asset) { [self] request in temItem.videoComposition = AVVideoComposition(asset: temItem.asset) { [self] request in
let compositionTime = request.compositionTime 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 var ciImg:CIImage? = nil
switch self.selectedIndex { switch self.selectedIndex {
case .crossedEyes:// case .crossedEyes://
@ -273,9 +306,11 @@ class CCSpatialVideoDisplayController: BaseController {
break break
} }
if let ciImg { if let ciImg {
request.finish(with: ciImg, context: nil) request.finish(with: ciImg, context: nil)
} }
} }
return temItem return temItem
} }
@ -283,24 +318,40 @@ class CCSpatialVideoDisplayController: BaseController {
//assetReaderoutput //assetReaderoutput
func loadVideoAssetReader() async { func loadVideoAssetReader() async {
do { do {
if(assetReader != nil && assetReader!.status == .reading){ if self.assetTrack == nil {
assetTrack = try await self.videoOriginalAsset.loadTracks(withMediaType: .video).first!
}
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?.cancelReading()
} }
assetReader = try AVAssetReader(asset: self.videoOriginalAsset) assetReader = try! AVAssetReader(asset: self.videoOriginalAsset)
assetOutput = try await AVAssetReaderTrackOutput(
track: self.videoOriginalAsset.loadTracks(withMediaType: .video).first!, assetOutput = AVAssetReaderTrackOutput(
track: self.assetTrack!,
outputSettings: [ outputSettings: [
AVVideoDecompressionPropertiesKey: [ AVVideoDecompressionPropertiesKey: [
kVTDecompressionPropertyKey_RequestedMVHEVCVideoLayerIDs: [0, 1] as CFArray, kVTDecompressionPropertyKey_RequestedMVHEVCVideoLayerIDs: [0, 1] as CFArray,
], ],
] ]
) )
assetReader!.timeRange = CMTimeRange(start: .zero, duration: .positiveInfinity) assetOutput?.supportsRandomAccess = true
assetReader!.timeRange = timeRange
assetReader!.add(assetOutput!) assetReader!.add(assetOutput!)
assetReader!.startReading() assetReader!.startReading()
} catch {
print("Error loading video: \(error)")
}
} }
override func viewDidAppear(_ animated: Bool) { override func viewDidAppear(_ animated: Bool) {
@ -388,6 +439,8 @@ class CCSpatialVideoDisplayController: BaseController {
} }
deinit { deinit {
print("patialvideodisplaycontroler deinit......")
assetReader?.cancelReading()
NotificationCenter.default.removeObserver(self) NotificationCenter.default.removeObserver(self)
} }
@ -531,4 +584,9 @@ class CCSpatialVideoDisplayController: BaseController {
return isSpatialVideo return isSpatialVideo
} }
//AVPlayerViewControllerDelegate
} }