как кодировать / декодировать speex с помощью AudioQueue в ios

Есть ли у кого-нибудь опыт кодирования / декодирования аудиоформата speex с помощью AudioQueue?

Я попытался реализовать это, отредактировав образец SpeakHere. Но не успех!

Из документа Apple API AudioQueue может поддерживать кодек, но я не могу найти ни одного образца. Может ли кто-нибудь дать мне какое-нибудь предложение? Я уже успешно скомпилировал кодек speex в своем проекте в XCode 4.


person Rainbow Zhang    schedule 02.08.2011    source источник


Ответы (3)


в примере кода Apple "SpeakHere" вы можете сделать что-то вроде этого:

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

вы можете сделать что-нибудь в функции MyInputBufferHandler, например

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

функция кодировщика, например:

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

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

person charse    schedule 19.03.2012

Вы можете добиться всего этого с помощью FFMPEG, а затем воспроизвести его как PCM с помощью AudioQueue. Сборка библиотеки FFMPEG не такая уж безболезненная, но весь процесс декодирования / кодирования не такой уж и сложный :)

Официальный сайт FFMPEG SPEEX официальный сайт

Вам нужно будет загрузить библиотеки и собрать их самостоятельно, а затем вам нужно будет включить их в FFMPEG и собрать его.

person George Petrov    schedule 08.08.2012
comment
Я испробовал все ваши предложения. Я скомпилировал FFMPEG для speex. Перейдите по этой ссылке stackoverflow.com/questions / 22935787 /. - person user2955351; 15.04.2014

Ниже приведен код для захвата звука с использованием аудиочереди и кодирования (широкополосного) с использованием speex (для лучшего качества звука вы можете кодировать данные в отдельном потоке, измените размер выборки в соответствии с вашим форматом захвата).

Аудиоформат

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

Захват обратного вызова

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

кодировщик 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;
    }
person user1613445    schedule 31.08.2012
comment
Спасибо за информацию. Вы упомянули, что 640 - это размер кадра в Speex (320 коротких). Что означает короткий 320? Так как короткий имеет длину два байта, то у нас есть 320 пар байтов? - person csotiriou; 28.10.2012