Как установить время воспроизведения мультимедиа для progressView с помощью AVAudioPlayer в Swift - PullRequest
0 голосов
/ 28 июня 2018

я пробовал следующий код

count + = 2

    if count > 100 {
        soundRecorder?.stop()

        if player != nil {
            if player!.isPlaying {
                player!.stop()
            }
        }

        print("Recording complete")

    }

    soundRecorder?.updateMeters()

    if !(soundRecorder?.isRecording)! {
        visualizerTimer?.invalidate()
        visualizerTimer = nil
    }
    else {
        self.progressView.setProgress(visualizerTimer, animated: true) // receiving error for "Cannot convert value of type 'Timer?' to expected argument type 'Float'"
        print("Recording")
    }

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

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Этот код должен работать для вас, если вы используете AVPlayer, я использую его в одном из моих приложений. Это требует от вас установки длительности воспроизводимого в данный момент элемента. Вы можете поиграть со свойством interval, чтобы настроить частоту выполнения этого метода (что изменит плавность изменения progressView)

let duration = playerItem.duration //set duration of currently playing item
let interval = CMTimeMake(1, 1)
player?.addPeriodicTimeObserver(forInterval: interval, queue: DispatchQueue.main, using: { [weak self] time in
                let totalDurationSeconds = CMTimeGetSeconds((self?.duration)!)

                let durationSeconds = CMTimeGetSeconds(time)
                let currentProgress = Float(durationSeconds / totalDurationSeconds)
                self?.progressView.setProgress(currentProgress, animated: true)
            })
0 голосов
/ 28 июня 2018

Попробуй реализовать этот код, это тебе поможет

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

                let seconds = Int(CMTimeGetSeconds(progressTime))

                let secondsString = String(format: "%02d", seconds % 60)
                 let minutesAString = String(format: "%02d", seconds / 60)

                // move the slider

                if let duration = self.player?.currentItem?.duration {
                    let durationSeconds = Int(CMTimeGetSeconds(duration))
                    print("value of duratioinSeconds: \(seconds))")
                    print("value of Seconds: \(durationSeconds)")

                     print(Float(seconds % durationSeconds))
                    self.Slider.setValue(Float(durationSeconds), animated: true)
                    self.Slider.minimumValue = 1
                    self.Slider.maximumValue = Float(durationSeconds)
                    self.Slider.value = Float(seconds % durationSeconds)
                }

            })
...