AVAudioEngine 寻找歌曲的时间
Posted
技术标签:
【中文标题】AVAudioEngine 寻找歌曲的时间【英文标题】:AVAudioEngine seek the time of the song 【发布时间】:2015-07-09 08:34:18 【问题描述】:我正在使用AVAudioPlayerNode
播放一首歌曲,我试图使用UISlider
控制它的时间,但我不知道如何使用AVAUdioEngine
来寻找时间。
【问题讨论】:
我已经等待这个问题的答案几个月了,一直在推迟。我知道 ti 涉及获取播放器节点的 lastRenderTime 并从中减去或增加时间。不过,从那个时候开始播放它是困难的部分。 【参考方案1】:经过多次反复试验,我想我终于弄明白了。
首先,您需要计算文件的采样率。为此,请获取 AudioNode 的最后渲染时间:
var nodetime: AVAudioTime = self.playerNode.lastRenderTime
var playerTime: AVAudioTime = self.playerNode.playerTimeForNodeTime(nodetime)
var sampleRate = playerTime.sampleRate
然后,将您的采样率乘以新时间(以秒为单位)。这将为您提供要启动播放器的歌曲的确切帧:
var newsampletime = AVAudioFramePosition(sampleRate * Double(Slider.value))
接下来,您将要计算音频文件中剩余的帧数:
var length = Float(songDuration!) - Slider.value
var framestoplay = AVAudioFrameCount(Float(playerTime.sampleRate) * length)
最后,停止您的节点,安排新的音频片段,然后重新启动您的节点!
playerNode.stop()
if framestoplay > 1000
playerNode.scheduleSegment(audioFile, startingFrame: newsampletime, frameCount: framestoplay, atTime: nil,completionHandler: nil)
playerNode.play()
如果您需要进一步解释,我在这里写了一个简短的教程:http://swiftexplained.com/?p=9
【讨论】:
非常感谢您的帮助!我终于明白事情是怎么回事了! 没问题,很高兴我能帮上忙! 你从哪里提取了 songDuration? 对于未来的读者,最好从playerNode.outputFormat(forBus: 0).sampleRate
获取采样率
该链接不再有效,但您可以在这里找到它:web.archive.org/web/20150918000438/http://swiftexplained.com/… Paul 的回答中没有任何内容。【参考方案2】:
对于未来的读者,最好将采样率设为:
playerNode.outputFormat(forBus: 0).sampleRate
转换为 AVAudioFramePosition 时也要小心,因为它是一个整数,而采样率是双倍的。如果不对结果进行四舍五入,您可能会得到不希望的结果。
附:上面的答案假设你正在播放的文件与播放器的输出格式具有相同的采样率,这可能是正确的,也可能不是。
【讨论】:
我尝试了上述答案,但它对我不起作用。我在函数之前和之后打印 currentTime,它表明事情是错误的。我能得到你的帮助吗?这是我的[问题] (***.com/questions/56355698/…) 天啊!我已经把这段代码弄乱了几个小时,但无法让它工作。我放了很多打印报表,以确保数字正确并且把我的头发拉出来!我终于让它工作了,因为无论你是否有一个 playerNode 正在播放,你必须在调用playerNode.scheduleSegment()
方法之前调用 playerNode.stop()
方法然后它会播放。我省略了对playerNode.stop()
的调用,因为我想在指定时间开始音轨。哇!对我来说真是一场惨败!感谢您的代码示例!以上是关于AVAudioEngine 寻找歌曲的时间的主要内容,如果未能解决你的问题,请参考以下文章
MPMediaPickerController 和 MPMediaitemPropertyAssetUrl
如何在 Python (Windows) 中获取 Spotify 当前正在播放的歌曲?
正在播放歌曲时,如何在 AVAudioPlayer 中制作像 UIProgressView 这样的渐进式 UISlider?