[Swift]AVAudioEngine, AVAudioPlayerNode, AVAudioPCMBufferを使った音源の再生


ハマりにハマって更新が滞っています。

耳コピアプリを作りたくて、音源の再生、再生位置の変更、ピッチの変更、再生速度の変更などを実装したいのですが、いろいろと困難にぶちあたり進みません。。。。

とりあえず、AVAudioEngine, AVAudioPlayerNode, AVAudioPCMBufferを使った音源の再生のメモです。これで、Bufferとして?、音源が再生できます。

曲の総時間(秒)は、総フレーム数(.length)を、サンプルレート(44100)で割って出しています。
labelTotalTime.text = String(audioFile.length/44100)のところです。

AVAudioFileを使って、曲のピッチ変更、再生速度の変更にも成功していますので、後日公開します。

いずれにしても、AVAudioEngineを使って、曲の現在再生時間の表示や取得ができず、困っています。
UISlider動かすと曲の再生箇所が変わる、みたいなこともできません。

だれか助けて!


//
// ViewController.swift
//

import UIKit
import AVFoundation

class ViewController: UIViewController {

var audioEngine: AVAudioEngine!
var audioBufferPlayer: AVAudioPlayerNode!
var audioFile: AVAudioFile!
var audioBuffer: AVAudioPCMBuffer!

@IBOutlet weak var labelTotalTime: UILabel!

@IBAction func playWithAVAudioPCMBufferPressed(sender: AnyObject) {
if !audioEngine.running {
audioEngine.startAndReturnError(nil)
}

if audioBufferPlayer.playing {
audioBufferPlayer.pause()
} else {
audioBufferPlayer.play()
timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("update"), userInfo: nil, repeats: true)
}

}

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.

audioEngine = AVAudioEngine()
audioBufferPlayer = AVAudioPlayerNode()
audioEngine.attachNode(audioBufferPlayer)

audioFile = AVAudioFile(forReading: NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("test", ofType: "mp3")!), error: nil)
audioBuffer = AVAudioPCMBuffer(PCMFormat: audioFile.processingFormat, frameCapacity: UInt32(audioFile.length))
audioFile.readIntoBuffer(audioBuffer, error: nil)

audioEngine.connect(audioBufferPlayer, to: audioEngine.mainMixerNode, format: audioBuffer.format)
audioBufferPlayer.scheduleBuffer(audioBuffer, completionHandler: nil)

labelTotalTime.text = String(audioFile.length/44100)

}

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

}


コメントを残す

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