初步修复视频不能投屏的问题

This commit is contained in:
bluesea 2024-04-08 16:37:08 +08:00
parent ad884b0055
commit aef0834757
9 changed files with 247 additions and 173 deletions

View File

@ -563,42 +563,10 @@
filePath = "SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/CCSpatialVideoDisplayController.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "440"
endingLineNumber = "440"
startingLineNumber = "567"
endingLineNumber = "567"
landmarkName = "navgationButtonClick2(sender:)"
landmarkType = "7">
<Locations>
<Location
uuid = "AC3AF843-C4D6-4749-834A-B1DCA686B7CC - 151cde592e5f7ae5"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
symbolName = "closure #1 (Swift.Int) -&gt; () in SwiftProject.CCSpatialVideoDisplayController.navgationButtonClick2(sender: __C.UIButton) -&gt; ()"
moduleName = "SwiftProject"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/aaa/Documents/IOS%20Dev/VR/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/CCSpatialVideoDisplayController.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "437"
endingLineNumber = "437"
offsetFromSymbolStart = "608">
</Location>
<Location
uuid = "AC3AF843-C4D6-4749-834A-B1DCA686B7CC - 151cde592e5f7b80"
shouldBeEnabled = "Yes"
ignoreCount = "0"
continueAfterRunningActions = "No"
symbolName = "closure #1 (Swift.Int) -&gt; () in SwiftProject.CCSpatialVideoDisplayController.navgationButtonClick2(sender: __C.UIButton) -&gt; ()"
moduleName = "SwiftProject"
usesParentBreakpointCondition = "Yes"
urlString = "file:///Users/aaa/Documents/IOS%20Dev/VR/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/CCSpatialVideoDisplayController.swift"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "442"
endingLineNumber = "442"
offsetFromSymbolStart = "608">
</Location>
</Locations>
</BreakpointContent>
</BreakpointProxy>
<BreakpointProxy

View File

