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)
}