Browse Source

1.merge dev

wenweiwei 3 years ago
parent
commit
273c197a73

+ 2 - 2
BFRecordScreenKit/Classes/BFRSComm.swift

@@ -27,9 +27,9 @@ public var ThemeStyleColor = UIColor.hexColor(hexadecimal: "#389AFF")
 
 
 // 获取视频资源的旋转方向
-public func degressFromVideoFile(url:URL) -> UInt {
+public func degressFromVideoFile(asset: AVAsset) -> UInt {
     var degress :UInt = 0
-    let tracks = AVAsset(url: url).tracks(withMediaType: .video)
+    let tracks = asset.tracks(withMediaType: .video)
     if let track = tracks.first {
         let t = track.preferredTransform
         

+ 17 - 13
BFRecordScreenKit/Classes/BFRecordItemModel.swift

@@ -20,9 +20,9 @@ public class BFRecordItemModel: NSObject {
 //    var baseMaterial : AVURLAsset?
     var localPath: String?
     var materialDuraion: Double = 0.0
-    var fetchCoverImg: ((UIImage) -> Void)?
-    var fetchAVUrlAsset: ((AVURLAsset) -> Void)?
-    var fetchPlayItem: ((AVPlayerItem) -> Void)?
+    var fetchCoverImgCallBack: ((UIImage) -> Void)?
+    var fetchAVUrlAssetCallBack: ((AVURLAsset) -> Void)?
+    var fetchPlayItemCallBack: ((BFRecordItemModel?) -> Void)?
     var dealedDurationRanges = [SplitRecordRange]() // 录音切割的时间区间,合成导出时计算
     public var voiceStickers = [PQVoiceModel]() //
     public var videoStickers = [PQEditVisionTrackMaterialsModel]() // 合成导出时计算
@@ -45,17 +45,18 @@ public class BFRecordItemModel: NSObject {
     func initOriginData(phasset: PHAsset) {
         width = phasset.pixelWidth
         height = phasset.pixelHeight
+        
+        fetchCoverImage(phasset)
+        fetchAVUrlAsset(phasset)
+        
         if phasset.mediaType == .image {
             mediaType = .IMAGE
             localPath = "image"
         } else if phasset.mediaType == .video {
             mediaType = .VIDEO
             fetchPlayItem(phasset)
-
         }
 
-        fetchCoverImage(phasset)
-        fetchAVUrlAsset(phasset)
     }
 
     func fetchCoverImage(_ phasset: PHAsset) {
@@ -70,7 +71,7 @@ public class BFRecordItemModel: NSObject {
             // 设置首帧/封面
             if image != nil {
                 self?.coverImg = image
-                self?.fetchCoverImg?(image!)
+                self?.fetchCoverImgCallBack?(image!)
             }
         }
     }
@@ -87,7 +88,7 @@ public class BFRecordItemModel: NSObject {
                 return
             }
             self?.playItem = item
-            self?.fetchPlayItem?(item)
+            self?.fetchPlayItemCallBack?(self)
         })
     }
 
@@ -97,11 +98,14 @@ public class BFRecordItemModel: NSObject {
         options.deliveryMode = .automatic
 
         PHCachingImageManager().requestAVAsset(forVideo: phasset, options: options, resultHandler: { [weak self] (asset: AVAsset?, _: AVAudioMix?, _) in
-            if let videoAsset = asset as? AVURLAsset {
-                self?.materialDuraion = videoAsset.duration.seconds
-                self?.localPath = (videoAsset.url.absoluteString.removingPercentEncoding)?.replacingOccurrences(of: "file://", with: "")
-                self?.videoAsset = videoAsset
-                self?.fetchAVUrlAsset?(videoAsset)
+            guard let sself = self else {
+                return
+            }
+            if let videoAsset = (asset as? AVURLAsset) {
+                sself.materialDuraion = videoAsset.duration.seconds
+                sself.localPath = (videoAsset.url.absoluteString.removingPercentEncoding)?.replacingOccurrences(of: "file://", with: "")
+                sself.videoAsset = videoAsset
+                sself.fetchAVUrlAssetCallBack?(videoAsset)
             }
         })
     }

+ 30 - 23
BFRecordScreenKit/Classes/RecordScreen/Controller/BFRecordScreenController.swift

@@ -49,7 +49,7 @@ public class BFRecordScreenController: BFBaseViewController {
             subtitleBtn.isHidden = isRecording
             soundSettingBtn.isHidden = isRecording
             
-            recordBtn.setTitle(isRecording ? "松手 暂停" : "按住 说话", for: .normal)
+            recordBtn.setTitle(isRecording ? "松手 暂停" : "按住 录音", for: .normal)
             recordBtn.backgroundColor = UIColor.hexColor(hexadecimal: "#389AFF", alpha: isRecording ? 0.6 : 1)
             playBtn.isSelected = isRecording
 //            if !isRecording {
@@ -155,7 +155,7 @@ public class BFRecordScreenController: BFBaseViewController {
     lazy var recordBtn: UIButton = {
         let btn = UIButton(type: .custom)
         btn.backgroundColor = ThemeStyleColor
-        btn.setTitle("按住 说话", for: .normal)
+        btn.setTitle("按住 录音", for: .normal)
         btn.addCorner(corner: 6)
         btn.adjustsImageWhenHighlighted = false
         btn.addTarget(self, action: #selector(startRecord), for: .touchDown)
@@ -1306,9 +1306,9 @@ public class BFRecordScreenController: BFBaseViewController {
                 itemModels.append(itemModel)
                 if index == 0 {
                     if asset.mediaType == .video {
-                        itemModel.fetchAVUrlAsset = { [weak self, weak itemModel] _ in
+                        itemModel.fetchAVUrlAssetCallBack = { [weak self, weak itemModel] _ in
                             //                            self?.export(avsss:uralss)
-                            DispatchQueue.main.async { [weak self] in
+                            DispatchQueue.main.async { [weak self, weak itemModel] in
                                 self?.progressThumV.recordItem = itemModel
                                 self?.progressThumV.isHidden = false
                             }
@@ -1491,13 +1491,15 @@ public class BFRecordScreenController: BFBaseViewController {
     }
     
     // 修正视频旋转方向,因为自己录制的竖屏视频会预览为横屏
-    func reloadMaterial(recordItem: BFRecordItemModel) {
-        if let path = recordItem.localPath, let cell: BFImageCoverViewCell = collectionView.cellForItem(at: IndexPath(item: currItemModelIndex, section: 0)) as? BFImageCoverViewCell {
+    func reloadMaterial() {
+        let recordItem = itemModels[currItemModelIndex]
+        if  let vasset = recordItem.videoAsset, let cell: BFImageCoverViewCell = collectionView.cellForItem(at: IndexPath(item: currItemModelIndex, section: 0)) as? BFImageCoverViewCell {
             setVideoPlay(item: recordItem.playItem, imageView: cell.playView)
             setAudioPlay(item: recordItem.playItem)
             playBtn = cell.playBtn
+//            recordItem.videoAsset
             
-            let degress = degressFromVideoFile(url: URL(fileURLWithPath: path))
+            let degress = degressFromVideoFile(asset: vasset)
             switch degress {
             case 90:
                 cell.playView.setInputRotation(GPUImageRotationMode(rawValue: 2), at: 0)
@@ -1547,19 +1549,22 @@ extension BFRecordScreenController: UICollectionViewDelegate, UICollectionViewDa
         } else {
             cell = BFImageCoverViewCell.gpuImageViewCell(collectionView: collectionView, indexPath: indexPath)
         }
-        recordItem.fetchCoverImg = { [weak self, weak cell] _ in
+        recordItem.fetchCoverImgCallBack = { [weak self, weak cell, weak recordItem] _ in
+            guard let sself = self, let item = recordItem else {
+                return
+            }
             cell?.addData()
-            if recordItem.mediaType == .IMAGE {
-                self?.progressThumV.recordItem = recordItem
-                self?.progressThumV.isHidden = false
+            if item.mediaType == .IMAGE {
+                sself.progressThumV.recordItem = item
+                sself.progressThumV.isHidden = false
             }
         }
-        recordItem.fetchPlayItem = { [weak self, weak recordItem] _ in
-            guard let item = recordItem else {
+        recordItem.fetchPlayItemCallBack = { [weak self] item in
+            guard let sself = self else {
                 return
             }
-            if indexPath.item == self?.currItemModelIndex {
-                self?.reloadMaterial(recordItem: item)
+            if indexPath.item == sself.currItemModelIndex {
+                sself.reloadMaterial()
             }
         }
         cell.btnClickHandle = { [weak self] sender, _ in
@@ -1576,7 +1581,14 @@ extension BFRecordScreenController: UICollectionViewDelegate, UICollectionViewDa
         if page != currItemModelIndex {
             // 暂停
             pause()
-            let recordItem = itemModels[page]
+            events.append(WithDrawModel(type: 0, timestamp: currentAssetProgress.seconds))
+            // 重设撤销栈
+            itemModels[currItemModelIndex].events = events
+            currItemModelIndex = page
+            
+            events = itemModels[currItemModelIndex].events
+            
+            let recordItem = itemModels[currItemModelIndex]
             // 重绘录音区域
             progressThumV.recordItem = recordItem
             DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {[weak self] in
@@ -1585,23 +1597,18 @@ extension BFRecordScreenController: UICollectionViewDelegate, UICollectionViewDa
             // 更新缩略图
             progressThumV.isHidden = false
             progreddL.text = "00:00"
-            events.append(WithDrawModel(type: 0, timestamp: currentAssetProgress.seconds))
             // 重置指针
             currentAssetProgress = CMTime(seconds: 0, preferredTimescale: 1000)
             searchStopAtRecordRange()
             // 重置播放器
             assetPlayer?.seek(to: CMTime.zero)
             recordPlayer?.seek(to: CMTime.zero)
-            // 重设撤销栈
-            itemModels[currItemModelIndex].events = events
-            events = itemModels[page].events
-            currItemModelIndex = page
+            
             searchStopAtRecordRange()
             changeWithDrawBtnLayout(false)
-            // 更新当前page
             pauseTime = 0
             if recordItem.mediaType == .VIDEO {
-                reloadMaterial(recordItem: recordItem)
+                reloadMaterial()
                 assetPlayer?.seek(to: .zero, toleranceBefore: CMTime(value: 1, timescale: 1_000_000), toleranceAfter: CMTime(value: 1, timescale: 1_000_000))
             }
             if changeItemHandle != nil {

+ 10 - 0
BFRecordScreenKit/Classes/RecordScreen/View/BFImageCoverViewCell.swift

@@ -92,4 +92,14 @@ open class BFImageCoverViewCell: UICollectionViewCell {
             btnClickHandle!(sender, recordItem)
         }
     }
+    
+    func clearImageFilter() {
+        filter.removeTarget(playView)
+        picture.removeTarget(filter)
+        GPUImageContext.sharedFramebufferCache().purgeAllUnassignedFramebuffers()
+    }
+    
+    deinit {
+        clearImageFilter()
+    }
 }