Как преобразовать эту переменную UnsafeMutablePointer‹UnsafeMutablePointer‹Float›› в AudioBufferList?

У меня есть этот метод EZAudio в моем проекте Swift для захвата звука с микрофона:

func microphone(microphone: EZMicrophone!, hasAudioReceived bufferList: UnsafeMutablePointer<UnsafeMutablePointer<Float>>, withBufferSize bufferSize: UInt32, withNumberOfChannels numberOfChannels: UInt32) {

}

Но что мне действительно нужно, так это иметь этот параметр «bufferList» как тип AudioBufferList, чтобы отправлять эти аудиопакеты через сокет, как я делал в Objective C:

//Objective C pseudocode:
for(int i = 0; i < bufferList.mNumberBuffers; ++i){
   AudioBuffer buffer = bufferList.mBuffers[i];
   audio = ["audio": NSData(bytes: buffer.mData, length: Int(buffer.mDataByteSize))];
   socket.emit("message", audio);
}

Как я могу преобразовать эту переменную UnsafeMutablePointer> в AudioBufferList?


person Josh    schedule 16.06.2016    source источник
comment
у вас есть какие-либо новые обновления для этого, я пытаюсь добиться того же, мне нужно отправить nsdata в сокет, я использую CocoaSyncSocket и ezaudio   -  person Muhammad Faizan Khatri    schedule 21.04.2017
comment
Привет @MuhammadFaizanKhatri, некоторое время назад у меня все заработало, код вставлен ниже в качестве ответа. Голосуйте, если это работает!   -  person Josh    schedule 25.04.2017


Ответы (2)


Мне удалось передать звук с микрофона в сокет, например:

func microphone(microphone: EZMicrophone!, hasBufferList bufferList: UnsafeMutablePointer<AudioBufferList>, withBufferSize bufferSize: UInt32, withNumberOfChannels numberOfChannels: UInt32) {
        let blist:AudioBufferList=bufferList[0]
        let buffer:AudioBuffer = blist.mBuffers
        let audio = ["audio": NSData(bytes: buffer.mData, length: Int(buffer.mDataByteSize))];
        socket.emit("message", audio);//this socket comes from Foundation framework
    }

Эта общая настройка AudioStreamDescriptor сработала для меня, вам, возможно, придется настроить ее для своих нужд или опустить некоторые части, такие как анимация формы волны:

func initializeStreaming() {
        var streamDescription:AudioStreamBasicDescription=AudioStreamBasicDescription()
        streamDescription.mSampleRate       = 16000.0
        streamDescription.mFormatID         = kAudioFormatLinearPCM
        streamDescription.mFramesPerPacket  = 1
        streamDescription.mChannelsPerFrame = 1
        streamDescription.mBytesPerFrame    = streamDescription.mChannelsPerFrame * 2
        streamDescription.mBytesPerPacket   = streamDescription.mFramesPerPacket * streamDescription.mBytesPerFram
        streamDescription.mBitsPerChannel   = 16
        streamDescription.mFormatFlags      = kAudioFormatFlagIsSignedInteger
        microphone = EZMicrophone(microphoneDelegate: self, withAudioStreamBasicDescription: sstreamDescription, startsImmediately: false)
        waveview?.plotType=EZPlotType.Buffer
        waveview?.shouldFill = false
        waveview?.shouldMirror = false
    }

Было сложно запустить эту штуку, удачи!

person Josh    schedule 25.04.2017
comment
я попытался настроить в формате kAudioFormatLinearPCM, и он работает нормально, но мне нужно преобразовать формат в ULaw, эта конфигурация доставляет мне неприятности, у вас есть какие-либо настройки для инициализации? - person Muhammad Faizan Khatri; 25.04.2017
comment
@MuhammadFaizanKhatri Вы пробовали вместо этого использовать kAudioFormatULaw? Теоретически существует много аудиоформатов, которые вы можете использовать, но на самом деле я обнаружил, что большинство комбинаций форматов дают сбой или не работают должным образом в iOS. Я использовал эту конфигурацию, потому что все остальные, которые я пробовал, давали сбой. - person Josh; 25.04.2017
comment
@MuhammadFaizanKhatri некоторые люди пытаются использовать ULaw здесь: постоянный шум"> stackoverflow.com/questions/8426967/ - person Josh; 25.04.2017

Я полагаю, вы бы создали указатель AudioBufferList и использовали результат функции memory.

let audioBufferList = UnsafePointer<AudioBufferList>(bufferList).memory 
person Casey Fleser    schedule 16.06.2016