2010-11-18 9 views
10

N'importe qui m'aide à enregistrer et jouer de l'audio simultanément dans Iphone.Enregistrer et lire de l'audio simultanément

+1

Envoyez-moi une description plus. L'enregistrement devrait être fait par micro? Quelle précision doit être la synchronisation, etc. Peut-être que vous devriez vérifier le code d'échantillon de pomme aurioTouch. – Vanya

Répondre

9

Vous pouvez utiliser le framework AVFoundation. Il a AVAudioPlayer pour lire les fichiers audio et AVAudioRecorder pour enregistrer. Vous devez garder à l'esprit que Recorder enregistrera avec l'utilisation du micro seulement. La lecture simultanée d'un fichier audio et de l'enregistrement dépend de la façon dont le micro perçoit le son lu.

15

Vous pouvez lire et enregistrer simultanément sur des appareils iOS (à l'exception du Touch de 1ère génération) à l'aide de l'AudioIO RemoteIO ou de l'API Audio Queue. Il s'agit d'API de niveau inférieur dans lesquelles vous devez gérer vous-même les buffers entrants d'échantillons PCM entrants et sortants.

Consultez l'application exemple aurioTouch d'Apple pour un exemple de code.

+0

N'importe quel objectif C ou code Swift disponible? –

0

Hope this helps certaines personnes ... J'ai fait une application qui enregistre l'audio, par exemple à partir d'un application comme Pandora et peut lire l'audio. Exécuter/lire une application audio, exécuter AudioMic, enregistrer, désactiver le son de l'application audio, revenir en arrière et lire l'audio enregistré depuis AudioMic. Yay!

https://github.com/casspangell/AudioMic

0

Pour enregistrer un lire les fichiers audio dans iOS, vous pouvez utiliser le cadre AVFoundation. Utilisez ci-dessous code Swift pour enregistrer et lire les audios. Rappelez-vous que l'enregistreur va enregistrer l'audio avec l'utilisation de micro, donc s'il vous plaît tester ce code sur l'appareil.

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 
} 
} 

J'avais testé ce code sur Xcode 7.0 & iOS 9.

Questions connexes