Cómo codificar / decodificar speex con AudioQueue en ios

Si alguien tiene alguna experiencia que codifique / decodifique el formatting de audio speex con AudioQueue?

He intentado implementarlo editando el ejemplo de SpeakHere. ¡Pero no el éxito!

Desde el documento API de Apple, AudioQueue puede admitir el códec, pero no puedo encontrar ninguna muestra. ¿Podría alguien darme alguna sugerencia? Ya compilé el códec speex con éxito en mi proyecto en XCode 4.

    En el código de ejemplo de manzana "SpeakHere" puede hacer algo como esto:

    AudioQueueNewInput( &mRecordFormat, MyInputBufferHandler, this /* userData */, NULL /* run loop */, NULL /* run loop mode */, 0 /* flags */, &mQueue) 

    puedes hacer algo en la function "MyInputBufferHandler" como

     [self encoder:(short *)buffer->mAudioData count:buffer->mAudioDataByteSize/sizeof(short)]; 

    la function del codificador como:

     while ( count >= samplesPerFrame ) { speex_bits_reset( &bits ); speex_encode_int( enc_state, samples, &bits ); static const unsigned maxSize = 256; char data[maxSize]; unsigned size = (unsigned)speex_bits_write( &bits, data, maxSize ); /* do some thing... for example :send to server */ samples += samplesPerFrame; count -= samplesPerFrame; } 

    Esta es la idea general. Por supuesto, es difícil, pero puedes ver una fuente abierta de VOIP, tal vez pueda ayudarte. buena suerte.

    Puede lograr todo eso con FFMPEG y luego reproducirlo como PCM con AudioQueue. La construcción de la biblioteca FFMPEG no es tan indolora, pero todo el process de deencoding / encoding no es tan difícil 🙂

    Sitio oficial de FFMPEG sitio oficial de SPEEX

    Tendrá que download las libs y comstackrlas usted mismo y luego deberá includelas en FFMPEG y crearlas.

    A continuación se muestra el Código para capturar audio usando audioqueue y codificar (banda ancha) usando speex (Para una mejor calidad de audio, puede codificar datos en un subprocess separado, cambie el tamaño de muestra según su formatting de captura).

    Formato de audio

      mSampleRate = 16000; mFormatID = kAudioFormatLinearPCM; mFramesPerPacket = 1; mChannelsPerFrame = 1; mBytesPerFrame = 2; mBytesPerPacket = 2; mBitsPerChannel = 16; mReserved = 0; mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked; 

    Captura de callback

      void CAudioCapturer::AudioInputCallback(void *inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer, const AudioTimeStamp *inStartTime, UInt32 inNumberPacketDescriptions, const AudioStreamPacketDescription *inPacketDescs) { CAudioCapturer *This = (CMacAudioCapturer *)inUserData; int len = 640; char data[640]; char *pSrc = (char *)inBuffer->mAudioData; while (len <= inBuffer->mAudioDataByteSize) { memcpy(data,pSrc,640); int enclen = encode(buffer,encBuffer); len=len+640; pSrc+=640; // 640 is the frame size for WB in speex (320 short) } AudioQueueEnqueueBuffer(This->m_audioQueue, inBuffer, 0, NULL); } 

    codificador speex

      int encode(char *buffer,char *pDest) { int nbBytes=0; speex_bits_reset(&encbits); speex_encode_int(encstate, (short*)(buffer) , &encbits); nbBytes = speex_bits_write(&encbits, pDest ,640/(sizeof(short))); return nbBytes; }