Как вы можете oop AVPlayer проигрывать в обратном порядке? - PullRequest
0 голосов
/ 06 мая 2020

Я использую AVPlayer для воспроизведения файла mp3. Я использую его вместо AVAudioPlayer, потому что он поддерживает воспроизведение на скоростях, выходящих за пределы диапазона 0.0 ... 2.0. Однако я хочу, чтобы звук был l oop постоянно, поэтому я использую AVQueuePlayer и AVPlayerLooper для воспроизведения файла. Это работает, когда свойство rate положительно, но когда обратное воспроизведение достигает начала файла, оно просто останавливается, вместо того, чтобы вернуться к концу файла и продолжить воспроизведение в обратном направлении. Есть ли способы, чтобы проигрыватель зацикливался? Вот что я пытаюсь:

 override func viewDidLoad() {
    super.viewDidLoad()

    //Initialize the audio file and audio player

    guard let path = Bundle.main.path(forResource: "sideAMusic.mp3", ofType: nil) else {
        Console.log("Uh oh - no path could be found for filename: \("sideAMusic")")
        return
    }
    let url = URL(fileURLWithPath: path)
    let playerItem = AVPlayerItem(url: url)
    self.sideAPlayer = AVQueuePlayer(playerItem: playerItem)
    sideALooper = AVPlayerLooper(player: sideAPlayer!, templateItem: playerItem)
    sideAPlayer?.volume = 1
    sideAPlayer?.play()
}

// Use a slider in the range of -4 ... 4 to set the playback speed
@IBAction func speedSlider(_ sender: UISlider) {
    self.sideAPlayer?.rate = sender.value
}

1 Ответ

0 голосов
/ 19 мая 2020

Вы должны добавить периодi c наблюдатель времени. Вот ссылка на документацию.

Вы также должны проверить здесь , как соблюдать время.

Также, вот пример кода.

    func addPeriodicTimeObserver() {
        // Notify every 0.05 second
        let timeScale = CMTimeScale(NSEC_PER_SEC)
        let time = CMTime(seconds: 0.05, preferredTimescale: timeScale)

        timeObserverToken = player.addPeriodicTimeObserver(forInterval: time,
                                                          queue: .main) {
            [weak self] currentTime in
              if CMTimeCompare(currentTime, CMTime.zero) == 0 {
                   //The track reached the beginning, you should seek player to the end time
                   self?.player.seek(to: self?.playerItem.duration, toleranceBefore: .zero, toleranceAfter: .zero)
                   self?.player.play()
              }
        }
    }

    func removePeriodicTimeObserver() {
        if let timeObserverToken = timeObserverToken {
            player.removeTimeObserver(timeObserverToken)
            self.timeObserverToken = nil
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...