网上找了好久,发现都不能用,最后找了一个用 Obj-C 写的能正常录制,参考了一下,用 swift 写了一个。
在 iPhone 4 + iOS 7.1 上测试通过,主要代码:
import UIKit
import AVFoundation
class ViewController: UIViewController, AVAudioRecorderDelegate {
var recorder: AVAudioRecorder!
var player: AVAudioPlayer!
var session: AVAudioSession!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
//====== 方法1
// var fullPath = String(paths[0] as NSString) + "/sound.m4a"
//
// var settings: Dictionary = [:]
// settings["AVFormatIDKey"] = kAudioFormatMPEG4AAC
// settings["AVSampleRateKey"] = 44100
// settings["AVNumberOfChannelsKey"] = 2
//
// recorder = AVAudioRecorder(URL: NSURL(fileURLWithPath: fullPath), settings: settings, error: nil)
//====== 方法1
//====== 方法2
var fullPath = String(paths[0] as NSString) + "/sound.wav"
recorder = AVAudioRecorder(URL: NSURL(fileURLWithPath: fullPath), settings: nil, error: nil)
//====== 方法2
session = AVAudioSession.sharedInstance()
session.setCategory("AVAudioSessionCategoryPlayAndRecord", error: nil)
recorder.delegate = self
recorder.meteringEnabled = true
println("(recorder.prepareToRecord())")
}
@IBAction func startRecord(sender: AnyObject) {
var session: AVAudioSession = AVAudioSession.sharedInstance()
session.setActive(true, error: nil)
println("(recorder.record())");
}
@IBAction func stopRecord(sender: AnyObject) {
recorder.stop()
println("stop")
}
@IBAction func play(sender: AnyObject) {
player = AVAudioPlayer(contentsOfURL: recorder.url, error: nil)
player.prepareToPlay()
player.play()
println("play")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}