【发布时间】:2017-10-15 16:14:15
【问题描述】:
我目前正在尝试同时监控 iPhone 的每个内置麦克风的音频输入。
在下面提到的代码中,我选择了我想用这行代码监控/测量的麦克风(底部、前置或后置麦克风):
try recordingSession.setInputDataSource(recordingSession.inputDataSources?[2])
不幸的是,我似乎只能为我的音频会话设置一个输入数据源。
也许有办法为每个记录通道设置一个输入数据源?
我也曾尝试探索其他解决方案,例如 AVAudioEngine,但由于有关此主题的 Swift 资源并不多,因此我很难分析走哪条路。
import UIKit
import AVFoundation
class ViewController: UIViewController, AVAudioRecorderDelegate, AVAudioPlayerDelegate {
@IBOutlet var recordButton: UIButton!
var recordingSession: AVAudioSession!
var audioPlayer: AVAudioPlayer!
var audioRecorder: AVAudioRecorder!
var timer: Timer!
override func viewDidLoad() {
recordingSession = AVAudioSession.sharedInstance()
do {
try recordingSession.setCategory(AVAudioSessionCategoryMultiRoute)
//try recordingSession.setMode(AVAudioSessionModeMeasurement)
try recordingSession.setActive(true)
try recordingSession.setInputDataSource(recordingSession.inputDataSources?[2])
try recordingSession.overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)
recordingSession.requestRecordPermission() { [unowned self] allowed in
DispatchQueue.main.async {
if allowed {
} else {
// failed to record!
}
}
}
} catch {
print("NOT ALLOWED")
// failed to record!
}
}
@objc func updateMeters(){
audioRecorder.updateMeters()
print("CHANNEL 0 PEAK : \(audioRecorder.peakPower(forChannel: 0))")
print("CHANNEL 1 PEAK : \(audioRecorder.peakPower(forChannel: 1))")
print(audioRecorder.averagePower(forChannel: 0))
print(audioRecorder.currentTime)
}
func startRecording() {
let audioFilename = getDocumentsDirectory().appendingPathComponent("recording.m4a")
let settings = [
AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
AVSampleRateKey: 12000,
AVNumberOfChannelsKey: 2,
AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
]
do {
audioRecorder = try AVAudioRecorder(url: audioFilename, settings: settings)
audioRecorder.delegate = self
audioRecorder.isMeteringEnabled = true
audioRecorder.record()
recordButton.setTitle("Tap to Stop", for: .normal)
timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateMeters), userInfo: nil, repeats: true)
} catch {
finishRecording(success: false)
}
}
func getDocumentsDirectory() -> URL {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let documentsDirectory = paths[0]
return documentsDirectory
}
func finishRecording(success: Bool) {
timer.invalidate()
audioRecorder.stop()
audioRecorder = nil
if success {
recordButton.setTitle("Tap to Re-record", for: .normal)
} else {
recordButton.setTitle("Tap to Record", for: .normal)
// recording failed :(
}
}
@IBAction func recordTapped() {
if audioRecorder == nil {
startRecording()
} else {
finishRecording(success: true)
}
}
func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
if !flag {
finishRecording(success: false)
}
}
@IBAction func play(_ sender: UIButton) {
let fileURL = getDocumentsDirectory().appendingPathComponent("recording.m4a")
self.audioPlayer = try! AVAudioPlayer(contentsOf: fileURL)
self.audioPlayer.prepareToPlay()
self.audioPlayer.delegate = self
self.audioPlayer.play()
}
}
【问题讨论】:
标签: ios swift audio avfoundation audio-recording