2017-03-07 2 views
3

Ich erstelle eine einfache Musik-App, und ich frage mich, wie ich einen UiSlider erstellen kann, um den Fortschritt einer Audiodatei zu verfolgen. Hier ist mein Projekt so weit:Wie man UISlider zusammenbringt Audio Fortschritt

Storyboard

Code:

import UIKit 
import AVFoundation 

class SongDetailViewController: UITableViewController { 

    var audioPlayer = AVAudioPlayer() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     do { 
      audioPlayer = try AVAudioPlayer(contentsOf: URL.init(fileURLWithPath: Bundle.main.path(forResource: "Song Name", ofType: "mp3")!)) 
      audioPlayer.prepareToPlay() 

      var audioSession = AVAudioSession.sharedInstance() 

      do { 
       try audioSession.setCategory(AVAudioSessionCategoryPlayback) 
      } 
     } 

     catch { 
      print(error) 
     } 
    } 
// Buttons 

// Dismiss 
    @IBAction func dismiss(_ sender: Any) { 
     dismiss(animated: true, completion: nil) 
    } 

// Play 
    @IBAction func play(_ sender: Any) { 
     audioPlayer.stop() 
     audioPlayer.play() 
    } 

// Pause 
    @IBAction func pause(_ sender: Any) { 
     audioPlayer.pause() 
    } 

// Restart 
    @IBAction func restart(_ sender: Any) { 
     audioPlayer.currentTime = 0 
    } 

} 

Ich will die UISlider ähnlich den Apple Music App erstellen, in dem es um die Audiodatei Fortschritt folgt und wenn der Benutzer Dia das Ballding (lol) es geht um diese Zeit des Liedes. Wenn du mir Code geben könntest, wäre das großartig!

Bitte denken Sie daran, dass ich ziemlich neu in der Codierung bin und immer noch schnell lernen, also halte es einfach :-) Danke nochmal!

Antwort

1

Wenn Sie zur Verwendung eines wechseln, können Sie periodicTimeObserver zu Ihrem hinzufügen. Im Beispiel unten werden Sie einen Rückruf alle 1/30 Sekunden bekommen ...

let player = AVPlayer(url: Bundle.main.url(forResource: "Song Name", withExtension: "mp3")!) 

player.addPeriodicTimeObserver(forInterval: CMTimeMake(1, 30), queue: .main) { time in 

    let fraction = CMTimeGetSeconds(time)/CMTimeGetSeconds(player.currentItem!.duration) 

    self.slider.value = fraction 
} 

Wo Sie ein audioPlayer in Ihrem Code erstellen, ersetzen Sie mit dem Code oben.

+0

Ok, also, können Sie meinen Code oben und setzen Sie Ihren Code hinein, wo es 100% abgeschlossen ist? Wenn Sie eine IB Steckdose für den Slider benötigen, legen Sie diese auch hinein. Ist das in Ordnung? Danke vielmals!! – iFunnyVlogger

+1

Denkst du, du könntest es selbst versuchen und deine Frage aktualisieren, wenn du immer noch Probleme hast? –

+0

Wo sollte ich meinen Code durch Ihren Code ersetzen? – iFunnyVlogger

1

AVAudioPlayer Verwenden Sie könnten einen periodischen Timer erstellen, die mehrmals pro Sekunde feuert (bis zu 60 mal/Sekunde - mehr wäre eine Verschwendung) und aktualisiert den Schieber auf der Grundlage Ihrer currentTime Eigenschaft des Audio-Player. Um das Update mit der Bildschirmaktualisierung zu synchronisieren, könnten Sie einen CADisplayLink Timer verwenden.

Es sollte auch möglich sein, einen Key Value Observer auf Ihrer AVAudioPlayer s currentTime-Eigenschaft einzurichten, so dass jedes Mal, wenn der Wert Ihren Beobachter ändert, ausgelöst wird. (Ich habe das nicht versucht, aber es sollte funktionieren.)

Verwandte Themen