Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift:尝试使用UISlider控制AVAudioPlayerNode中的时间_Ios_Swift_Seekbar_Avaudioengine_Avaudioplayernode - Fatal编程技术网

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

Ios Swift:尝试使用UISlider控制AVAudioPlayerNode中的时间,ios,swift,seekbar,avaudioengine,avaudioplayernode,Ios,Swift,Seekbar,Avaudioengine,Avaudioplayernode,我正在使用连接到AVAudioEngine的AVAudioPlayerNode来播放声音 要获取玩家的当前时间,我将执行以下操作: extension AVAudioPlayerNode { var currentTime: TimeInterval { get { if let nodeTime: AVAudioTime = self.lastRenderTime, let playerTime: AVAudioTime = self.playerTime(forNod

我正在使用连接到
AVAudioEngine
AVAudioPlayerNode
来播放声音

要获取玩家的当前时间,我将执行以下操作:

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

}
我有一个滑块,指示音频的当前时间。当用户更改滑块值时,在
.end
事件中,我必须将播放器的当前时间更改为滑块中指示的时间。 为此:

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)。我做错了什么?我能找到一个更简单的方法来更改播放器的当前时间吗?

我遇到了同样的问题。显然,
framestoplay
始终为0,这是因为
sampleRate
的缘故。在我的例子中,
playerTime.sampleRate
的值始终为0

所以

必须替换为

let framestoplay = AVAudioFrameCount(Float(sampleRate) * length)

我遇到了同样的问题。显然,
framestoplay
始终为0,这是因为
sampleRate
的缘故。在我的例子中,
playerTime.sampleRate
的值始终为0

所以

必须替换为

let framestoplay = AVAudioFrameCount(Float(sampleRate) * length)

您可以通过使用滑块和定义计时器以简单的方式使用它,如果您想要处理点击和拖动,请寻找更好的定义点击手势和使用滑块动作。感谢您尝试@masoud,但您没有回答我的问题。你说的已经实现了。但我想知道的是,在更改滑块值后,如何更改玩家的当前时间。有没有解决方案如何更改当前时间??@ShamDass not ye,如果你发现了什么,请回答这个问题。你可以通过使用滑块和定义计时器简单地使用它。如果你想处理点击和拖动,请寻找更好的定义点击手势和使用滑块动作。谢谢你的尝试@masoud,但你没有回答我的问题。你说的已经实现了。但我想知道的是,在更改滑块值后,如何更改玩家的当前时间。有什么解决方案可以更改当前时间吗???@ShamDass不是ye,如果你发现了什么,请回答这个问题