AVAudioMix音频闪避不起作用

时间:2017-01-22 14:57:04

标签: ios audio avfoundation avplayeritem

我正在尝试对我构建的AVMutableComposition进行音频编辑。

        var commentaryTimeRange = CMTimeRange(start: commentaryItem.startTimeInTimeline, duration: commentaryItem.timeRange.duration)
        if CMTimeCompare(CMTimeRangeGetEnd(commentaryTimeRange), composition.duration) == 1 {
            commentaryTimeRange.duration = CMTimeSubtract(composition.duration, commentaryTimeRange.start);
            commentaryItem.timeRange = commentaryTimeRange
        }
        // Add the commentary track
        let compositionCommentaryTrack = composition.addMutableTrack(withMediaType: AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid)
        let track = commentaryItem.asset.tracks(withMediaType: AVMediaTypeAudio).first!
        try! compositionCommentaryTrack.insertTimeRange(CMTimeRange(start: kCMTimeZero, duration:commentaryTimeRange.duration), of: track, at: commentaryTimeRange.start)

        let tracksToDuck = composition.tracks(withMediaType: AVMediaTypeAudio)
        var trackMixArray = [AVMutableAudioMixInputParameters]()
        let rampDuration = CMTime(seconds: 1, preferredTimescale: 2)
        for track in tracksToDuck {
            let trackMix = AVMutableAudioMixInputParameters(track: track)
            trackMix.setVolumeRamp(fromStartVolume: 1.0, toEndVolume: 0.2, timeRange: CMTimeRange(start: CMTimeSubtract(commentaryTimeRange.start, rampDuration), duration: CMTimeSubtract(commentaryTimeRange.duration, rampDuration)))
            trackMix.setVolumeRamp(fromStartVolume: 0.2, toEndVolume: 1.0, timeRange: CMTimeRange(start: CMTimeRangeGetEnd(commentaryTimeRange), duration: rampDuration))
            trackMixArray.append(trackMix)
        }
        let audioMix = AVMutableAudioMix()
        audioMix.inputParameters = trackMixArray

基本上我很想通过删除原始音量来在视频轨道上添加评论 音频在输出中正确混合,但音频指令似乎被忽略 当然audiomix被传递给AVPlayerItem,从调试我可以看到所有指令都存在并正确传递给它。

 func makePlayable() -> AVPlayerItem {
        let playerItem = AVPlayerItem(asset: composition.copy() as! AVAsset, automaticallyLoadedAssetKeys: NewsPlayerViewController.assetKeysRequiredToPlay)
        playerItem.videoComposition = videoComposition
        playerItem.audioMix = audioMix?.copy() as! AVAudioMix?
        if let overlayLayer = overlayLayer {
            let syncLayer = AVSynchronizedLayer(playerItem: playerItem)
            syncLayer.addSublayer(overlayLayer)
            playerItem.syncLayer = syncLayer
        }
        return playerItem
 }

我找到了一些答案,表明缺少曲目标识符的原因,或者有一个曲目和没有曲目的曲目之间的某种不匹配。
我的作品不使用任何曲目ID,加上Apple的AVEdit示例代码不使用它们并且它可以工作。

1 个答案:

答案 0 :(得分:0)

解决方案只是在添加评论音轨之前计算要追踪的曲目。

      let tracksToDuck = composition.tracks(withMediaType: AVMediaTypeAudio)// <- MOVE HERE, AT THE TOP

        var commentaryTimeRange = CMTimeRange(start: commentaryItem.startTimeInTimeline, duration: commentaryItem.timeRange.duration)
        if CMTimeCompare(CMTimeRangeGetEnd(commentaryTimeRange), composition.duration) == 1 {
            commentaryTimeRange.duration = CMTimeSubtract(composition.duration, commentaryTimeRange.start);
            commentaryItem.timeRange = commentaryTimeRange
        }
        // Add the commentary track
        let compositionCommentaryTrack = composition.addMutableTrack(withMediaType: AVMediaTypeAudio, preferredTrackID: kCMPersistentTrackID_Invalid)
        let track = commentaryItem.asset.tracks(withMediaType: AVMediaTypeAudio).first!
        try! compositionCommentaryTrack.insertTimeRange(CMTimeRange(start: kCMTimeZero, duration:commentaryTimeRange.duration), of: track, at: commentaryTimeRange.start)

        var trackMixArray = [AVMutableAudioMixInputParameters]()
        let rampDuration = CMTime(seconds: 1, preferredTimescale: 2)
        for track in tracksToDuck {
            let trackMix = AVMutableAudioMixInputParameters(track: track)
            trackMix.setVolumeRamp(fromStartVolume: 1.0, toEndVolume: 0.2, timeRange: CMTimeRange(start: CMTimeSubtract(commentaryTimeRange.start, rampDuration), duration: CMTimeSubtract(commentaryTimeRange.duration, rampDuration)))
            trackMix.setVolumeRamp(fromStartVolume: 0.2, toEndVolume: 1.0, timeRange: CMTimeRange(start: CMTimeRangeGetEnd(commentaryTimeRange), duration: rampDuration))
            trackMixArray.append(trackMix)
        }
        let audioMix = AVMutableAudioMix()
        audioMix.inputParameters = trackMixArray