| 
					
				 | 
			
			
				@@ -579,16 +579,30 @@ extension PQPlayerViewModel { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ///   - originAsset: 空音乐文件素材 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ///   - bgmData: 背景音乐 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ///   - videoStickers: 视频素材 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    /// - Returns: <#description#> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public class func setupAudioMix(originAsset: AVURLAsset, bgmData: PQVoiceModel?, videoStickers: [PQEditVisionTrackMaterialsModel]?) -> (AVMutableAudioMix, AVMutableComposition) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ///   - originMusicDuration : 要播放的时长 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ///   - lastSecondPoint : 音频长度不够时,拼接音频文件时的结束时间,推荐卡点的倒数第二位 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /// - Returns: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public class func setupAudioMix(originAsset: AVURLAsset, bgmData: PQVoiceModel?, videoStickers: [PQEditVisionTrackMaterialsModel]?,originMusicDuration:Float = 0,clipAudioRange: CMTimeRange = CMTimeRange.zero ) -> (AVMutableAudioMix, AVMutableComposition) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let composition = AVMutableComposition() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         let audioMix = AVMutableAudioMix() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         var tempParameters: [AVMutableAudioMixInputParameters] = [AVMutableAudioMixInputParameters].init() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // 处理空素材 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let parameters = mixAudioTrack(audioAsset: originAsset, trackTimeRange: CMTimeRange(start: .zero, end: originAsset.duration), composition: composition) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if parameters != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            tempParameters.append(parameters!) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 处理选择的主音乐 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        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 originaParameters.count > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                tempParameters = tempParameters + originaParameters 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            let parameters = mixAudioTrack(audioAsset: originAsset, trackTimeRange: CMTimeRange(start: .zero, end: originAsset.duration), composition: composition) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if parameters != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                tempParameters.append(parameters!) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // 处理背景音乐 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if bgmData != nil, bgmData?.localPath != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             let bgmParameters = dealWithBGMTrack(bgmData: bgmData!, totalDuration: originAsset.duration.seconds, composition: composition) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -615,6 +629,46 @@ extension PQPlayerViewModel { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // exportAudio(comosition: composition) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return (audioMix, composition) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /// 处理原主音乐音轨  e.g. 原音频时长只有30s  要播放 250s 的音频 拼接原音频音轨 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /// - Parameters: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ///   - originAsset: 原音频文件地址 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ///   - composition: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /// - Returns: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public class func dealWithOriginAssetTrack(originAsset: AVURLAsset, totalDuration: Float64, composition: AVMutableComposition,clipAudioRange: CMTimeRange = CMTimeRange.zero ) -> [AVMutableAudioMixInputParameters] { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var tempParameters: [AVMutableAudioMixInputParameters] = [AVMutableAudioMixInputParameters].init() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let volume:Float = 1.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let originaDuration = CMTimeGetSeconds(originAsset.duration) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        BFLog(message: "处理主音频 原始时长startTime = \(originaDuration) 要显示时长totalDuration = \(totalDuration)") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //整倍数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var count = Int(totalDuration) / Int(originaDuration) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //有余数多 clip 一整段 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let row = totalDuration - Double(count) * originaDuration 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        count = row > 0 ? count + 1 : count 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if count > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for index in 0 ..< count { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //第一段是0到倒数第二个卡点, 其它段都是从推荐卡点到倒数第二个卡点 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var startTime = CMTime.zero 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var trackTimeRange = CMTimeRange.zero 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if(index == 0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    startTime = CMTime.zero 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    trackTimeRange =  CMTimeRange(start: CMTime.zero, end: CMTime(value: CMTimeValue(CMTimeGetSeconds(clipAudioRange.end) * Double(playerTimescaleInt)), timescale: playerTimescaleInt)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    startTime = CMTime(value: CMTimeValue((CMTimeGetSeconds( clipAudioRange.duration) * Double(index) + CMTimeGetSeconds(clipAudioRange.start)) * Float64(playerTimescaleInt)), timescale: playerTimescaleInt) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    trackTimeRange = clipAudioRange 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                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!) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return tempParameters 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /// 处理背景音乐音轨 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /// - Parameters: 
			 |