Swiftでオーディオプレイヤー:再生速度(rate)の変更


Swiftでオーディオプレイヤー:UISliderの設置と、曲の再生時間や再生箇所との同期」の続きです。UISliderを設置し、Sliderの動きと、再生速度(レート)を同期させます。AVAudioPlayerの.enableRateや.rateなどが勉強できると思います。

前回までのデータに数行コードを追記しますので、前回の投稿も参考ください。

できること

スクリーンショット 2014-10-22 18.24.57

ソフトのバージョン

OS: OSX Yosemite 10.10
Xcode: 6.1

つくりかた

動画でご確認ください。

課題

再生速度を変えると、音質が、、、、、。
解決策をご存知のかた、ぜひアドバイスくださいませ!

コード

太字部分が今回追記したコードです。
RateChange

import UIKit
import AVFoundation

class ViewController: UIViewController {

var audioPath = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(“test”, ofType: “mp3”)!)
var player = AVAudioPlayer()
var timer = NSTimer()

@IBOutlet weak var labelCurrentTime: UILabel!
@IBOutlet weak var labelTotalTime: UILabel!
@IBOutlet weak var labelRate: UILabel!

@IBOutlet weak var btnPlayTitle: UIButton!

@IBOutlet weak var sliderCurrentTime: UISlider!
@IBOutlet weak var sliderRate: UISlider!

@IBAction func btnPlay(sender: UIButton) {
if !player.playing {
timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector(“updatePlayingTime”), userInfo: nil, repeats: true)
player.play()
btnPlayTitle.setTitle(“Pause”, forState: UIControlState.Normal)
} else {
player.pause()
btnPlayTitle.setTitle(“Play”, forState: UIControlState.Normal)
}
}

@IBAction func sliderMove(sender: UISlider) {
player.currentTime = Double(sliderCurrentTime.value)
self.updatePlayingTime()
}

@IBAction func sliderRateMove(sender: UISlider) {
player.rate = sliderRate.value
labelRate.text = String(format: “%.1f倍速”, sliderRate.value)
}

func updatePlayingTime() {
sliderCurrentTime.value = Float(player.currentTime)
labelCurrentTime.text = formatTimeString(player.currentTime)
}

func formatTimeString(d: Double) -> String {
let s: Int = Int(d % 60)
let m: Int = Int((d – Double(s)) / 60 % 60)
let h: Int = Int((d – Double(m) – Double(s)) / 3600 % 3600)
let str = String(format: “%02d:%02d:%02d”, h, m, s)
return str
}

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
player = AVAudioPlayer(contentsOfURL: audioPath, error: nil)
player.enableRate = true
player.prepareToPlay()
labelTotalTime.text = formatTimeString(player.duration)
sliderCurrentTime.maximumValue = Float(player.duration)
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

}


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です