@ -18,7 +18,7 @@ import UIKit
import SVProgressHUD
import Firebase
import FirebaseCore
import AVFoundation
@main
@ -28,9 +28,17 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
// var root:RootManager?
var newWindow:UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Task {
FirebaseApp.configure()
// }
FirebaseApp.configure()
do {
try AVAudioSession.sharedInstance().setActive(true)
try AVAudioSession.sharedInstance().setCategory(.playback,options: .allowAirPlay)
}
catch {
print("err: set audiosession:\(error)")
}
SVProgressHUD.setDefaultStyle(.dark)

View File

@ -6,6 +6,8 @@
//
import UIKit
import AVKit
import AVFoundation
class ExternalSceneDelegate: UIResponder, UIWindowSceneDelegate {
@ -14,13 +16,19 @@ class ExternalSceneDelegate: UIResponder, UIWindowSceneDelegate {
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
print("ExternalSceneDelegate scene.......")
// let ac = UISceneActivationConditions()
// ac.canActivateForTargetContentIdentifierPredicate = NSPredicate(value: true)
// ac.prefersToActivateForTargetContentIdentifierPredicate = NSPredicate(value: true)
// scene.activationConditions = ac
// self.window?.rootViewController = ZZHExternalViewController()
// guard let _ = (scene as? UIWindowScene) else { return }
// guard let rootViewController = window?.rootViewController else {
// return
// }
}
func sceneDidDisconnect(_ scene: UIScene) {
@ -36,6 +44,7 @@ class ExternalSceneDelegate: UIResponder, UIWindowSceneDelegate {
// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
print("ExternalSceneDelegate sceneDidBecomeActive")
}
func sceneWillResignActive(_ scene: UIScene) {
// Called when the scene will move from an active state to an inactive state.

View File

@ -7,10 +7,14 @@
import Foundation
import UIKit
import AVKit
class ZZHExternalViewController: UIViewController {
var imageView: UIImageView?
// var avplayerController:AVPlayerViewController?
// var player:AVPlayer?
var playerLayer:AVPlayerLayer?
override func viewDidLoad() {
super.viewDidLoad()
print("ZZHExternalViewController viewDidLoad..")
@ -22,5 +26,17 @@ class ZZHExternalViewController: UIViewController {
make.left.top.right.bottom.equalTo(0)
})
// player = AVPlayer()
playerLayer = AVPlayerLayer()
playerLayer!.frame = self.view.bounds
self.view.layer.addSublayer(playerLayer!)
//// player?.allowsExternalPlayback = true
//// player?.usesExternalPlaybackWhileExternalScreenIsActive = true
// avplayerController = AVPlayerViewController()
// avplayerController?.player = player
// self.addChild(avplayerController!)
// self.view.addSubview(avplayerController!.view)
// avplayerController!.view.frame = self.view.bounds
}
}

View File

@ -39,5 +39,9 @@
</array>
</dict>
</dict>
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
</array>
</dict>
</plist>

View File

@ -278,85 +278,22 @@ class CCSpatialPhotoDisplayController: BaseController {
externalVC = ws.windows.first?.rootViewController as? ZZHExternalViewController
externalDispalylink = ws.windows.first?.screen.displayLink(withTarget: self, selector: #selector(displayUpdate(caDisplayLink:)))
externalDispalylink?.add(to: RunLoop.main, forMode: RunLoop.Mode.common)
externalVC?.imageView?.isHidden = false
externalVC?.playerLayer?.isHidden = true
}
}
//
// let sessions:Set<UISceneSession> = UIApplication.shared.openSessions
// sessions.forEach { ss in
// print("role:\(ss.role.rawValue)")
// }
// //
// let otherScreenSessions:Set<UISceneSession> = sessions.filter {
// $0.role.rawValue.contains("External")
// }
//
// otherScreenSessions.forEach { ssn in
// print("ssn role:\(ssn.role.rawValue) first:\(otherScreenSessions.first)")
// }
//
// UIApplication.shared.connectedScenes.forEach { us in
// print("conn sc:\(us)")
// }
// if let session = otherScreenSessions.first{
// let ssar = UISceneSessionActivationRequest.init(session: session)
// UIApplication.shared.activateSceneSession(for: ssar) { err in
// print("error:\(err)")
// }
// guard let scene = session.scene else {
// return
// }
// self.externalWindow.windowScene = scene as! UIWindowScene
// let nvc = UIViewController()
// self.externalWindow.rootViewController = nvc
// var imageView = UIImageView(frame: CGRectMake(0, 0, KScreenHeight*2, KScreenHeight*2))
// imageView.contentMode = .scaleAspectFit
// externalImageView = imageView
// nvc.view.addSubview(imageView)
// self.externalWindow.isHidden = false
// var dispalylink:CADisplayLink? = self.externalWindow.windowScene?.windows.first?.screen.displayLink(withTarget: self, selector: #selector(displayUpdate(caDisplayLink:)))
// dispalylink?.add(to: RunLoop.main, forMode: RunLoop.Mode.common)
// }
// else {
// print("....")
// }
}
else{
print("变化为 断开。。。。")
externalVC = nil
externalDispalylink?.invalidate()
externalDispalylink = nil
// if let imv = externalImageView{
// imv .removeFromSuperview()
// }
// externalImageView = nil
// self.externalWindow.isHidden = true
// self.externalWindow.rootViewController = nil
}
}
// @objc func hasNewWindowExternal(notification:Notification){
// print("hasNewWindowExternal notifi...")
// let window = notification.userInfo?["newwindow"] as! UIWindow
// let imageView = UIImageView(frame: CGRectMake(0, 0, KScreenHeight*2, KScreenHeight*2))
// imageView.contentMode = .scaleAspectFit
// externalImageView = imageView
// window.rootViewController?.view.addSubview(imageView)
// let dispalylink:CADisplayLink? = window.screen.displayLink(withTarget: self, selector: #selector(displayUpdate(caDisplayLink:)))
// dispalylink?.add(to: RunLoop.main, forMode: RunLoop.Mode.common)
//
// }
@objc func displayUpdate(caDisplayLink:CADisplayLink) {
// if externalImageView?.image != mImgView.image {
// externalImageView?.image = mImgView.image
// }
if let has_exvc = externalVC {
has_exvc.imageView?.image = mImgView.image
}

View File

@ -31,7 +31,8 @@ enum SpatialType : Int {
}
class CCSpatialVideoDisplayController: BaseController {
var externalDispalylink:CADisplayLink?
var externalVC:ZZHExternalViewController?
var isAirPlayActive:Bool = false {
didSet{
//selectedIndextypeData
@ -53,7 +54,10 @@ class CCSpatialVideoDisplayController: BaseController {
(icon:"type_check",title:NSLocalizedString("交叉眼", comment: ""),isHiden:false)]
}
//UI
setttinisScreenMirroring(isScreenMirroring: isAirPlayActive)
// DispatchQueue.main.asyncAfter(deadline: .now() + 5, execute: {
self.setttinisScreenMirroring(isScreenMirroring: self.isAirPlayActive)
// })
}
@ -231,7 +235,7 @@ class CCSpatialVideoDisplayController: BaseController {
await self.loadVideoAssetReader()
DispatchQueue.main.async {
self.configureInfo()
print("ccs viewdid load +++++++")
// print("ccs viewdid load +++++++")
// AirPlay
self.checkAirPlayStatus()
}
@ -241,9 +245,14 @@ class CCSpatialVideoDisplayController: BaseController {
func configureInfo(){
print("getPlayerItem ========")
let playerItem = self.getPlayerItem()
// let playerItem = self.getPlayerItem()
// player = AVPlayer(playerItem: playerItem)
player = AVPlayer()
player?.allowsExternalPlayback = true
player?.usesExternalPlaybackWhileExternalScreenIsActive = true
player = AVPlayer(playerItem: playerItem)
print("getPlayerItem >>>>>>>")
self.view.backgroundColor = UIColor(hexString: "#060507")
@ -264,15 +273,17 @@ class CCSpatialVideoDisplayController: BaseController {
playerController?.view.frame = CGRect.init(x: 0, y: 170, width: self.view.frame.size.width, height: 400)
self.addChild(playerController!)
self.view.addSubview(playerController!.view)
self.view.addSubview(tipsButton)
// AirPlay
NotificationCenter.default.addObserver(self, selector: #selector(airPlayStatusDidChange(_:)), name: AVAudioSession.routeChangeNotification, object: nil)
//
NotificationCenter.default.addObserver(self, selector: #selector(exScreenWillConnectNotification(notification:)), name: UIScene.willConnectNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(exScreenDisConnectNotification(notification:)), name: UIScene.didDisconnectNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(notification_PlayerEndTime(notification:)), name: AVPlayerItem.didPlayToEndTimeNotification, object: nil)
@ -291,10 +302,16 @@ class CCSpatialVideoDisplayController: BaseController {
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
if externalVC != nil {
externalVC?.playerLayer?.player = nil
}
player?.pause()
releaseVideoComposition()
let sec:TimeInterval = ZZHHelper.getSecFromUserDefaultByKey(kNowTimeToUserDefaultKey_VideoDisplayController)
Analytics.logEvent("preview_pv", parameters: ["refer_page":"视频预览页面","duration":sec])
}
override func viewWillDisappear(_ animated: Bool) {
@ -304,7 +321,31 @@ class CCSpatialVideoDisplayController: BaseController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if self.player?.currentItem == nil {//:1,didload,viewDidDisappear
let playerItem = self.getPlayerItem()
self.player?.replaceCurrentItem(with: playerItem)
}
if self.externalVC != nil {//
if self.externalVC?.playerLayer?.player == nil {
self.activeSession()
self.externalVC?.playerLayer?.player = self.player
}
}
self.player?.play()
// else if self.playerController?.player {
// let playerItem = self.getPlayerItem()
// Task {
// print("ccs viewdid load ---------")
// await self.loadVideoAssetReader()
// DispatchQueue.main.async {[weak self] in
// self?.player?.replaceCurrentItem(with: playerItem)
// self?.player?.play()
// }
// }
// }
}
//MARK: -
@ -320,6 +361,17 @@ class CCSpatialVideoDisplayController: BaseController {
}
}
@objc func exScreenWillConnectNotification(notification:Notification){
print("exScreenWillConnectNotification>>>>>")
airPlayStatusDidChange( notification)
}
@objc func exScreenDisConnectNotification(notification:Notification){
print("exScreenDisConnectNotification>>>>>")
airPlayStatusDidChange( notification)
}
private func checkAirPlayStatus() {
print("设备连接变化")
@ -331,74 +383,149 @@ class CCSpatialVideoDisplayController: BaseController {
}
func setttinisScreenMirroring(isScreenMirroring:Bool){
//
if(isScreenMirroring){
print("已连接")
link = true
isPlaying = true
playerController!.player!.usesExternalPlaybackWhileExternalScreenIsActive = true
playerController!.player!.allowsExternalPlayback = true
//
mTopCenterTypeButton.setImage(UIImage.init(named: "linked_button"), for: .normal)
mTopCenterTypeButton.setTitleColor(UIColor(hexString: "#D0C0FF"), for: .normal)
mTopCenterTypeButton.layer.borderColor = UIColor(hexString: "#D0C0FF").cgColor
mTopCenterTypeButton.backgroundColor = UIColor(hexString: "#5326D6")
mTopCenterTypeButton.updateBtnEdgeInsets(style: .Left, space: 5)
//
if isPlaying {
// ---
menuView.showFooterView(isShow: true, showText: NSLocalizedString("结束串流", comment: ""))
mTopCenterTypeButton.setTitle(NSLocalizedString("外部串流中", comment: ""), for: UIControl.State.normal)
}else{
// ---
menuView.showFooterView(isShow: true, showText: NSLocalizedString("开始串流", comment: ""))
mTopCenterTypeButton.setTitle(NSLocalizedString("已连接外部设备", comment: ""), for: UIControl.State.normal)
}
}else{
//
print("未连接")
link = false
isPlaying = false
// AirPlay
playerController!.player!.usesExternalPlaybackWhileExternalScreenIsActive = false
playerController!.player!.allowsExternalPlayback = false
if self.selectedIndex == .monocular2D {
mTopCenterTypeButton.setTitle(NSLocalizedString("单眼2D", comment: ""), for: UIControl.State.normal)
}else if self.selectedIndex == .redBlueSolid {
mTopCenterTypeButton.setTitle(NSLocalizedString("红蓝立体", comment: ""), for: UIControl.State.normal)
}else if self.selectedIndex == .crossedEyes {
mTopCenterTypeButton.setTitle(NSLocalizedString("交叉眼", comment: ""), for: UIControl.State.normal)
}
else if self.selectedIndex == .parallelEyes {
mTopCenterTypeButton.setTitle(NSLocalizedString("平行眼", comment: ""), for: UIControl.State.normal)
}
mTopCenterTypeButton.setImage(UIImage.init(named: "type_button_arrow_down"), for: .normal)
mTopCenterTypeButton.setTitleColor(UIColor.white, for: UIControl.State.normal)
mTopCenterTypeButton.layer.borderColor = UIColor.white.cgColor
mTopCenterTypeButton.backgroundColor = UIColor(hexString: "#1F1E20")
mTopCenterTypeButton.updateBtnEdgeInsets(style: .Right, space: 10)
//
menuView.showFooterView(isShow: false, showText: "")
releaseVideoComposition()
//
if(isScreenMirroring){
self.dealTaskWhenExternalScreenConnect()
}else{
//
self.dealTaskWhenExternalScreenDisConnect()
}
}
//session
func activeSession(){
do {
try AVAudioSession.sharedInstance().setActive(true)
try AVAudioSession.sharedInstance().setCategory(.playback,options: .allowAirPlay)
}
catch {
print("err: set audiosession:\(error)")
}
}
//
func dealTaskWhenExternalScreenConnect(){
if link == true {
return
}
link = true
isPlaying = true
let playerItem = self.getPlayerItem()
player?.replaceCurrentItem(with: playerItem)
print("外接屏幕已连接.....")
activeSession()
UIApplication.shared.connectedScenes.forEach { us in
print("uisence:\(us)\n")
let ws = us as! UIWindowScene
if ws.session.role.rawValue == "UIWindowSceneSessionRoleExternalDisplayNonInteractive"{
externalVC = ws.windows.first?.rootViewController as? ZZHExternalViewController
if let evc = externalVC {
if let ed = externalDispalylink {
externalDispalylink?.invalidate()
externalDispalylink = nil
}
externalDispalylink = ws.windows.first?.screen.displayLink(withTarget: self, selector: #selector(displayUpdate(caDisplayLink:)))
externalDispalylink?.add(to: RunLoop.main, forMode: RunLoop.Mode.common)
}
}
}
//
mTopCenterTypeButton.setImage(UIImage.init(named: "linked_button"), for: .normal)
mTopCenterTypeButton.setTitleColor(UIColor(hexString: "#D0C0FF"), for: .normal)
mTopCenterTypeButton.layer.borderColor = UIColor(hexString: "#D0C0FF").cgColor
mTopCenterTypeButton.backgroundColor = UIColor(hexString: "#5326D6")
mTopCenterTypeButton.updateBtnEdgeInsets(style: .Left, space: 5)
//
if isPlaying {
// ---
menuView.showFooterView(isShow: true, showText: NSLocalizedString("结束串流", comment: ""))
mTopCenterTypeButton.setTitle(NSLocalizedString("外部串流中", comment: ""), for: UIControl.State.normal)
}else{
// ---
menuView.showFooterView(isShow: true, showText: NSLocalizedString("开始串流", comment: ""))
mTopCenterTypeButton.setTitle(NSLocalizedString("已连接外部设备", comment: ""), for: UIControl.State.normal)
}
}
//
func dealTaskWhenExternalScreenDisConnect(){
print("外接屏幕已断开.....")
let playerItem = self.getPlayerItem()
player?.replaceCurrentItem(with: playerItem)
link = false
isPlaying = false
// AirPlay
if self.selectedIndex == .monocular2D {
mTopCenterTypeButton.setTitle(NSLocalizedString("单眼2D", comment: ""), for: UIControl.State.normal)
}else if self.selectedIndex == .redBlueSolid {
mTopCenterTypeButton.setTitle(NSLocalizedString("红蓝立体", comment: ""), for: UIControl.State.normal)
}else if self.selectedIndex == .crossedEyes {
mTopCenterTypeButton.setTitle(NSLocalizedString("交叉眼", comment: ""), for: UIControl.State.normal)
}
else if self.selectedIndex == .parallelEyes {
mTopCenterTypeButton.setTitle(NSLocalizedString("平行眼", comment: ""), for: UIControl.State.normal)
}
mTopCenterTypeButton.setImage(UIImage.init(named: "type_button_arrow_down"), for: .normal)
mTopCenterTypeButton.setTitleColor(UIColor.white, for: UIControl.State.normal)
mTopCenterTypeButton.layer.borderColor = UIColor.white.cgColor
mTopCenterTypeButton.backgroundColor = UIColor(hexString: "#1F1E20")
mTopCenterTypeButton.updateBtnEdgeInsets(style: .Right, space: 10)
//
menuView.showFooterView(isShow: false, showText: "")
externalVC?.playerLayer?.player = nil
self.playerController?.player = player
player?.play()
}
@objc func displayUpdate(caDisplayLink:CADisplayLink) {
if let has_exvc = externalVC {
if has_exvc.playerLayer?.player == nil {
has_exvc.imageView?.isHidden = true
has_exvc.playerLayer?.isHidden = false
self.playerController?.player = nil
has_exvc.playerLayer?.player = player
player?.play()
// externalDispalylink?.invalidate()
// externalDispalylink = nil
}
}
}
deinit {
print("patialvideodisplaycontroler deinit......")
self.player?.currentItem?.videoComposition = nil
releaseVideoComposition()
assetReader?.cancelReading()
NotificationCenter.default.removeObserver(self)
}
func releaseVideoComposition() {
if let ed = externalDispalylink {
externalDispalylink?.invalidate()
externalDispalylink = nil
}
self.player?.currentItem?.videoComposition = nil
self.player?.replaceCurrentItem(with: nil)
}
//MARK: - action
@objc public func navgationButtonClick2(sender:UIButton){

View File

@ -113,6 +113,11 @@ class VRVideoTransformController: BaseController {
Analytics.logEvent("transcode_video_pv", parameters: ["refer_page":"视频转码页面","duration":sec])
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.mAvPlayer?.player?.pause()
}
deinit {
print("deinit--class:\(String(describing: object_getClass(self))) objc:\(self)")
}