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