0
我目前正在嘗試同時監控iPhone的每個內置麥克風的音頻輸入。Swift 4 AVFoundation - 同時錄製多個音頻源
在下述代碼,我撿了話筒,我想監視/米(底部,正面或背面麥克風)這行代碼:
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()
}
}
也許硬件不支持它。 –