2011-08-02 16 views
6

Si alguien tiene alguna experiencia que codifique/descodifique el formato de audio speex con AudioQueue?cómo codificar/decodificar speex con AudioQueue en ios

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

Desde el documento API de apple, AudioQueue puede admitir códec, pero no puedo encontrar ninguna muestra. ¿Alguien podría darme alguna sugerencia? Ya compilado códec Speex con éxito en mi proyecto en Xcode 4.

Respuesta

0

en el código de ejemplo de manzana "SPEAKHERE" se puede hacer algo como esto:

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

se puede hacer algo en la función "MyInputBufferHandler" como

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

la función de 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, la realidad es difícil, pero puedes ver alguna fuente abierta de VOIP, quizás pueda ayudarte. buena suerte.

0

Puede lograr todo eso con FFMPEG y luego reproducirlo como PCM con AudioQueue. El edificio de la biblioteca FFMPEG no es tan indoloro, pero todo el proceso de decodificación/codificación no es tan difícil :)

FFMPEG official site SPEEX official site

Usted tendrá que descargar las librerias y construirlos usted mismo y entonces tiene que incluirlos en FFMPEG y compilarlo.

+0

He intentado todas las sugerencias que has dado. He compilado FFMPEG para Speex. Consulte este enlace http://stackoverflow.com/questions/22935787/compiling-ffmpeg-to-support-speex-decoding. – user2955351

0

A continuación se muestra el código para capturar audio usando audioqueue y encode (banda ancha) usando speex (Para una mejor calidad de audio Puede codificar datos en un subproceso separado, cambiar el tamaño de muestra de acuerdo con su formato de captura).

de audio en formato

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

captura de devolución de llamada

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; 
    } 
+0

Gracias por la información. Menciona que 640 es el tamaño de fotograma en Speex (320 cortos). ¿Qué significa "320 corto"? Que como un corto tiene dos bytes, entonces tenemos 320 pares de bytes? – csotiriou

Cuestiones relacionadas