实现可拖动边转边播
This commit is contained in:
parent
271d5ca96b
commit
0993c911a4
@ -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
|
||||
|
||||
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user