From 51b3cd596f14aa13a7e598767844cb501308fd8e Mon Sep 17 00:00:00 2001 From: bluesea <307723040@qq.com> Date: Tue, 12 Mar 2024 19:21:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E8=BE=B9=E8=BD=AC=E8=BE=B9?= =?UTF-8?q?=E6=92=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SwiftProject.xcodeproj/project.pbxproj | 4 + .../CCSpatialPhotoDisplayController.swift | 5 +- .../CCSpatialVideoDisplayController.swift | 359 ++++++++---------- .../Util/PlayByTransferConvertor.swift | 166 ++++++++ .../CCSpatialDisplayTypeView.swift | 15 +- tdvideo/tdvideo.xcodeproj/project.pbxproj | 4 +- .../UserInterfaceState.xcuserstate | Bin 110597 -> 116865 bytes tdvideo/tdvideo/PlayContoller8.swift | 18 +- 8 files changed, 356 insertions(+), 215 deletions(-) create mode 100644 SwiftProject/SwiftProject/Project/Util/PlayByTransferConvertor.swift diff --git a/SwiftProject/SwiftProject.xcodeproj/project.pbxproj b/SwiftProject/SwiftProject.xcodeproj/project.pbxproj index 4022548..e93378d 100644 --- a/SwiftProject/SwiftProject.xcodeproj/project.pbxproj +++ b/SwiftProject/SwiftProject.xcodeproj/project.pbxproj @@ -14,6 +14,7 @@ 00D33BF42B998BF700604A44 /* SpatialImageConvertor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00D33BF32B998BF700604A44 /* SpatialImageConvertor.swift */; }; 00D33BF62B99A19900604A44 /* SpatialVideoConvertor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00D33BF52B99A19900604A44 /* SpatialVideoConvertor.swift */; }; 00D33BFA2B9AB21A00604A44 /* ZZHAVExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00D33BF92B9AB21A00604A44 /* ZZHAVExtension.swift */; }; + 00ED6B342BA04AC200915BDE /* PlayByTransferConvertor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00ED6B332BA04AC200915BDE /* PlayByTransferConvertor.swift */; }; 04E1D3F12B68EDFE00743F2F /* CCWebController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04E1D3F02B68EDFE00743F2F /* CCWebController.swift */; }; 1E02C9322B8990C600DD3143 /* CCDeviceOperationListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E02C9312B8990C600DD3143 /* CCDeviceOperationListView.swift */; }; 1E02C9342B89916C00DD3143 /* CCDeviceOperationListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E02C9332B89916C00DD3143 /* CCDeviceOperationListCell.swift */; }; @@ -99,6 +100,7 @@ 00D33BF32B998BF700604A44 /* SpatialImageConvertor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpatialImageConvertor.swift; sourceTree = ""; }; 00D33BF52B99A19900604A44 /* SpatialVideoConvertor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpatialVideoConvertor.swift; sourceTree = ""; }; 00D33BF92B9AB21A00604A44 /* ZZHAVExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZZHAVExtension.swift; sourceTree = ""; }; + 00ED6B332BA04AC200915BDE /* PlayByTransferConvertor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayByTransferConvertor.swift; sourceTree = ""; }; 04E1D3F02B68EDFE00743F2F /* CCWebController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CCWebController.swift; sourceTree = ""; }; 1E02C9312B8990C600DD3143 /* CCDeviceOperationListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CCDeviceOperationListView.swift; sourceTree = ""; }; 1E02C9332B89916C00DD3143 /* CCDeviceOperationListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CCDeviceOperationListCell.swift; sourceTree = ""; }; @@ -234,6 +236,7 @@ 00D33BF92B9AB21A00604A44 /* ZZHAVExtension.swift */, 1EE5C5F92B8F97BF00EDFC2F /* SpatialVideoWriter.swift */, 005580772B9F1525004B9567 /* ZZHHelper.swift */, + 00ED6B332BA04AC200915BDE /* PlayByTransferConvertor.swift */, ); path = Util; sourceTree = ""; @@ -673,6 +676,7 @@ AF2120DA2B4E9BD400400B7F /* CCAlert.swift in Sources */, 1EFB8C702B88DA4800C72119 /* CCBottomMenuCell.swift in Sources */, AF2120FA2B4EA5BD00400B7F /* CCHomeController.swift in Sources */, + 00ED6B342BA04AC200915BDE /* PlayByTransferConvertor.swift in Sources */, AF2121072B4EA63000400B7F /* CCHomeData.swift in Sources */, AF2120FE2B4EA5F100400B7F /* CCLoginController.swift in Sources */, AF2120CE2B4E979500400B7F /* CCTextField.swift in Sources */, diff --git a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialPhotoDisplayController.swift b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialPhotoDisplayController.swift index 9764ddd..260c781 100644 --- a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialPhotoDisplayController.swift +++ b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialPhotoDisplayController.swift @@ -131,7 +131,10 @@ class CCSpatialPhotoDisplayController: BaseController { //init (test随机生成点位置,注意:arrow点是基于屏幕的位置) let pointOnScreen = navtionImgView!.convert(CGPointMake(navtionImgView!.centerX, navtionImgView!.bottom), to: KWindow) - let popMenu = CCSpatialDisplayTypeView(menuWidth: SCREEN_Width * 0.4, arrow: pointOnScreen, datas: typeData,configures: parameters) + let popMenu = CCSpatialDisplayTypeView(menuWidth: SCREEN_Width * 0.4, arrow: pointOnScreen, datas: typeData,configures: parameters){ + //dissmiss回调 + self.mTopCenterTypeButton.setImage(UIImage.init(named: "type_button_arrow_down"), for: .normal) + } return popMenu }() diff --git a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController.swift b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController.swift index d479ae0..29be755 100644 --- a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController.swift +++ b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController.swift @@ -8,8 +8,8 @@ import UIKit import AVFoundation import Photos - - +import AVKit +import VideoToolbox enum SpatialType : Int { /* @@ -24,32 +24,70 @@ enum SpatialType : Int { case parallelEyes case redBlueSolid case crossedEyes + //以下两种标记:外部串流时使用 + case hsbs + case fsbs } class CCSpatialVideoDisplayController: BaseController { + var isAirPlayActive:Bool = false { + didSet{ + //跟新selectedIndex、typeData的值 + if(isAirPlayActive){ + self.selectedIndex = .hsbs//在串流模式下,默认选项为hsbs + self.typeData = [(icon:"type_check",title:"3D HSBS",isHiden:false), + (icon:"type_check",title:"3D FSBS",isHiden:false), + ] + } + else{ + self.selectedIndex = .monocular2D//在非串流模式下,默认选项为monocular2D + self.typeData = [(icon:"type_check",title:"单眼2D",isHiden:false), + (icon:"type_check",title:"平行眼",isHiden:false), + (icon:"type_check",title:"红蓝立体",isHiden:false), + (icon:"type_check",title:"交叉眼",isHiden:false)] + } + //更新串流UI + setttinisScreenMirroring(isScreenMirroring: isAirPlayActive) + } + } + + var assetReader:AVAssetReader? + + var assetOutput:AVAssetReaderTrackOutput? + + var link = false//是否已连接设备 var isPlaying = false//是否正在播放 var selectedIndex:SpatialType = .monocular2D//记录当前选择的菜单选项 + { + didSet{ + //进行相应解码操作,边解边播 + } + } - let convertor2 = VideoConvertor2() + let videoTranserConvertor = PlayByTransferConvertor() - var videoOriginalAsset:AVAsset? - var videoTempAsset:AVAsset? + lazy var videoOriginalAsset:AVAsset = { + let asset = AVAsset(url: sourceVideoURL!) + return asset + }() + var videoOriginalPHAsset:PHAsset? //图片源数据 var sourceVideoURL:URL? - var outputVideoURL:URL? + let outputVideoURL:URL = URL.documentsDirectory.appending(path:"output1111.mp4") var imgData:Data? - //空间视频 交叉眼 红蓝立体 平行眼 高斯模糊 - var type = 0 + + var player:AVPlayer? + + var playerLay:AVPlayerLayer? - var player:AVPlayer = AVPlayer() lazy var mTopImgView:UIImageView = { @@ -102,26 +140,19 @@ class CCSpatialVideoDisplayController: BaseController { return button }() - lazy var playerLay:AVPlayerLayer = { - - let view = AVPlayerLayer() - view.backgroundColor = UIColor.black.cgColor - view.frame = CGRect.init(x: 0, y: 250, width: self.view.frame.size.width, height: 240) - return view - }() + var typeData:[(icon:String,title:String,isHiden:Bool)] = [(icon:"type_check",title:"单眼2D",isHiden:false), (icon:"type_check",title:"平行眼",isHiden:false), (icon:"type_check",title:"红蓝立体",isHiden:false), (icon:"type_check",title:"交叉眼",isHiden:false)] + { + didSet { + menuView.setData(datas: self.typeData) + } + } lazy var menuView: CCSpatialDisplayTypeView = { - //数据源(icon可不填) - // let popData = [(icon:"type_check",title:"单眼2D",isHiden:false), - // (icon:"type_check",title:"平行眼",isHiden:false), - // (icon:"type_check",title:"红蓝立体",isHiden:false), - // (icon:"type_check",title:"交叉眼",isHiden:false)] - //设置参数 let parameters:[CCSpatialDisplayTypeConfigure] = [ .PopMenuTextColor(UIColor.white), @@ -133,7 +164,10 @@ class CCSpatialVideoDisplayController: BaseController { //init (test随机生成点位置,注意:arrow点是基于屏幕的位置) let pointOnScreen = navtionImgView!.convert(CGPointMake(navtionImgView!.centerX, navtionImgView!.bottom), to: KWindow) - let popMenu = CCSpatialDisplayTypeView(menuWidth: SCREEN_Width * 0.4, arrow: pointOnScreen, datas: typeData,configures: parameters) + let popMenu = CCSpatialDisplayTypeView(menuWidth: SCREEN_Width * 0.4, arrow: pointOnScreen, datas: typeData,configures: parameters){ + //dissmiss回调 + self.mTopCenterTypeButton.setImage(UIImage.init(named: "type_button_arrow_down"), for: .normal) + } return popMenu }() @@ -171,15 +205,14 @@ class CCSpatialVideoDisplayController: BaseController { override func viewDidLoad() { super.viewDidLoad() + Task { + await self.loadVideoAssetReader() + } + + let playerItem = self.getPlayerItem() + player = AVPlayer(playerItem: playerItem) self.view.backgroundColor = UIColor(hexString: "#060507") - // Do any additional setup after loading the view. - - - - // let path = Bundle.main.path(forResource: "img3", ofType: "HEIC") - // photoOriginalURL = URL.init(filePath: path!) - outputVideoURL = URL.documentsDirectory.appending(path:"output11114.jpg") //设置返回按钮图片 self.setLeftOneBtnImg(imgStr: "spatial_back_button") @@ -193,24 +226,76 @@ class CCSpatialVideoDisplayController: BaseController { navtionBar?.addSubview(transformButton) navtionBar?.addSubview(mTopCenterTypeButton) self.view.addSubview(progressView) - self.view.layer.addSublayer(playerLay) + + playerLay = AVPlayerLayer(player: self.player) + playerLay!.backgroundColor = UIColor.clear.cgColor + playerLay!.frame = CGRect.init(x: 0, y: 250, width: self.view.frame.size.width, height: 240) + + self.view.layer.addSublayer(playerLay!) self.view.addSubview(tipsButton) - if sourceVideoURL != nil { - outputVideoURL = URL.documentsDirectory.appending(path:"output1111.mp4") - videoOriginalAsset = AVAsset(url: sourceVideoURL!) - videoTempAsset = videoOriginalAsset - play() - }else{ - print("这不是一张空间图片") - } - // 监听 AirPlay 设备的连接状态 NotificationCenter.default.addObserver(self, selector: #selector(airPlayStatusDidChange(_:)), name: AVAudioSession.routeChangeNotification, object: nil) - - + self.player!.play() + } + + func getPlayerItem() -> AVPlayerItem { + let temItem = AVPlayerItem(asset: self.videoOriginalAsset) + //实时播放回调可以做滤镜操作 + temItem.videoComposition = AVVideoComposition(asset: temItem.asset) { [self] request in + let compositionTime = request.compositionTime + var ciImg:CIImage? = nil + switch self.selectedIndex { + case .crossedEyes://交叉眼 + ciImg = videoTranserConvertor.convertVideo(asset: videoOriginalAsset, assetOutput: self.assetOutput!, type: self.selectedIndex, time: compositionTime) + break + case .fsbs: + ciImg = videoTranserConvertor.convertVideo(asset: videoOriginalAsset, assetOutput: self.assetOutput!, type: self.selectedIndex, time: compositionTime) + break + case .hsbs: + ciImg = videoTranserConvertor.convertVideo(asset: videoOriginalAsset, assetOutput: self.assetOutput!, type: self.selectedIndex, time: compositionTime) + break + case .parallelEyes://平行眼 + ciImg = videoTranserConvertor.convertVideo(asset: videoOriginalAsset, assetOutput: self.assetOutput!, type: self.selectedIndex, time: compositionTime) + break + case .monocular2D: + ciImg = request.sourceImage + break + case .redBlueSolid://红蓝立体 + ciImg = videoTranserConvertor.convertVideo(asset: videoOriginalAsset, assetOutput: self.assetOutput!, type: self.selectedIndex, time: compositionTime) + break + + } +// if let ciImg { + request.finish(with: ciImg!, context: nil) +// } + } + return temItem + } + + //加载assetReader和output + func loadVideoAssetReader() async { + do { + if(assetReader != nil && assetReader!.status == .reading){ + assetReader?.cancelReading() + } + 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() + } catch { + print("Error loading video: \(error)") + } } override func viewDidAppear(_ animated: Bool) { @@ -227,12 +312,10 @@ class CCSpatialVideoDisplayController: BaseController { private func checkAirPlayStatus() { print("设备连接变化") let currentRoute = AVAudioSession.sharedInstance().currentRoute - let isAirPlayActive = currentRoute.outputs.contains { output in + self.isAirPlayActive = currentRoute.outputs.contains { output in return output.portType == AVAudioSession.Port.HDMI || output.portType == AVAudioSession.Port.airPlay } - - setttinisScreenMirroring(isScreenMirroring: isAirPlayActive) } func setttinisScreenMirroring(isScreenMirroring:Bool){ @@ -242,8 +325,8 @@ class CCSpatialVideoDisplayController: BaseController { print("已连接") link = true isPlaying = true - playerLay.player!.usesExternalPlaybackWhileExternalScreenIsActive = true - playerLay.player!.allowsExternalPlayback = true + playerLay!.player!.usesExternalPlaybackWhileExternalScreenIsActive = true + playerLay!.player!.allowsExternalPlayback = true //串流播放中 // mTopCenterTypeButton.setTitle("串流播放中", for: UIControl.State.normal) @@ -254,9 +337,7 @@ class CCSpatialVideoDisplayController: BaseController { mTopCenterTypeButton.backgroundColor = UIColor(hexString: "#5326D6") mTopCenterTypeButton.updateBtnEdgeInsets(style: .Left, space: 5) - playerLay.player!.play() - - + //展示弹出列表尾部 if isPlaying { //正在串流中 --- 按钮显示为【结束串流】 @@ -275,8 +356,8 @@ class CCSpatialVideoDisplayController: BaseController { link = false isPlaying = false // 当前未连接到 AirPlay 设备 - playerLay.player!.usesExternalPlaybackWhileExternalScreenIsActive = false - playerLay.player!.allowsExternalPlayback = false + playerLay!.player!.usesExternalPlaybackWhileExternalScreenIsActive = false + playerLay!.player!.allowsExternalPlayback = false if self.selectedIndex == .monocular2D { mTopCenterTypeButton.setTitle("单眼2D", for: UIControl.State.normal) @@ -307,13 +388,13 @@ class CCSpatialVideoDisplayController: BaseController { //播放 - func play(){ - - let playerItem = AVPlayerItem(asset: videoTempAsset!) - playerLay.player = AVPlayer(playerItem: playerItem) - playerLay.player!.play() - playerLay.backgroundColor = UIColor.clear.cgColor - } +// func play(){ +// +// let playerItem = AVPlayerItem(asset: videoOriginalAsset) +// playerLay.player = AVPlayer(playerItem: playerItem) +// playerLay.player!.play() +// playerLay.backgroundColor = UIColor.clear.cgColor +// } //MARK: - action @@ -347,17 +428,16 @@ class CCSpatialVideoDisplayController: BaseController { } - //click + //顶部中间的按钮选中某个选项后的回调click menuView.didSelectMenuBlock = { [weak self](index:Int)->Void in print("block select \(index)") - self?.mTopCenterTypeButton.setImage(UIImage.init(named: "type_button_arrow_down"), for: .normal) self?.selectedSpatialType(selectedIndex: index) let title = self?.typeData[index].title self?.mTopCenterTypeButton.setTitle(title, for: UIControl.State.normal) } - //tap + //开始、结束串流的回调 menuView.tapFooterActionBlock = { self.startOrEndExternalVR() } @@ -371,107 +451,26 @@ class CCSpatialVideoDisplayController: BaseController { func startOrEndExternalVR() { //开始串流/结束串流 - if(link == true){ - isPlaying = !isPlaying - if(isPlaying == true){ - // 当前已连接到 AirPlay 设备 - playerLay.player!.usesExternalPlaybackWhileExternalScreenIsActive = true - playerLay.player!.allowsExternalPlayback = true - }else{ - playerLay.player!.usesExternalPlaybackWhileExternalScreenIsActive = false - playerLay.player!.allowsExternalPlayback = false - + if(link == true){ + isPlaying = !isPlaying + if(isPlaying == true){ + // 当前已连接到 AirPlay 设备 + playerLay!.player!.usesExternalPlaybackWhileExternalScreenIsActive = true + playerLay!.player!.allowsExternalPlayback = true + }else{ + playerLay!.player!.usesExternalPlaybackWhileExternalScreenIsActive = false + playerLay!.player!.allowsExternalPlayback = false + + } } } - } - func selectedSpatialType(selectedIndex:Int) { - -// if selectedIndex == 0 { -// self.selectedIndex = .monocular2D -// }else if selectedIndex == 1 { -// self.selectedIndex = .redBlueSolid -// }else if selectedIndex == 2 { -// self.selectedIndex = .crossedEyes -// } - - self.selectedIndex = SpatialType(rawValue: selectedIndex) ?? .monocular2D - - player.pause() - NotificationCenter.default.removeObserver(self) - - //立体视频 - if(selectedIndex == 0){ - videoTempAsset = videoOriginalAsset - play() - } - else{ - outputVideoURL = URL.documentsDirectory.appending(path:"output11112.mp4") - } - - //红蓝立体 - if(self.selectedIndex == .redBlueSolid){ - Task { - convertor2.type = 3 - - try await convertor2.convertVideo(asset: videoOriginalAsset!, outputFile: outputVideoURL! ) { [self] progress in - print(progress) - DispatchQueue.main.async { [weak self] in - self?.progressView.setProgress(progress, animated: true) - if(progress > 0.99){ - self!.videoTempAsset = AVAsset(url: self!.outputVideoURL!) - DispatchQueue.main.asyncAfter(deadline: .now() + 2) { - // 要执行的任务 - self!.play() - } - - } - } - - } - } - } - - //交叉眼 - if(self.selectedIndex == .crossedEyes){ - Task { - convertor2.type = 2 - - try await convertor2.convertVideo(asset: videoOriginalAsset!, outputFile: outputVideoURL! ) { [self] progress in - print(progress) - DispatchQueue.main.async { [weak self] in - self?.progressView.setProgress(progress, animated: true) - if(progress > 0.99){ - self!.videoTempAsset = AVAsset(url: self!.outputVideoURL!) - self!.play() - } - } - - } - } - } - - //平行眼 - if(self.selectedIndex == .parallelEyes){ - Task { - convertor2.type = 5 - - try await convertor2.convertVideo(asset: videoOriginalAsset!, outputFile: outputVideoURL! ) { [self] progress in - print(progress) - DispatchQueue.main.async { [weak self] in - self?.progressView.setProgress(progress, animated: true) - if(progress > 0.99){ - self!.videoTempAsset = AVAsset(url: self!.outputVideoURL!) - self!.play() - } - } - - } - } - } - - + func selectedSpatialType(selectedIndex:Int){ + let rsi : SpatialType = SpatialType(rawValue: selectedIndex) ?? .monocular2D +// player!.play() + self.selectedIndex = rsi + //空间视频 @@ -511,29 +510,6 @@ class CCSpatialVideoDisplayController: BaseController { } - - func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { - - - if let mediaType = info[UIImagePickerController.InfoKey.mediaType] as? String, mediaType == "public.movie" { - let videoURL = info[.mediaURL] as? URL - print("Selected video URL: \(videoURL)") - sourceVideoURL = videoURL - videoOriginalAsset = AVAsset(url: sourceVideoURL!) - videoTempAsset = videoOriginalAsset - if(!isSpatialVideo(asset: videoTempAsset!)){ - showTextAlert(title: "提示", message: "当前视频不是空间视频") - } - play() - } - - dismiss(animated: true, completion: nil) - } - - func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { - dismiss(animated: true, completion: nil) - } - //检查是否为空间视频 func isSpatialVideo(asset: AVAsset) -> Bool { let metadata = asset.metadata(forFormat: AVMetadataFormat.quickTimeMetadata) @@ -546,23 +522,4 @@ class CCSpatialVideoDisplayController: BaseController { return isSpatialVideo } - func showTextAlert(title: String, message: String) { - let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert) - let okAction = UIAlertAction(title: "OK", style: .default, handler: nil) - alertController.addAction(okAction) - - // 在视图控制器中显示弹窗 - present(alertController, animated: true, completion: nil) - } - - /* - // MARK: - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepare(for segue: UIStoryboardSegue, sender: Any?) { - // Get the new view controller using segue.destination. - // Pass the selected object to the new view controller. - } - */ - } diff --git a/SwiftProject/SwiftProject/Project/Util/PlayByTransferConvertor.swift b/SwiftProject/SwiftProject/Project/Util/PlayByTransferConvertor.swift new file mode 100644 index 0000000..c3f9600 --- /dev/null +++ b/SwiftProject/SwiftProject/Project/Util/PlayByTransferConvertor.swift @@ -0,0 +1,166 @@ +// +// PlayByTransferConvertor.swift +// SwiftProject +// +// Created by aaa on 2024/3/12. +// + +import Foundation +import AVKit +import VideoToolbox +import CoreImage +import ImageIO + + + +class PlayByTransferConvertor { + func convertVideo(asset:AVAsset, assetOutput:AVAssetReaderTrackOutput,type:SpatialType,time: CMTime)->(CIImage?) { + var newpb:CIImage? = nil + while let nextSampleBuffer = assetOutput.copyNextSampleBuffer() { + let presentationTime = CMSampleBufferGetPresentationTimeStamp(nextSampleBuffer) + if presentationTime == time { + guard let taggedBuffers = nextSampleBuffer.taggedBuffers else { break } + + let leftEyeBuffer = taggedBuffers.first(where: { + $0.tags.first(matchingCategory: .stereoView) == .stereoView(.leftEye) + })?.buffer + let rightEyeBuffer = taggedBuffers.first(where: { + $0.tags.first(matchingCategory: .stereoView) == .stereoView(.rightEye) + })?.buffer + + + if let leftEyeBuffer, + let rightEyeBuffer, + case let .pixelBuffer(leftEyePixelBuffer) = leftEyeBuffer, + case let .pixelBuffer(rightEyePixelBuffer) = rightEyeBuffer { + + let lciImage = CIImage(cvPixelBuffer: leftEyePixelBuffer) + let rciImage = CIImage(cvPixelBuffer: rightEyePixelBuffer) + + let left = UIImage(ciImage: lciImage ) + let right = UIImage(ciImage: rciImage ) + + + var cwidth:CGFloat + var cheight:CGFloat + switch type { + case .hsbs: + cwidth = left.size.width + cheight = left.size.height + newpb = joinImages_sbs(left: left, right: right, imgWidth: cwidth, imgHeight:cheight ) + break + case .fsbs: + cwidth = left.size.width*2 + cheight = left.size.height + newpb = joinImages_sbs(left: left, right: right, imgWidth: cwidth, imgHeight: cheight) + break + case .parallelEyes://平行眼 + + newpb = joinImages(leftImage: lciImage, rightImage: rciImage) + break + case .crossedEyes://交叉眼 + newpb = joinImages(leftImage: rciImage, rightImage: lciImage) + break + case .redBlueSolid://红蓝立体 + newpb = joinImages_red_blue(lciImage: lciImage, rciImage: rciImage) + break + default: + break + } + } + break + } + } + return newpb + } + + + //合成红蓝立体图片 + func joinImages_red_blue(lciImage:CIImage,rciImage:CIImage) -> CIImage { + // 创建红色和蓝色滤镜 + let redColorMatrix: [CGFloat] = [ + 0.0, 0.0, 0.0, 0.0, 0.0, // 红色通道 + 0.0, 0.0, 0.0, 0.0, 0.0, // 绿色通道 + 0.0, 0.0, 1.0, 0.0, 0.0, // 蓝色通道 + 0.0, 0.0, 0.0, 1.0, 0.0 // 透明通道 + ] + + let blueColorMatrix: [CGFloat] = [ + 1.0, 0.0, 0.0, 0.0, 0.0, // 红色通道 + 0.0, 0.0, 0.0, 0.0, 0.0, // 绿色通道 + 0.0, 0.0, 0.0, 0.0, 0.0, // 蓝色通道 + 0.0, 0.0, 0.0, 1.0, 0.0 // 透明通道 + ] + + let redFilter = CIFilter(name: "CIColorMatrix")! + redFilter.setValue(lciImage, forKey: kCIInputImageKey) + redFilter.setValue(CIVector(values: redColorMatrix, count: redColorMatrix.count), forKey: "inputRVector") + + let blueFilter = CIFilter(name: "CIColorMatrix")! + blueFilter.setValue(rciImage, forKey: kCIInputImageKey) + blueFilter.setValue(CIVector(values: blueColorMatrix, count: blueColorMatrix.count), forKey: "inputBVector") + var lastImg:CIImage? = nil + // 获取处理后的图像 + if let redOutputImage = redFilter.outputImage, + let blueOutputImage = blueFilter.outputImage { + + let compositeFilter = CIFilter(name: "CIScreenBlendMode")! + compositeFilter.setValue(redOutputImage, forKey: kCIInputImageKey) + compositeFilter.setValue(blueOutputImage, forKey: kCIInputBackgroundImageKey) + + let sharpenedFilter = CIFilter(name: "CISharpenLuminance")! + sharpenedFilter.setValue(compositeFilter.outputImage, forKey: kCIInputImageKey) + sharpenedFilter.setValue(2, forKey: kCIInputSharpnessKey) + lastImg = sharpenedFilter.outputImage! + } + return lastImg! + } + + + //将两张图片合成一张图片 SBS + func joinImages_sbs( left:UIImage, right:UIImage,imgWidth:CGFloat,imgHeight:CGFloat) -> CIImage { + let newImageSize = CGSize(width:imgWidth, height: imgHeight); + UIGraphicsBeginImageContextWithOptions(newImageSize, false, 1); + left.draw(in: CGRect(x:0, y:0, width:imgWidth/2, height:imgHeight)) + right.draw(in: CGRect(x:imgWidth/2, y:0, width:imgWidth/2, height:imgHeight)) + let image = UIGraphicsGetImageFromCurrentImageContext()! + UIGraphicsEndImageContext(); + + + let ci = CIImage(cgImage: image.cgImage!) + return ci + } + + //将两张图片合成一张图片 OU + func joinImages_ou( left:UIImage, right:UIImage,imgWidth:CGFloat,imgHeight:CGFloat) -> CIImage { + let newImageSize = CGSize(width:imgWidth, height: imgHeight); + UIGraphicsBeginImageContextWithOptions(newImageSize, false, 1); + left.draw(in: CGRect(x:0, y:0, width:imgWidth, height:imgHeight/2)) + right.draw(in: CGRect(x:0, y:imgHeight/2, width:imgWidth, height:imgHeight/2)) + let image = UIGraphicsGetImageFromCurrentImageContext()! + UIGraphicsEndImageContext(); + + let ci = CIImage(cgImage: image.cgImage!) + return ci + } + + //将两张图片合成一张图片 + func joinImages( leftImage:CIImage, rightImage:CIImage) -> CIImage { + let left = UIImage(ciImage: leftImage ) + let right = UIImage(ciImage: rightImage ) + + let imageWidth = left.size.width/2 + right.size.width/2 + let imageHeight = left.size.height/2 + + let newImageSize = CGSize(width:imageWidth, height: left.size.height); + UIGraphicsBeginImageContextWithOptions(newImageSize, false, 1); + left.draw(in: CGRect(x:0, y:0, width:imageWidth/2, height:imageHeight)) + right.draw(in: CGRect(x:imageWidth/2, y:0, width:imageWidth/2, height:imageHeight)) + let image = UIGraphicsGetImageFromCurrentImageContext()! + UIGraphicsEndImageContext(); + + let ci = CIImage(cgImage: image.cgImage!) + return ci + } +} + diff --git a/SwiftProject/SwiftProject/Project/View/CCSpatialDisplayTypeView/CCSpatialDisplayTypeView.swift b/SwiftProject/SwiftProject/Project/View/CCSpatialDisplayTypeView/CCSpatialDisplayTypeView.swift index 491aa5e..11a48f7 100644 --- a/SwiftProject/SwiftProject/Project/View/CCSpatialDisplayTypeView/CCSpatialDisplayTypeView.swift +++ b/SwiftProject/SwiftProject/Project/View/CCSpatialDisplayTypeView/CCSpatialDisplayTypeView.swift @@ -75,6 +75,10 @@ public class CCSpatialDisplayTypeView: UIView { var tableView:UITableView! = nil + var isShowing:Bool = false//是否为显示状态 + var dissMissCallback:()->Void = { + print("请初始化回调") + } lazy var showBottomView: UIView = { var view = UIView() @@ -110,9 +114,11 @@ public class CCSpatialDisplayTypeView: UIView { /// - arrow: 箭头位置是popmenu相对整个屏幕的位置 /// - datas: 数据源,icon允许传空,数据源没数据,不会显示菜单 /// - configure: 配置信息,可不传 - init(menuWidth:CGFloat,arrow:CGPoint,datas:[(icon:String,title:String,isHiden:Bool)],configures:[CCSpatialDisplayTypeConfigure] = []) { + init(menuWidth:CGFloat,arrow:CGPoint,datas:[(icon:String,title:String,isHiden:Bool)],configures:[CCSpatialDisplayTypeConfigure] = [],dissMissCallback:@escaping ()->Void) { super.init(frame: UIScreen.main.bounds) self.frame = UIScreen.main.bounds + self.dissMissCallback=dissMissCallback + //读取配置 configures.forEach { (config) in switch (config){ @@ -158,7 +164,9 @@ public class CCSpatialDisplayTypeView: UIView { //MARK: - 设置数据源 func setData(datas:[(icon:String,title:String,isHiden:Bool)]) { popData = datas - tableView.reloadData() + if(isShowing){ + tableView.reloadData() + } } //MARK: - 设置是否展示Footer @@ -282,6 +290,7 @@ extension CCSpatialDisplayTypeView{ } public func show() { + isShowing = true if popData.isEmpty{ return } @@ -290,6 +299,8 @@ extension CCSpatialDisplayTypeView{ } public func dismiss() { + isShowing = false + self.dissMissCallback() self.removeFromSuperview() } diff --git a/tdvideo/tdvideo.xcodeproj/project.pbxproj b/tdvideo/tdvideo.xcodeproj/project.pbxproj index 95e9c8d..c641e63 100644 --- a/tdvideo/tdvideo.xcodeproj/project.pbxproj +++ b/tdvideo/tdvideo.xcodeproj/project.pbxproj @@ -494,7 +494,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 2RAN5PZH5L; + DEVELOPMENT_TEAM = 8DQD6BV6H9; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = tdvideo/Info.plist; INFOPLIST_KEY_NSCameraUsageDescription = "我们需要访问您的摄像头以拍摄照片和录制视频"; @@ -534,7 +534,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 2RAN5PZH5L; + DEVELOPMENT_TEAM = 8DQD6BV6H9; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = tdvideo/Info.plist; INFOPLIST_KEY_NSCameraUsageDescription = "我们需要访问您的摄像头以拍摄照片和录制视频"; diff --git a/tdvideo/tdvideo.xcodeproj/project.xcworkspace/xcuserdata/aaa.xcuserdatad/UserInterfaceState.xcuserstate b/tdvideo/tdvideo.xcodeproj/project.xcworkspace/xcuserdata/aaa.xcuserdatad/UserInterfaceState.xcuserstate index 432bd1058aa32518cb811b22dc5599fa845080ee..113ab805881733d1526f9069ee2d96194459ec9d 100644 GIT binary patch literal 116865 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

LEQ-QwUf&1 zsbIvhr?DDK2=Wuum7rrRaEE^I&=5$)a5T4BkZ;84PcD0*RiYFHEbi>#I9x6vFq6l?DYhJ zVCqd!AA*??3Hu-=fo%jOMvN2oVNi_ON7zT{i=ZTel8tw53+x5zA0?(|*yq4N zVV@-^wUK?EptR1JDC{owWiTe#7x8w2(zVx`*jF%=k^yE)zx@mod(TH>b21ESQ+Gwn zeT#ipH%8cZw6_Tw1l9=q3e|NoI@}LPhH0=sCAj86`N*v=huMR0zZzJjJt*=c=rKie zVYX^6m@$L;ccizEf!;o4KLdLEg8h=xTMnhS(FCTCf!CHYaSQn_Io|#~j+boC0ZJcay+X#c( zYL7U#b*OL~V&hx}v5hKL|BZ?mUU$yR^#YdSe4L+);ks~LxnsC)Tz9Sq*OQ=pf=(c4 z3_)WF8b{E0f+i4DK+uTE|34VL2ia{ajeOdL0WvQ%M|rKS)xlb~6YrDh*xslT74 zI8gZ;xj_UKMOca(3@pVB;fB%|K`?A48}H!6K(ZR$7r~9>MgvW8qX?SX$iWky);XHu z#&HF@Cxx4!y++V8HTqRf4NUCCX=t>UgGsG6V=ed#pNm$;`fP=IzIeaUr4Y))oGUpg*Y?kI?2m?kj@MA?Q4U&TnO_J=}Mc ztsvhOl&#$DM_WpSu9U-~D;^nib)i953y-+Ubihit;VWJ+_-bXb`fpXnAS~X(dw{Tb zD=+g3Z{t_*U$LUm0W- zEp-e(UZ*O49Hpx34{>(~Q;jd;C-IZ{DL5NGP3LD2bQ3{9()SQp^#$Yu-|isj?sl#y zeilEwm3(d^sJR{a@MSa_JB!tSwhl0V&^o=cpuVDXK3&xiUj?%Z zFfB_rSD#3K92*MFk4S6dPZTrD_~o!hk3WMylb}rmZKj|(n?mkhs`|9dO++Wtql*{9 zv!b&W1p(O6tGh$_^I@c*0^p)89r3jiXYiNsmjb?4@>fvV_5hV_@c$MHuLlTvcz@Z( zui~$6g%`;E``g2-k;1EqU(2r}Xe&Vv611%qUMmexC*-SpIvu*0&=;Hr7a4->@L+bA z0kiD}%)&<;W(TToE7-OeV0)xk{a0!d5oizaPf~&QAis@&h~LgX%s;|E%0I?G&ObrW zV+1`;5PW!≺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'iYbU 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 W+REQiZuyme$N&BI|NjZMIqbhZ&ofs5 diff --git a/tdvideo/tdvideo/PlayContoller8.swift b/tdvideo/tdvideo/PlayContoller8.swift index c799c94..56c36ca 100644 --- a/tdvideo/tdvideo/PlayContoller8.swift +++ b/tdvideo/tdvideo/PlayContoller8.swift @@ -93,15 +93,15 @@ class PlayContoller8: UIViewController { view.layer.addSublayer(playerLayer!) player?.play() // 循环播放设置 - player!.actionAtItemEnd = .none - // 监听播放结束的通知 - NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: playerItem, queue: nil) { [self] _ in - Task { - await loadVideo() - } - player?.seek(to: .zero) - player?.play() - } +// player!.actionAtItemEnd = .none +// // 监听播放结束的通知 +// NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: playerItem, queue: nil) { [self] _ in +// Task { +// await loadVideo() +// } +// player?.seek(to: .zero) +// player?.play() +// } let segmentedControl = UISegmentedControl(items: ["空间视频", "红蓝立体"]) segmentedControl.frame = CGRect(x: 20, y: 700, width: 360, height: 45)