Bläddra i källkod

拖动音乐框时播放问题

huzhiqiang 3 år sedan
förälder
incheckning
70e0073aec

+ 17 - 11
BFFramework/Classes/PQGPUImage/akfilters/PQMovieInput.swift

@@ -21,6 +21,14 @@ public class PQMovieInput: ImageSource {
     
     var avPlayer:AVPlayer?
     var indexRage = 0
+    var orginStuckRange : CMTimeRange?{
+        didSet{
+            if orginStuckRange != nil {
+                self.musicPlayRanges = [orginStuckRange!]
+            }
+        }
+    }
+    // 应存储多个 播放片断的时间座标,目前就只需要存放音乐本身的卡点座标就可以
     var musicPlayRanges:[CMTimeRange]?
     
     public weak var delegate: PQMovieInputDelegate?
@@ -187,11 +195,12 @@ public class PQMovieInput: ImageSource {
         self.movieFramebuffer?.unlock()
         self.cancel()
 
-        PQNotification.removeObserver(avPlayer?.currentItem)
+        PQNotification.removeObserver(avPlayer?.currentItem as Any)
         avPlayer?.replaceCurrentItem(with: nil)
         self.videoInputStatusObserver?.invalidate()
         self.audioInputStatusObserver?.invalidate()
         self.avPlayerTimeObserver?.invalidate()
+        
     }
 
     // MARK: -
@@ -679,10 +688,6 @@ extension PQMovieInput {
         // 当前版本设置无限大
         let loopCount = 10000 // ranges.count
 
-        playerItem.forwardPlaybackEndTime = range?.end ?? CMTime(value: 0, timescale: 1404000)
-        playerItem.reversePlaybackEndTime = range?.start ?? CMTime(value: 2000, timescale: 100)
-        playerItem.seek(to: playerItem.reversePlaybackEndTime)
-
         PQNotification.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: avPlayer?.currentItem, queue: .main) { [weak self] notify in
             guard let strongSelf = self else {
                 return
@@ -692,13 +697,11 @@ extension PQMovieInput {
             }
             strongSelf.indexRage += 1
 
-            if strongSelf.indexRage < loopCount{
+            if strongSelf.indexRage < loopCount && strongSelf.isPlay {
                 
 //                let range = ranges[strongSelf.indexRage]
-
-                playerItem.forwardPlaybackEndTime = range!.end
-                playerItem.reversePlaybackEndTime = range!.start
-//                HHZPrint("curr: start ********************\(CMTimeGetSeconds(range!.start)) - \(playerItem.reversePlaybackEndTime) - \(playerItem.forwardPlaybackEndTime)")
+//                playerItem.forwardPlaybackEndTime = range!.end
+//                playerItem.reversePlaybackEndTime = range!.start
                 strongSelf.avPlayer!.seek(to: playerItem.reversePlaybackEndTime) { isSuccess in
                     playerItem.seek(to: playerItem.reversePlaybackEndTime) { isSuccess in
                         strongSelf.avPlayer!.play()
@@ -717,7 +720,10 @@ extension PQMovieInput {
     
     func avplayerMusic(){
         let playerItem = self.avPlayer?.currentItem
-        playerItem!.seek(to: playerItem!.reversePlaybackEndTime) { [weak self]_ in
+        let rangeee = CMTimeRangeMake(start: playeTimeRange.start, duration: self.musicPlayRanges?.first?.duration ?? CMTime(value: 1200, timescale: 40))
+        playerItem?.forwardPlaybackEndTime = rangeee.end
+        playerItem?.reversePlaybackEndTime = rangeee.start
+        playerItem?.seek(to: playerItem!.reversePlaybackEndTime) { [weak self]_ in
             self?.avPlayer?.play()
         }
     }

+ 7 - 1
BFFramework/Classes/Stuckpoint/Controller/PQStuckPointEditerController.swift

@@ -936,7 +936,7 @@ class PQStuckPointEditerController: PQBaseViewController {
         dealParameter(model: currentCreateStickersModel)
 
         // 更新裁剪时间条的的ui数据
-        stuckPointCuttingView.videoDuration = CGFloat(finallyUserAudioTime)
+        stuckPointCuttingView.videoDuration = max(CGFloat(finallyUserAudioTime), CGFloat(finallyStuckPoints.last!))
         stuckPointCuttingView.updateEndTime(startTime: CGFloat(CMTimeGetSeconds(playeTimeRange.start)), endTime: CGFloat(CMTimeGetSeconds(playeTimeRange.end)))
 
         // 2,创建滤镜
@@ -962,6 +962,12 @@ class PQStuckPointEditerController: PQBaseViewController {
                 BFLog(message: "updateAsset tiskskskskme  \(end2 - end)")
                 // 4, 设置播放器的输出画布大小
                 self.playerView.movie?.mShowVidoSize = CGSize(width: CGFloat(self.projectModel.sData?.videoMetaData?.videoWidth ?? 0), height: CGFloat(self.projectModel.sData?.videoMetaData?.videoHeight ?? 0))
+                
+                
+                // 传给movie 音频的原始卡点
+                let fir = Int64(self.stuckPointsTemp.first ?? 0)
+                let endd = Int64(self.stuckPointsTemp.last ?? 0)
+                self.playerView.movie?.orginStuckRange = CMTimeRange(start: CMTime(value: Int64(fir) * 40, timescale: 40), end: CMTime(value: Int64(endd) * 40, timescale: 40))
 
                 // 5,开始播放
                 self.playerView.isLoop = false