In Swift lassen sich Audioaufnahmen sehr komfortabel und einfach über die Klasse AVAudioRecorder realisieren. Beim Initialisieren der Klasse lassen sich bereits Codec, Samplerate, Anzahl der Kanäle und einige andere wichtige Einstellungen festlegen. Hier ein einfaches Code-Beispiel:
class AudioViewController : UIViewController, AVAudioRecorderDelegate
{
// [...]
var audioRecorder: AVAudioRecorder!
func initAudioRecorder()
{
let settings: [String : Any] = [
AVSampleRateKey: 16000.0,
AVFormatIDKey: kAudioFormatMPEG4AAC,
AVNumberOfChannelsKey: 1,
AVEncoderAudioQualityKey: AVAudioQuality.low.rawValue
]
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(AVAudioSessionCategoryRecord)
try audioRecorder = AVAudioRecorder(url: getFileurl()!, settings: settings)
try audioSession.setActive(true)
}
catch let error as NSError {
print("AVAudioRecorder error: \(error.localizedDescription)")
}
audioRecorder.delegate = self
audioRecorder.isMeteringEnabled = true
audioRecorder.prepareToRecord()
let displayLink:CADisplayLink = CADisplayLink(target: self, selector: #selector(updateMeters))
displayLink.add(to: RunLoop.current, forMode: RunLoopMode.commonModes)
}
func updateMeters()
{
audioRecorder.updateMeters()
if audioRecorder.isRecording
{
let time = NSInteger(audioRecorder.currentTime)
// ...
}
// TOOD: do any updates e.g. for the UI (update displayed record time, ...)
}
@IBAction func startRecord(_ sender: AnyObject)
{
audioRecorder.record()
}
@IBAction func stopRecord(_ sender: AnyObject)
{
audioRecorder.stop()
}
func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool)
{
// Add audio to attachments
let audioData = try? Data(contentsOf: getFileurl()!)
if audioData != nil
{
// TOOD: handle audio data
}
}
func getFileurl() -> URL?
{
let fileManager = FileManager.default
let urls = fileManager.urls(for: .documentDirectory, in: .userDomainMask)
let documentDirectory = urls[0] as URL
let audioURL = documentDirectory.appendingPathComponent("audio.m4a")
return audioURL
}
}
Leave a Reply