实现可拖动边转边播

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
}
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 {
//assetReaderoutput
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
}