diff --git a/SwiftProject/Pods/Pods.xcodeproj/xcuserdata/zhihaizhu.xcuserdatad/xcschemes/xcschememanagement.plist b/SwiftProject/Pods/Pods.xcodeproj/xcuserdata/zhihaizhu.xcuserdatad/xcschemes/xcschememanagement.plist index d111219..a3f6772 100644 --- a/SwiftProject/Pods/Pods.xcodeproj/xcuserdata/zhihaizhu.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/SwiftProject/Pods/Pods.xcodeproj/xcuserdata/zhihaizhu.xcuserdatad/xcschemes/xcschememanagement.plist @@ -12,102 +12,202 @@ DeviceKit.xcscheme_^#shared#^_ orderHint - 13 + 2 + + FBSDKCoreKit.xcscheme_^#shared#^_ + + orderHint + 31 + + FacebookCore.xcscheme_^#shared#^_ + + orderHint + 21 + + Firebase.xcscheme_^#shared#^_ + + orderHint + 15 + + FirebaseABTesting-FirebaseABTesting_Privacy.xcscheme_^#shared#^_ + + orderHint + 26 + + FirebaseABTesting.xcscheme_^#shared#^_ + + orderHint + 16 + + FirebaseAnalytics.xcscheme_^#shared#^_ + + orderHint + 33 + + FirebaseCore-FirebaseCore_Privacy.xcscheme_^#shared#^_ + + orderHint + 11 FirebaseCore.xcscheme_^#shared#^_ orderHint - 0 + 29 FirebaseCoreExtension.xcscheme_^#shared#^_ orderHint 12 + FirebaseCoreInternal-FirebaseCoreInternal_Privacy.xcscheme_^#shared#^_ + + orderHint + 27 + FirebaseCoreInternal.xcscheme_^#shared#^_ orderHint - 6 + 14 FirebaseCrashlytics.xcscheme_^#shared#^_ orderHint 2 + FirebaseInstallations-FirebaseInstallations_Privacy.xcscheme_^#shared#^_ + + orderHint + 12 + FirebaseInstallations.xcscheme_^#shared#^_ orderHint - 8 + 20 FirebaseMessaging.xcscheme_^#shared#^_ orderHint 19 + FirebaseRemoteConfig-FirebaseRemoteConfig_Privacy.xcscheme_^#shared#^_ + + orderHint + 6 + + FirebaseRemoteConfig.xcscheme_^#shared#^_ + + orderHint + 10 + + FirebaseRemoteConfigInterop.xcscheme_^#shared#^_ + + orderHint + 7 + FirebaseSessions.xcscheme_^#shared#^_ orderHint 15 + FirebaseSharedSwift.xcscheme_^#shared#^_ + + orderHint + 9 + + GoogleAppMeasurement.xcscheme_^#shared#^_ + + orderHint + 34 + GoogleDataTransport.xcscheme_^#shared#^_ orderHint 9 + GoogleUtilities-GoogleUtilities_Privacy.xcscheme_^#shared#^_ + + orderHint + 28 + GoogleUtilities.xcscheme_^#shared#^_ orderHint - 16 + 4 + + KeychainAccess.xcscheme_^#shared#^_ + + orderHint + 17 Kingfisher-Kingfisher.xcscheme_^#shared#^_ orderHint - 18 + 32 Kingfisher.xcscheme_^#shared#^_ orderHint - 10 + 24 LLCycleScrollView.xcscheme_^#shared#^_ orderHint - 21 + 25 Pods-SwiftProject.xcscheme_^#shared#^_ orderHint - 20 + 3 + + PromisesObjC-FBLPromises_Privacy.xcscheme_^#shared#^_ + + orderHint + 30 PromisesObjC.xcscheme_^#shared#^_ orderHint - 5 + 19 PromisesSwift.xcscheme_^#shared#^_ orderHint 17 - SVProgressHUD.xcscheme_^#shared#^_ + SDWebImage-SDWebImage.xcscheme_^#shared#^_ orderHint - 3 + 23 - SnapKit.xcscheme_^#shared#^_ + SDWebImage.xcscheme_^#shared#^_ orderHint 1 + SVProgressHUD.xcscheme_^#shared#^_ + + orderHint + 18 + + SnapKit.xcscheme_^#shared#^_ + + orderHint + 13 + TZImagePickerController.xcscheme_^#shared#^_ orderHint - 7 + 8 + + nanopb-nanopb_Privacy.xcscheme_^#shared#^_ + + orderHint + 22 nanopb.xcscheme_^#shared#^_ orderHint - 11 + 5 diff --git a/SwiftProject/SwiftProject.xcodeproj/xcuserdata/zhihaizhu.xcuserdatad/xcschemes/xcschememanagement.plist b/SwiftProject/SwiftProject.xcodeproj/xcuserdata/zhihaizhu.xcuserdatad/xcschemes/xcschememanagement.plist index 9d518a2..666ac8a 100644 --- a/SwiftProject/SwiftProject.xcodeproj/xcuserdata/zhihaizhu.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/SwiftProject/SwiftProject.xcodeproj/xcuserdata/zhihaizhu.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ SwiftProject.xcscheme_^#shared#^_ orderHint - 4 + 0 diff --git a/SwiftProject/SwiftProject.xcworkspace/xcuserdata/zhihaizhu.xcuserdatad/UserInterfaceState.xcuserstate b/SwiftProject/SwiftProject.xcworkspace/xcuserdata/zhihaizhu.xcuserdatad/UserInterfaceState.xcuserstate index 26a64f7..2b822ac 100644 Binary files a/SwiftProject/SwiftProject.xcworkspace/xcuserdata/zhihaizhu.xcuserdatad/UserInterfaceState.xcuserstate and b/SwiftProject/SwiftProject.xcworkspace/xcuserdata/zhihaizhu.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/SwiftProject/SwiftProject.xcworkspace/xcuserdata/zhihaizhu.xcuserdatad/xcschemes/xcschememanagement.plist b/SwiftProject/SwiftProject.xcworkspace/xcuserdata/zhihaizhu.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..88da8e7 --- /dev/null +++ b/SwiftProject/SwiftProject.xcworkspace/xcuserdata/zhihaizhu.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,30 @@ + + + + + SchemeUserState + + Promises (Playground) 1.xcscheme + + isShown + + orderHint + 36 + + Promises (Playground) 2.xcscheme + + isShown + + orderHint + 37 + + Promises (Playground).xcscheme + + isShown + + orderHint + 35 + + + + diff --git a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomPlayer.swift b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomPlayer.swift index e39a480..1f988ee 100644 --- a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomPlayer.swift +++ b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomPlayer.swift @@ -11,7 +11,8 @@ import AVKit //专门用于assetoutput资源释放的 线程控制 //let AssetGlobalQueue = DispatchQueue.global(qos: DispatchQoS.QoSClass.default) -let CustomPlayerShareSemaphore = DispatchSemaphore(value: 1) +//let CustomPlayerShareSemaphore = DispatchSemaphore(value: 1) +//let CustomPlayerShareRecursiveLock = NSRecursiveLock() class ZZHCustomPlayer: UIView { @@ -41,6 +42,8 @@ class ZZHCustomPlayer: UIView { } } + var playerIsSeeking:Bool = false//标记播放器是否正在拖动 + //ui var playerLayerBgView:UIView? @@ -137,12 +140,13 @@ class ZZHCustomPlayer: UIView { //通过slider进行seek播放时间点 func manualToSeekPlay(value:Float,isMoving:Bool){ + if isMoving { self.play(false) print("此处已暂停播放,那么后面希望不要出现 sta.....> 的打印信息") } - Task { +// Task { let totalSec = CMTimeGetSeconds((self.avPlayer?.currentItem?.duration)!) var atSec = Float(totalSec) * value var timeScale:CMTimeScale? = self.avPlayer?.currentItem?.duration.timescale @@ -154,24 +158,30 @@ class ZZHCustomPlayer: UIView { } let ct = CMTime(value:CMTimeValue(atSec) , timescale: timeScale!) // CustomPlayerShareSemaphore.wait() +// CustomPlayerShareRecursiveLock.lock() // self.quickLoadAReaderWhenSeek(startCT: ct) +// CustomPlayerShareRecursiveLock.unlock() // CustomPlayerShareSemaphore.signal() print("正在seek.....\(ct) ismainthread:\(Thread.isMainThread)") - DispatchQueue.main.async { +// DispatchQueue.main.async { + playerIsSeeking = true self.avPlayer?.seek(to: ct,toleranceBefore:.zero,toleranceAfter: .zero, completionHandler: { finished in if finished { if(!isMoving) {//结束拖动时,再进行播放 - CustomPlayerShareSemaphore.wait() - self.quickLoadAReaderWhenSeek(startCT: ct) - CustomPlayerShareSemaphore.signal() +// CustomPlayerShareSemaphore.wait() +// CustomPlayerShareRecursiveLock.lock() +// self.quickLoadAReaderWhenSeek(startCT: ct) +// CustomPlayerShareRecursiveLock.unlock() +// CustomPlayerShareSemaphore.signal() self.play(true) + self.playerIsSeeking = false } } }) - } +// } - } +// } diff --git a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomPlayerForVideoTask.swift b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomPlayerForVideoTask.swift index df1d948..c89a781 100644 --- a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomPlayerForVideoTask.swift +++ b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomPlayerForVideoTask.swift @@ -13,51 +13,51 @@ import VideoToolbox extension ZZHCustomPlayer { -// func getPlayerItem() -> AVPlayerItem { -// let temItem = AVPlayerItem(asset: self.videoOriginalAsset) -// AVVideoComposition.videoComposition(with: temItem.asset) { [weak self] request in -// -// print("正在请求解码图片frame....") -// guard let weakSelf = self else { -// print("self 被销毁了.....") -// return -// } -// weakSelf.convertFrame(request:request) -// -// } completionHandler: { ac, err in -// if err != nil { -// print("初始化coposition报错:\(err)") -// } -// else{ -// print("composition 生成ok....") -// temItem.videoComposition = ac -// } -// } -// return temItem -// } - func getPlayerItem() -> AVPlayerItem { let temItem = AVPlayerItem(asset: self.videoOriginalAsset) - let timeRange = CMTimeRange(start: CMTime.zero, duration: temItem.asset.duration) - let videoTracks = temItem.asset.tracks(withMediaType: AVMediaType.video) - guard let sourceVideoTrack = videoTracks.first else { - return temItem + AVVideoComposition.videoComposition(with: temItem.asset) { [weak self] request in + +// print("正在请求解码图片frame....") + guard let weakSelf = self else { + print("self 被销毁了.....") + return + } + weakSelf.convertFrame(request:request) + + } completionHandler: { ac, err in + if err != nil { + print("初始化coposition报错:\(err)") + } + else{ + print("composition 生成ok....") + temItem.videoComposition = ac + } } - - let videoComposition = AVMutableVideoComposition(propertiesOf: temItem.asset) - videoComposition.customVideoCompositorClass = ZZHCustomVideoCompositor.self - let instruction = ZZHCustomVideoCompositionInstruction(track: sourceVideoTrack, timeRange: timeRange, transform: sourceVideoTrack.preferredTransform, targetSize: sourceVideoTrack.naturalSize,sourceVideoURL: self.sourceVideoURL!) - custominstruction = instruction - videoComposition.instructions = [instruction] - temItem.videoComposition = videoComposition return temItem } +// func getPlayerItem() -> AVPlayerItem { +// let temItem = AVPlayerItem(asset: self.videoOriginalAsset) +// let timeRange = CMTimeRange(start: CMTime.zero, duration: temItem.asset.duration) +// let videoTracks = temItem.asset.tracks(withMediaType: AVMediaType.video) +// guard let sourceVideoTrack = videoTracks.first else { +// return temItem +// } +// +// let videoComposition = AVMutableVideoComposition(propertiesOf: temItem.asset) +// videoComposition.customVideoCompositorClass = ZZHCustomVideoCompositor.self +// let instruction = ZZHCustomVideoCompositionInstruction(track: sourceVideoTrack, timeRange: timeRange, transform: sourceVideoTrack.preferredTransform, targetSize: sourceVideoTrack.naturalSize,sourceVideoURL: self.sourceVideoURL!) +// custominstruction = instruction +// videoComposition.instructions = [instruction] +// temItem.videoComposition = videoComposition +// return temItem +// } + func convertFrame(request:AVAsynchronousCIImageFilteringRequest){ let compositionTime = request.compositionTime let end:CMTime = CMTimeMake(value: Int64(compositionTime.value+1), timescale: compositionTime.timescale) - let tr = CMTimeRange(start: compositionTime, end: end) +// let tr = CMTimeRange(start: compositionTime, end: end) var ciImg:CIImage? = nil switch self.selectedIndex { @@ -66,19 +66,31 @@ extension ZZHCustomPlayer { break default : - ciImg = self.otherModeImgWithMode(mode: self.selectedIndex,tr:tr,compositionTime: compositionTime) + if self.playerIsSeeking { + quickLoadAReaderWhenSeek(startCT: compositionTime) + ciImg = self.otherModeImgWithMode(mode: self.selectedIndex,compositionTime: compositionTime) + } + else { + ciImg = self.otherModeImgWithMode(mode: self.selectedIndex,compositionTime: compositionTime) + guard let ciImg else {print("未合成成功.....,此处将进行重新构建assetoutput,然后再次重拾") + quickLoadAReaderWhenSeek(startCT: compositionTime) + ciImg = self.otherModeImgWithMode(mode: self.selectedIndex,compositionTime: compositionTime) + break + } + + } break } if let ciImg { request.finish(with: ciImg, context: nil) } else { - print("未合成成功.....") + print("未合成成功.....,") request.finish(with: request.sourceImage, context: nil) } } - func otherModeImgWithMode(mode:SpatialType,tr:CMTimeRange,compositionTime:CMTime)->CIImage? { + func otherModeImgWithMode(mode:SpatialType,compositionTime:CMTime)->CIImage? { guard let ao = self.assetOutput else { print("assetOutput 应该是没有被创建成功.....") return nil @@ -168,11 +180,11 @@ extension ZZHCustomPlayer { func quickLoadAssetOutput() { if(assetOutput != nil){ - print("正在释放assetoutput----assetOutput:\(assetOutput) \n\(Date.now.timeIntervalSince1970)") +// print("正在释放assetoutput----assetOutput:\(assetOutput) \n\(Date.now.timeIntervalSince1970)") assetOutput?.markConfigurationAsFinal() - print("正在释放assetoutput....assetOutput:\(assetOutput) \n\(Date.now.timeIntervalSince1970)") +// print("正在释放assetoutput....assetOutput:\(assetOutput) \n\(Date.now.timeIntervalSince1970)") assetOutput = nil - print("释放完毕assetoutput....thread:\(Thread.current) \n\(Date.now.timeIntervalSince1970)") +// print("释放完毕assetoutput....thread:\(Thread.current) \n\(Date.now.timeIntervalSince1970)") } assetOutput = AVAssetReaderTrackOutput( diff --git a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomVideoCompositor.swift b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomVideoCompositor.swift index 5c49d3c..56397d5 100644 --- a/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomVideoCompositor.swift +++ b/SwiftProject/SwiftProject/Project/Controller/RecordingVideo/CCSpatialVideoDisplayController/ZZHCustomVideoCompositor.swift @@ -55,7 +55,7 @@ final class ZZHCustomVideoCompositor: NSObject, AVVideoCompositing { // 将请求添加到正在处理的请求列表中 self.activeRequests.append(request) - print("startRequest ....AVAsynchronousVideoCompositionRequest: \(self.cancelled) request:\(request)") +// print("startRequest ....AVAsynchronousVideoCompositionRequest: \(self.cancelled) request:\(request)") guard !self.cancelled else { print("startRequest cancell....") request.finishCancelledRequest() @@ -64,18 +64,20 @@ final class ZZHCustomVideoCompositor: NSObject, AVVideoCompositing { return } - print("startRequest queue:\(self.queue) current:\(Thread.current)") - CustomPlayerShareSemaphore.wait() +// print("startRequest queue:\(self.queue) current:\(Thread.current)") +// CustomPlayerShareSemaphore.wait() +// CustomPlayerShareRecursiveLock.lock() guard let renderedBuffer = self.renderFrame(forRequest: request) else { request.finish(with: ZZHCustomVideoCompositoringError.invalidRequest) print("报了个异常,但是应该执行不到....") return } - CustomPlayerShareSemaphore.signal() +// CustomPlayerShareSemaphore.signal() +// CustomPlayerShareRecursiveLock.unlock() request.finish(withComposedVideoFrame: renderedBuffer) // 从请求列表中移除已完成的请求 self.activeRequests.removeAll { $0 === request } - print("完成执行 finish.....") +// print("完成执行 finish.....") } } diff --git a/SwiftProject/SwiftProject/Project/Util/PlayByTransferConvertor.swift b/SwiftProject/SwiftProject/Project/Util/PlayByTransferConvertor.swift index d2fca27..20ae8a9 100644 --- a/SwiftProject/SwiftProject/Project/Util/PlayByTransferConvertor.swift +++ b/SwiftProject/SwiftProject/Project/Util/PlayByTransferConvertor.swift @@ -17,15 +17,15 @@ class PlayByTransferConvertor { func convertVideo(asset:AVAsset, assetOutput:AVAssetReaderTrackOutput,type:SpatialType,time: CMTime)->(CIImage?,CMTime?) { var newpb:CIImage? = nil var presentationTime:CMTime? = nil - print("sta.....>>>>>>>thread:\(Thread.current) assetOutput:\(assetOutput) \n\(Date.now.timeIntervalSince1970)") + print("sta.....>>>>>>>thread") while let nextSampleBuffer = assetOutput.copyNextSampleBuffer() { presentationTime = CMSampleBufferGetPresentationTimeStamp(nextSampleBuffer) print("presentationTime: \(presentationTime) \ntime: \(time)") - if presentationTime! > time {//如果当前获取的buffer的时间>time的时间,则直接返回即可 - print("如果当前获取的buffer的时间>time的时间,则直接返回即可...") - break - } +// if presentationTime! > time {//如果当前获取的buffer的时间>time的时间,则直接返回即可 +// print("如果当前获取的buffer的时间>time的时间,则直接返回即可...") +// break +// } if presentationTime == time { guard let taggedBuffers = nextSampleBuffer.taggedBuffers else { break } @@ -80,8 +80,11 @@ class PlayByTransferConvertor { CMSampleBufferInvalidate(nextSampleBuffer) break } + else{//如果当没找到,则直接可以break,等待重新校准time后,再来 + break + } } - print("PlayByTransferConvertor 测试看是否有返回....") +// print("PlayByTransferConvertor 测试看是否有返回....") return (newpb,presentationTime) }