同时录制和播放audio
任何一个帮助我录制和播放audio同时在iphone中。
您可以使用Audio Unit RemoteIO或Audio Queue API在iOS设备(第一代触控除外)上同时播放和录制。 这些是较低级别的API,您必须自己处理传出和传入PCM样本的传入缓冲区。
请参阅Apple的aurioTouch示例应用程序的示例代码。
你可以从AVFoundation框架中获得使用。 它有AVAudioPlayer播放audio文件和AVAudioRecorderlogging。 您必须记住录音机将只使用麦克风录音。 因此,同时播放audio文件并录制它取决于麦克风如何感知播放的audio。
请同时检查aurioTouch苹果示例代码的audiologging和播放
您也可以在iPhone上检查录音
希望这有助于一些人…我做了一个应用程序,loggingaudio,从像潘多拉这样的应用程序,可以播放audio。 运行/播放audio应用程序,运行AudioMic,录制,closuresaudio应用程序,返回并播放AudioMic录制的audio。 好极了!
要在iOS中录制audio文件,可以使用AVFoundation框架。 使用下面的swift代码logging和播放audio。 请记住,录音机将使用麦克风录制audio,所以请在设备上testing此代码。
import UIKit import AVFoundation extension String { func stringByAppendingPathComponent(path: String) -> String { let nsSt = self as NSString return nsSt.stringByAppendingPathComponent(path) } } class ViewController: UIViewController, AVAudioPlayerDelegate, AVAudioRecorderDelegate{ var audioPlayer : AVAudioPlayer! var audioRecorder : AVAudioRecorder! @IBOutlet var recordButton : UIButton! @IBOutlet var playButton : UIButton! @IBOutlet var stopButton : UIButton! override func viewDidLoad() { super.viewDidLoad() self.recordButton.enabled = true self.playButton.enabled = false self.stopButton.enabled = false } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } //MARK: UIButton action methods @IBAction func playButtonClicked(sender : AnyObject){ let dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) dispatch_async(dispatchQueue, { if let data = NSData(contentsOfFile: self.audioFilePath()) { do{ self.audioPlayer = try AVAudioPlayer(data: data) self.audioPlayer.delegate = self self.audioPlayer.prepareToPlay() self.audioPlayer.play() } catch{ print("\(error)") } } }); } @IBAction func stopButtonClicked(sender : AnyObject){ if let player = self.audioPlayer{ player.stop() } if let record = self.audioRecorder{ record.stop() let session = AVAudioSession.sharedInstance() do{ try session.setActive(false) } catch{ print("\(error)") } } } @IBAction func recordButtonClicked(sender : AnyObject){ let session = AVAudioSession.sharedInstance() do{ try session.setCategory(AVAudioSessionCategoryPlayAndRecord) try session.setActive(true) session.requestRecordPermission({ (allowed : Bool) -> Void in if allowed { self.startRecording() } else{ print("We don't have request permission for recording.") } }) } catch{ print("\(error)") } } func startRecording(){ self.playButton.enabled = false self.recordButton.enabled = false self.stopButton.enabled = true do{ let fileURL = NSURL(string: self.audioFilePath())! self.audioRecorder = try AVAudioRecorder(URL: fileURL, settings: self.audioRecorderSettings() as! [String : AnyObject]) if let recorder = self.audioRecorder{ recorder.delegate = self if recorder.record() && recorder.prepareToRecord(){ print("Audio recording started successfully") } } } catch{ print("\(error)") } } func audioFilePath() -> String{ let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] let filePath = path.stringByAppendingPathComponent("test.caf") as String return filePath } func audioRecorderSettings() -> NSDictionary{ let settings = [AVFormatIDKey : NSNumber(int: Int32(kAudioFormatMPEG4AAC)), AVSampleRateKey : NSNumber(float: Float(16000.0)), AVNumberOfChannelsKey : NSNumber(int: 1), AVEncoderAudioQualityKey : NSNumber(int: Int32(AVAudioQuality.Medium.rawValue))] return settings } //MARK: AVAudioPlayerDelegate methods func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool) { if flag == true{ print("Player stops playing successfully") } else{ print("Player interrupted") } self.recordButton.enabled = true self.playButton.enabled = false self.stopButton.enabled = false } //MARK: AVAudioRecorderDelegate methods func audioRecorderDidFinishRecording(recorder: AVAudioRecorder, successfully flag: Bool) { if flag == true{ print("Recording stops successfully") } else{ print("Stopping recording failed") } self.playButton.enabled = true self.recordButton.enabled = false self.stopButton.enabled = false } }
我已经在xCode 7.0和iOS 9上testing了这个代码。