12
votes

Enregistrer et jouer audio simultanément

Quelqu'un aidez-moi à inscrire et à jouer audio simultanément sur iPhone.


2 commentaires

Envoyez-moi plus de description. L'enregistrement doit être fait par micro? La synchronisation est-elle précise, etc. Peut-être que vous devriez peut-être consulter le code d'exemple Apple AurioTouch.


Vous pouvez jouer et enregistrer simultanément sur des périphériques iOS (à l'exception de la 1ère Touch Gen) à l'aide de la télédommande audio ou de l'API de la file d'attente audio. Ce sont des API de niveau inférieur où vous devez gérer les tampons entrants des échantillons PCM sortants et entrants vous-même. Voir l'application d'exemple d'AurioTouch d'Apple par exemple du code.


3 Réponses :


9
votes

Vous pouvez utiliser l'utilisation du cadre d'aviverse. Il a Avadiaplayer de jouer audio et Avaudorecorder à enregistrer. Vous devez garder à l'esprit que l'enregistreur enregistrera uniquement l'utilisation de micro. Donc, avec le simultant qui jouant un fichier audio et l'enregistrement dépend de la manière dont le MIC perçoit le son joué.


0 commentaires

2
votes

Veuillez vérifier AurioTouch Code d'exemple Apple pour l'enregistrement audio-and-play simultanément

Vous pouvez également vérifier Enregistrement de l'audio sur un iPhone


0 commentaires

0
votes

Pour enregistrer une lecture des fichiers audio dans iOS, vous pouvez utiliser un cadre d'avivervance. Utilisez le code SWIFT ci-dessous pour enregistrer et lire les audios. N'oubliez pas que l'enregistreur enregistrera l'audio avec l'utilisation de micro, veuillez donc tester ce code sur le périphérique.

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


2 commentaires

Je souhaite enregistrer l'audio de sortie (je veux dire audio audio en streaming en direct)


Dans iOS 12.4.1 Cette solution ne démarre pas Enregistrement lorsque l'audio joue en arrière-plan (donc lorsque l'application n'est pas au premier plan)