Swift: воспроизведение аудио с помощью AVPlayer - звук не воспроизводится, звук не слышен - PullRequest
0 голосов
/ 26 декабря 2018

Я использую AVPlayer для воспроизведения только аудиофайлов в формате mp3.Я использую URL, который я протестировал и работает нормально.Мне нужно было использовать AVPlayer, потому что мне нужно было программно настроить UISlider, а AVPlayer удобен.UISlider работает и обновляется во время воспроизведения звука.Возможно, воспроизводится звук, но я не слышу звук.Я говорю это потому, что UISlider работает.

Обновление: вы можете слышать звук при создании приложения на симуляторе.Проблема возникает при создании его на устройстве - у меня XS MAX.

Ссылка на экран записи -> Визит: https://streamable.com/nkbn8

Я пытался использовать один и тот же URL с AVAudioPlayer и аудиоиграет, и вы можете услышать это.

private func setupAudioContent() {

    let urlString = "https://s3.amazonaws.com/kargopolov/kukushka.mp3"
    if let url = NSURL(string: urlString) {
        audioPlayer = AVPlayer(url: url as URL)

        let playerLayer = AVPlayerLayer(player: audioPlayer)
        self.layer.addSublayer(playerLayer)
        playerLayer.frame = self.frame

        audioPlayer?.play()
        audioPlayer?.volume = 1.0
        audioPlayer?.addObserver(self, forKeyPath: "currentItem.loadedTimeRanges", options: .new, context: nil)

        let interval = CMTime(value: 1, timescale: 2)
        audioPlayer?.addPeriodicTimeObserver(forInterval: interval, queue: DispatchQueue.main, using: { (progressTime) in

            let currentTime = CMTimeGetSeconds(progressTime)
            let currentTimeSecondsString = String(format: "%02d", Int(currentTime.truncatingRemainder(dividingBy: 60)))
            let currentTimeMinutesString = String(format: "%02d", Int(currentTime / 60))
            self.currentTimeLabel.text = "\(currentTimeMinutesString):\(currentTimeSecondsString)"

            if let duration = self.audioPlayer?.currentItem?.duration {
                let durationsSeconds = CMTimeGetSeconds(duration)

                self.audioSlider.value = Float(currentTime / durationsSeconds)
            }
        })
    }
}


override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if keyPath == "currentItem.loadedTimeRanges" {
        isAudioPlaying = true

        if let duration = audioPlayer?.currentItem?.duration {
            let seconds = CMTimeGetSeconds(duration)
            let secondsText = Int(seconds) % 60
            let minutesText = String(format: "%02d", Int(seconds) / 60)
            audioLengthLabel.text = "\(minutesText):\(secondsText)"
        }
    }
}


@objc func handleSliderChange() {
    if let duration = audioPlayer?.currentItem?.duration {
        let totalSeconds = CMTimeGetSeconds(duration)
        let value = Float64(audioSlider.value) * totalSeconds
        let seekTime = CMTime(value: Int64(value), timescale: 1)
        audioPlayer?.seek(to: seekTime, completionHandler: { (completedSeek) in
        })
    }
}

Ожидаемый результат: прослушивание звука при прослушивании

Фактический результат: не слышно воспроизведение звука.Похоже, звук не играет, просто нет звука.

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Я пробую с самой простой версией, и она работает на симуляторе и устройстве (XS).

, как упомянул @ N.Der, проверьте режим категории.в этой ситуации в режиме без звука звук не слышен.

import AVFoundation
import UIKit

final class ViewController: UIViewController {
    private var audioPlayer: AVPlayer?

    override func viewDidLoad() {
        super.viewDidLoad()

        setupAudioContent()
    }

    private func setupAudioContent() {
        guard let url = URL(string: "https://s3.amazonaws.com/kargopolov/kukushka.mp3")
            else { return }

        audioPlayer = AVPlayer(url: url as URL)
        audioPlayer?.play()
    }
}

Чтобы легко управлять конфигурациями avplayer и всеми прерываниями, вы можете попробовать эту библиотеку: MordernAVPlayer

0 голосов
/ 26 декабря 2018

При использовании AVPlayer вы должны убедиться, что ваше устройство не находится в беззвучном режиме, так как это приведет к тому, что звук не будет выводиться, даже если ваша громкость на макс.

Если вы хотите, чтобы ваше устройство находилось в беззвучном режиме и по-прежнему воспроизводить аудио, вы можете использовать следующий код перед .play ():

do {
            try? AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [])
        }
        catch {
            // report for an error
            print(error)
        }
...