当AVAudioPlayer达到一定的播放时间时如何调用方法?

时间:2018-03-23 16:57:49

标签: ios avfoundation avaudioplayer

我正在尝试在播放到达特定时间时执行操作。我找不到任何委托方法或如何执行此操作的示例。如何在播放到达某个点时调用方法?

2 个答案:

答案 0 :(得分:1)

那可以帮助你addBoundaryTimeObserverForTimes:queue:usingBlock:

  

在遍历指定时间时请求调用块   在正常播放期间。

目标C:

- (id)addBoundaryTimeObserverForTimes:(NSArray<NSValue *> *)times 
                                queue:(dispatch_queue_t)queue 
                           usingBlock:(void (^)(void))block;

<强>夫特:

func addBoundaryTimeObserver(forTimes times: [NSValue], 
                       queue: DispatchQueue?, 
                       using block: @escaping () -> Void) -> Any

<强>用法:

_ = self.player.addBoundaryTimeObserver(forTimes: times, queue: DispatchQueue.main, using: {
    [weak self] time in
    // Your code goes here
})

答案 1 :(得分:1)

添加更多细节。

您可以addBoundaryTimeObserver(forTimes:queue:using:)一段时间或定期使用addPeriodicTimeObserver(forInterval:queue:using:)

 // for specific time
func addTimeObserver() {
    var times = [NSValue]()

    var currentTime = kCMTimeZero // make your time here

        times.append(NSValue(time:currentTime))

    // Queue on which to invoke the callback
    let mainQueue = DispatchQueue.main

    // Add time observer
    timeObserverToken =
        player.addBoundaryTimeObserver(forTimes: times, queue: mainQueue) {
            [weak self] time in
            // Update UI
    }
}

在正常播放期间每半秒发光一次

func addPeriodicTimeObserver() {
// Invoke callback every half second
let interval = CMTime(seconds: 0.5,
                      preferredTimescale: CMTimeScale(NSEC_PER_SEC))

let mainQueue = DispatchQueue.main

timeObserverToken =
    player.addPeriodicTimeObserver(forInterval: interval, queue: mainQueue) {
        [weak self] time in
        // update UI
}}