Prechádzať zdrojové kódy

Merge branch 'master' of https://git.yishihui.com/iOS/BFFramework

* 'master' of https://git.yishihui.com/iOS/BFFramework:
  1,修改实时拼接方法
huzhiqiang 3 rokov pred
rodič
commit
9ef6b44056

+ 38 - 16
BFFramework/Classes/Stuckpoint/ViewModel/PQPlayerViewModel.swift

@@ -581,16 +581,18 @@ extension PQPlayerViewModel {
     ///   - videoStickers: 视频素材
     ///   - originMusicDuration : 要播放的时长
     ///   - lastSecondPoint : 音频长度不够时,拼接音频文件时的结束时间,推荐卡点的倒数第二位
+    ///   - startTime: 裁剪的开始位置。
     /// - Returns:
-    public class func setupAudioMix(originAsset: AVURLAsset, bgmData: PQVoiceModel?, videoStickers: [PQEditVisionTrackMaterialsModel]?,originMusicDuration:Float = 0,clipAudioRange: CMTimeRange = CMTimeRange.zero ) -> (AVMutableAudioMix, AVMutableComposition) {
+    public class func setupAudioMix(originAsset: AVURLAsset, bgmData: PQVoiceModel?, videoStickers: [PQEditVisionTrackMaterialsModel]?,originMusicDuration:Float = 0,clipAudioRange: CMTimeRange = CMTimeRange.zero,startTime:CMTime = .zero ) -> (AVMutableAudioMix, AVMutableComposition) {
         let composition = AVMutableComposition()
         let audioMix = AVMutableAudioMix()
         var tempParameters: [AVMutableAudioMixInputParameters] = [AVMutableAudioMixInputParameters].init()
+     
         // 处理选择的主音乐
-        if(originMusicDuration > Float(CMTimeGetSeconds(originAsset.duration))){
-            BFLog(message: "要播放的时间长,比原音频要长进行拼接originMusicDuration:\(originMusicDuration)   originAsset.duration \(CMTimeGetSeconds(originAsset.duration))")
-            let originaParameters =  dealWithOriginAssetTrack(originAsset: originAsset, totalDuration: Float64(originMusicDuration), composition: composition,clipAudioRange: clipAudioRange)
-            
+        if(originMusicDuration > Float(CMTimeGetSeconds(clipAudioRange.duration))){
+            BFLog(message: "要播放的时间长,比原音频要长进行拼接originMusicDuration:\(originMusicDuration)   originAsset.duration \(CMTimeGetSeconds(clipAudioRange.duration))")
+            let originaParameters =  dealWithOriginAssetTrack(originAsset: originAsset, totalDuration: Float64(originMusicDuration), composition: composition,clipAudioRange: clipAudioRange,mStartTime: startTime)
+            BFLog(message: "originaParameters count \(originaParameters.count)")
             if originaParameters.count > 0 {
                 tempParameters = tempParameters + originaParameters
             }
@@ -638,29 +640,35 @@ extension PQPlayerViewModel {
     ///   - originAsset: 原音频文件地址
     ///   - composition:
     /// - Returns:
-    public class func dealWithOriginAssetTrack(originAsset: AVURLAsset, totalDuration: Float64, composition: AVMutableComposition,clipAudioRange: CMTimeRange = CMTimeRange.zero ) -> [AVMutableAudioMixInputParameters] {
+    public class func dealWithOriginAssetTrack(originAsset: AVURLAsset, totalDuration: Float64, composition: AVMutableComposition,clipAudioRange: CMTimeRange = CMTimeRange.zero,mStartTime:CMTime = .zero ) -> [AVMutableAudioMixInputParameters] {
         var tempParameters: [AVMutableAudioMixInputParameters] = [AVMutableAudioMixInputParameters].init()
         let volume:Float = 1.0
-        let originaDuration = CMTimeGetSeconds(originAsset.duration)
+        let originaDuration = CMTimeGetSeconds(clipAudioRange.duration)
         BFLog(message: "处理主音频 原始时长startTime = \(originaDuration) 要显示时长totalDuration = \(totalDuration)")
         //整倍数
-        var count = Int(totalDuration) / Int(originaDuration)
+        var  count = Int(totalDuration) / Int(originaDuration)
+//        count = count + 1
         //有余数多 clip 一整段
         let row = totalDuration - Double(count) * originaDuration
-        count = row > 0 ? count + 1 : count
+        //已经拼接的总时长
+        var clipTotalDuration:Float = 0.0
         if count > 0 {
-            for index in 0 ..< count {
-               
-                //第一段是0到倒数第二个卡点, 其它段都是从推荐卡点到倒数第二个卡点
+            for index in 0 ... count {
+                BFLog(message: "this is running running")
+                //第一段是用户选择的开始时间 到倒数第二个卡点, 其它段都是从推荐卡点到倒数第二个卡点
                 var startTime = CMTime.zero
-                var trackTimeRange = CMTimeRange.zero
+                var trackTimeRange = clipAudioRange
        
                 if(index == 0){
-                    startTime = CMTime.zero
-                    trackTimeRange =  CMTimeRange(start: CMTime.zero, end: CMTime(value: CMTimeValue(CMTimeGetSeconds(clipAudioRange.end) * Double(playerTimescaleInt)), timescale: playerTimescaleInt))
+                    startTime = mStartTime
+                    trackTimeRange =  CMTimeRange(start: startTime, end: CMTime(value: CMTimeValue((CMTimeGetSeconds(clipAudioRange.end) - CMTimeGetSeconds(startTime)) * Double(playerTimescaleInt)), timescale: playerTimescaleInt))
+                    clipTotalDuration = clipTotalDuration + Float(CMTimeGetSeconds(trackTimeRange.duration))
                 }else{
-                    startTime = CMTime(value: CMTimeValue((CMTimeGetSeconds( clipAudioRange.duration) * Double(index) + CMTimeGetSeconds(clipAudioRange.start)) * Float64(playerTimescaleInt)), timescale: playerTimescaleInt)
+                    // (CMTimeGetSeconds(clipAudioRange.end) - CMTimeGetSeconds(mStartTime))为用户选择的第一段时长
+                    startTime = CMTime(value: CMTimeValue((CMTimeGetSeconds( clipAudioRange.duration) * Double(index) + (CMTimeGetSeconds(clipAudioRange.end) - CMTimeGetSeconds(mStartTime))) * Float64(playerTimescaleInt)), timescale: playerTimescaleInt)
                     trackTimeRange = clipAudioRange
+                    
+                    clipTotalDuration = clipTotalDuration + Float(CMTimeGetSeconds(trackTimeRange.duration))
                 }
                 BFLog(message: "原音频时长短:count = \(count),startTime = \(startTime),trackTimeRange = \(trackTimeRange)")
                 let parameters = mixAudioTrack(audioAsset: originAsset, startTime: startTime, trackTimeRange: trackTimeRange, volume: volume, composition: composition)
@@ -671,6 +679,20 @@ extension PQPlayerViewModel {
                 }
             }
         }
+        if(row > 0){
+            
+            let startTime = CMTime(value: CMTimeValue(clipTotalDuration * Float(playerTimescaleInt)), timescale: playerTimescaleInt)
+            
+            let trackTimeRange = CMTimeRange(start: startTime, end: CMTime(value: CMTimeValue((CMTimeGetSeconds(startTime) + row) * Double(playerTimescaleInt)), timescale: playerTimescaleInt))
+            BFLog(message: "最后一小段音乐时长短:count = \(count),startTime = \(startTime),trackTimeRange = \(trackTimeRange)")
+            let parameters = mixAudioTrack(audioAsset: originAsset, startTime: startTime, trackTimeRange: trackTimeRange, volume: volume, composition: composition)
+            if parameters != nil {
+                tempParameters.append(parameters!)
+            }
+            clipTotalDuration = clipTotalDuration + Float(row)
+            
+        }
+        BFLog(message: "拼接的音频总时长: \(clipTotalDuration)")
 
         return tempParameters
     }