2017-03-07 43 views
3

私は単純な音楽アプリケーションを作成していますが、UiSliderを使ってオーディオファイルの進捗状況をどのように追跡できるのでしょうか。ここに私のプロジェクトは、これまでのところです:UISliderにオーディオの進行状況を一致させる方法

Storyboard

コード:

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 
    } 

} 

私はそれがオーディオファイルの進行状況を次のアップルの音楽アプリに似たuisliderを作成したいことだし、いつでもユーザースライドボールのもの(笑)それは曲のその時に行く。あなたが私にこれを完成させるためのいくつかのコードを与えることができれば、それは素晴らしいでしょう!

私はかなり新しくコーディングしていますが、まだ迅速に学習していますので、簡単にしてください:-)もう一度おねがいします!

答えて

1

AVPlayerに切り替えると、AVPlayerperiodicTimeObserverを追加できます。例では、... 1/30秒毎あなたは上記のコードに置き換え、あなたのコードでaudioPlayerを作成

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 
} 

をコールバックを得ることができます下に。

+0

上記のコードを参考にして、コードを100%完成させてもらえますか?スライダーにIBのアウトレットを置く必要がある場合は、それもそれに入れます。それは大丈夫ですか?どうもありがとう!! – iFunnyVlogger

+1

あなたはそれを自分で試みることができると思いますが、まだ問題がある場合は質問を更新してください。 –

+0

私のコードをどこであなたのコードに置き換えるべきですか? – iFunnyVlogger

1

AVAudioPlayerを使用すると、1秒に数回(1秒に60回まで - それ以上は無駄になる)定期的なタイマーを作成し、オーディオプレーヤーのcurrentTimeプロパティに基づいてスライダーを更新できます。アップデートを画面の更新と同期するには、CADisplayLinkタイマーを使用できます。

AVAudioPlayercurrentTimeプロパティにキー値オブザーバを設定して、値が変わるたびにオブザーバが起動するようにすることもできます。 (私はこれを試したことはありませんが、となります)

関連する問題