2015-11-02 6 views
4

Я хотел бы записать некоторые аудио с помощью AVAudioEngine и пользователей микрофона. У меня уже есть рабочий образец, но я просто не могу понять, как указать формат вывода, который я хочу ...Как указать формат AVAudioEngine Mic-Input?

Моим требованием было бы то, что мне нужен AVAudioPCMBuffer, поскольку я говорю, что он в настоящее время делает. .

Должен ли я добавить отдельный узел, который выполняет некоторую перекодировку? Я не могу найти много документации/образцов по этой проблеме ...

И я также являюсь ножом, когда дело доходит до Audio-Stuff. Я знаю, что я хочу NSData содержащего PCM-16- с максимальной частотой дискретизации 16000 (8000 будет лучше)

Вот мой рабочий пример:

private var audioEngine = AVAudioEngine() 

func startRecording() { 

    let format = audioEngine.inputNode!.inputFormatForBus(bus) 

    audioEngine.inputNode!.installTapOnBus(bus, bufferSize: 1024, format: format) { (buffer: AVAudioPCMBuffer, time:AVAudioTime) -> Void in 

    let audioFormat = PCMBuffer.format 
    print("\(audioFormat)") 
    } 

    audioEngine.prepare() 
    do { 
    try audioEngine.start() 
    } catch { /* Imagine some super awesome error handling here */ } 
} 

Если я изменил формат, чтобы позволить»говорить

let format = AVAudioFormat(commonFormat: AVAudioCommonFormat.PCMFormatInt16, sampleRate: 8000.0, channels: 1, interleaved: false) 

тогда, если будет выдавать ошибку о том, что частота дискретизации должна быть такой же, как hwInput ...

Любая помощь очень высоко ценится !!!

EDIT: Я только что нашел AVAudioConverter, но мне нужно, чтобы быть совместимым с iOS8, а ...

ответ

0

Вы не можете изменить конфигурацию узла ввода, попытайтесь создать узел миксера с форматом, который вы хотите , присоедините его к движку, затем подключите его к входному узлу, а затем подключите mainMixer к только что созданному узлу. Теперь вы можете установить кран на этом узле, чтобы получить данные PCM.

Обратите внимание, что по каким-то странным причинам у вас не так много выбора для частоты дискретизации! По крайней мере, не на iOS 9.1, используйте стандартные 11025, 22050 или 44100. Любая другая частота дискретизации не сработает!

+0

8000 работает также. – nullforlife

+1

Кажется, что для работы 8000 Гц вам нужно вызвать session.setPreferredSampleRate (8000) на AVAudioSession.sharedInstance(). Это фактически изменит частоту дискретизации до 16000, но затем Mixer может переконвертировать ее до 8 кГц. – philips77

3

Вы не можете изменить аудиоформат непосредственно на входах или выходных узлах. В случае с микрофоном формат всегда будет 44 кГц, 1 канал, 32 бит. Для этого вам нужно вставить микшер между ними. Затем, когда вы подключаете inputNode> changeformatMixer> mainEngineMixer, вы можете указать детали требуемого формата.

Что-то вроде:

var inputNode = audioEngine.inputNode 
var downMixer = AVAudioMixerNode() 
var mainMixer = audioEngine.mainMixerNode 

//I think you the engine's I/O nodes are already attached to itself by default, so we attach only the downMixer here: 
audioEngine.attachNode(downMixer) 

//You can tap the downMixer to intercept the audio and do something with it: 
downMixer.installTapOnBus(0, bufferSize: 2048, format: downMixer.outputFormatForBus(0), block: //originally 1024 
      { (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in 
       print(NSString(string: "downMixer Tap")) 
       do{ 
        print("Downmixer Tap Format: "+self.downMixer.outputFormatForBus(0).description)//buffer.audioBufferList.debugDescription) 

     }) 

//let's get the input audio format right as it is 
let format = inputNode.inputFormatForBus(0) 
//I initialize a 16KHz format I need: 
let format16KHzMono = AVAudioFormat.init(commonFormat: AVAudioCommonFormat.PCMFormatInt16, sampleRate: 11050.0, channels: 1, interleaved: true) 

//connect the nodes inside the engine: 
//INPUT NODE --format-> downMixer --16Kformat--> mainMixer 
//as you can see I m downsampling the default 44khz we get in the input to the 16Khz I want 
audioEngine.connect(inputNode, to: downMixer, format: format)//use default input format 
audioEngine.connect(downMixer, to: audioEngine.outputNode, format: format16KHzMono)//use new audio format 
//run the engine 
audioEngine.prepare() 
try! audioEngine.start() 

Я бы рекомендовал использовать открытую структуру, такие как EZAudio, вместо этого, хотя.

+1

Ваш 'mainMixerNode' не используется. Вместо этого вы подключаетесь к 'outputNode' в своем примере. Зачем? –

+0

Также это не работает для произвольных форматов. –

+0

Это ограничение iOS, вам предлагается куча форматов, но только 2 или 3 действительно работают. @ErikAigner I – Josh

Смежные вопросы