【AVFoundation】AVAudioMix混合音频

465 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

AVFoundation 是Apple iOS和OS X系统中用于处理基于时间的媒体数据的高级框架,通过开发所需的工具提供了强大的功能集,让开发者能够基于苹果平台创建当下最先进的媒体应用程序,其针对64位处理器设计,充分利用了多核硬件优势,会自动提供硬件加速操作,确保大部分设备能以最佳性能运行,是iOS开发接触音视频开发必学的框架之一

参与掘金日新计划,持续记录AVFoundation学习,Demo学习地址,里面封装了一些工具类,可以直接使用,这篇文章讲述使用AVAudioMix调整音频音量,AVFoundation框架相关用法可查看我的其他文章。

AVAudioMix

AVAudioMix用来在组合的音频轨道中进行自定义音频的处理,其基本关系如图所示

1.png

  • AvAudioMix所具有的音频处理方法是由它的输入参数集定义的,它的参数是AVAudioMixInputParameters 类型的对象。AVAudioMixInputParameters的实例关联组合中的单独音频轨道,并在添加到音频混合时定义基于轨道的处理方法。
  • AVAudioMix和其相关联的AVAudioMixInputParameters集合都是不可变对象,它们可以为AVPlayerltem 和AVAssetExportSession 类的客户端提供相关数据。
  • 我们自定义音频混合时,使用它们的可变子类AVMutableAudioMix和AVMutableAudioMixInputParameters中的可变子类。

  • setvolume:atTime:在指定时间点立即调节音量。音量在音频轨道持续时间内会保持不变,直到有另一个音量调节出现。
  • setVolumeRampFromStartVolume:toEnd Volume:timeRange:允许在一个给定时间范围内平滑地将音量从一个值调节到另一个值。当需要在一个时间范围内调整音量时,音量会立即变为指定值的初始音量并在持续时间之内逐渐调整为指定的结束值。 音量会保持一个toEndVolume:参数所指定的常量,直到接收另一个音量调整为止,这个参数值用于表示音频轨道的持续时间。
  • 以下是一个简单的示例,将修改后的audioMix赋值给了PlayItem,如果需要导出,则赋值给AVAssetExportSession
let optionl: [String: Bool] = [AVURLAssetPreferPreciseDurationAndTimingKey: true]
        let keys: [String] = ["tracks", "duration", "commonMetadata"]
        let audioUrl: URL = Bundle.main.url(forResource: "01 Demo AAC", withExtension: "m4a")!
        let audioAsset = AVURLAsset(url: audioUrl, options: optionl)
        audioAsset.loadValuesAsynchronously(forKeys: keys)
        guard let audioTrack: AVAssetTrack = audioAsset.tracks(withMediaType: .audio).first else { return }
        
        let twoSeconds = CMTime(value: 2, timescale: 1)
        let fourSeconds = CMTime(value: 4, timescale: 1)
        let sevenSeconds = CMTime(value: 7, timescale: 1)
        // 关联音频轨道
        let parameters: AVMutableAudioMixInputParameters = AVMutableAudioMixInputParameters(track: audioTrack)
        // 0秒声音0.5
        parameters.setVolume(0.5, at: .zero)
        // 2-4秒声音0.5-0.8
        let range = CMTimeRange(start: twoSeconds, end: fourSeconds)
        parameters.setVolumeRamp(fromStartVolume: 0.5, toEndVolume: 0.8, timeRange: range)
        // 7秒时声音0.1
        parameters.setVolume(0.1, at: sevenSeconds)
        
        var audioMix: AVMutableAudioMix = AVMutableAudioMix()
        audioMix.inputParameters = [parameters]
        
        let playerItem = AVPlayerItem(asset: audioAsset)
        // 对playerItem赋值,同样有导出需求,也可以对AVAssetExportSession赋值
        playerItem.audioMix = audioMix
        player = AVPlayer(playerItem: playerItem)
        player.play()