实现可拖动边转边播
This commit is contained in:
parent
271d5ca96b
commit
0993c911a4
@ -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,26 +318,42 @@ class CCSpatialVideoDisplayController: BaseController {
|
|||||||
//加载assetReader和output
|
//加载assetReader和output
|
||||||
func loadVideoAssetReader() async {
|
func loadVideoAssetReader() async {
|
||||||
do {
|
do {
|
||||||
if(assetReader != nil && assetReader!.status == .reading){
|
if self.assetTrack == nil {
|
||||||
assetReader?.cancelReading()
|
assetTrack = try await self.videoOriginalAsset.loadTracks(withMediaType: .video).first!
|
||||||
}
|
}
|
||||||
assetReader = try AVAssetReader(asset: self.videoOriginalAsset)
|
let timeRange = CMTimeRange(start: .zero, duration: .positiveInfinity)
|
||||||
assetOutput = try await AVAssetReaderTrackOutput(
|
self.quickLoadAReader(timeRange: timeRange)
|
||||||
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()
|
|
||||||
} catch {
|
} catch {
|
||||||
print("Error loading video: \(error)")
|
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) {
|
override func viewDidAppear(_ animated: Bool) {
|
||||||
super.viewDidAppear(animated)
|
super.viewDidAppear(animated)
|
||||||
// 检查当前是否已连接到 AirPlay 设备
|
// 检查当前是否已连接到 AirPlay 设备
|
||||||
@ -388,6 +439,8 @@ class CCSpatialVideoDisplayController: BaseController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
deinit {
|
deinit {
|
||||||
|
print("patialvideodisplaycontroler deinit......")
|
||||||
|
assetReader?.cancelReading()
|
||||||
NotificationCenter.default.removeObserver(self)
|
NotificationCenter.default.removeObserver(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -530,5 +583,10 @@ class CCSpatialVideoDisplayController: BaseController {
|
|||||||
}
|
}
|
||||||
return isSpatialVideo
|
return isSpatialVideo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//AVPlayerViewControllerDelegate
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user