首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift:尝试使用UISlider控制AVAudioPlayerNode中的时间

Swift:尝试使用UISlider控制AVAudioPlayerNode中的时间
EN

Stack Overflow用户
提问于 2019-05-29 15:59:55
回答 1查看 832关注 0票数 1

我正在使用连接到AVAudioEngineAVAudioPlayerNode来播放声音。

为了获得玩家的当前时间,我这样做:

代码语言:javascript
复制
extension AVAudioPlayerNode {
var currentTime: TimeInterval {
    get {
        if let nodeTime: AVAudioTime = self.lastRenderTime, let playerTime: AVAudioTime = self.playerTime(forNodeTime: nodeTime) {
            return Double(playerTime.sampleTime) / playerTime.sampleRate
        }
        return 0
    }
 }

}

我有一个滑块来指示音频的当前时间。当用户更改滑块值时,在.ended事件中,我必须将播放器的当前时间更改为滑块中指示的时间。为此,请执行以下操作:

代码语言:javascript
复制
extension AVAudioPlayerNode {

func seekTo(value: Float, audioFile: AVAudioFile, duration: Float) {
    if let nodetime = self.lastRenderTime{
        let playerTime: AVAudioTime = self.playerTime(forNodeTime: nodetime)!
        let sampleRate = self.outputFormat(forBus: 0).sampleRate
        let newsampletime = AVAudioFramePosition(Int(sampleRate * Double(value)))
        let length = duration - value
        let framestoplay = AVAudioFrameCount(Float(playerTime.sampleRate) * length)
        self.stop()

        if framestoplay > 1000 {
            self.scheduleSegment(audioFile, startingFrame: newsampletime, frameCount: framestoplay, at: nil,completionHandler: nil)
        }
    }
    self.play()
}

然而,我的函数seekTo不能正常工作(我在函数前后输出currentTime,它总是显示一个负值~= -0.02)。我做错了什么?我能找到一种更简单的方法来改变播放器的currentTime吗?

EN

回答 1

Stack Overflow用户

发布于 2020-01-02 18:47:53

我遇到了同样的问题。显然,由于sampleRateframestoplay始终为0。在我的例子中,playerTime.sampleRate的值始终为0。

所以,

代码语言:javascript
复制
let framestoplay = AVAudioFrameCount(Float(playerTime.sampleRate) * length)

必须替换为

代码语言:javascript
复制
let framestoplay = AVAudioFrameCount(Float(sampleRate) * length)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56355698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档