美文网首页
AVFundation 实现跳过音频中的静音部分功能

AVFundation 实现跳过音频中的静音部分功能

作者: weithl | 来源:发表于2017-08-11 15:11 被阅读26次
前言

比较喜欢的播客应用 pocketcast 前段时间出了一个 trim silence 功能, 就是播放音频的时候可以跳过其中静音的部分,目前除了 overcast,没有在其他同类应用中见过,这个功能对常听 podcast 的人很有用,可惜 pocketcast 不支持导入自己的音频,于是自己写了一个本地版的。

基本思路:

苹果自带录音软件在录制声音时,可以根据声音大小显示出声音图像的波动。在播放声音的时候,我们也可以根据声音的大小(分贝),来调整播放速度(采样率)。即在声音低于一定值的时候,进行快速播放,在大于该值时,使用正常速度播放。

核心代码如下:
var trimTimer: Timer?
var player: AVAudioPlayer?
let decibelMin: Float = -40
let updateTime = 0.05

func trimSilence(filePath: String) {
    
    player = try? AVAudioPlayer(contentsOf: URL.init(string: filePath)!)
    player?.isMeteringEnabled = true
    player?.enableRate = true
    player?.delegate = self
    
    player?.play()
    
    trimTimer = Timer.scheduledTimer(timeInterval: updateTime, target: self, selector: #selector(updateRate), userInfo: nil, repeats: true)
}

func updateRate() {
    guard player?.isPlaying == true else { return }
    
    player?.updateMeters()
    /// channel 1: 单声道  2: 立体声  没有什么区别
    if let averagePower = player?.averagePower(forChannel: 1),
        averagePower < decibelMin {
        /// rate 参数不要超过 8
        player?.rate = 3
    } else {
        player?.rate = 1
    }
}

相关文章

网友评论

      本文标题:AVFundation 实现跳过音频中的静音部分功能

      本文链接:https://www.haomeiwen.com/subject/wmzlrxtx.html