2011-08-02 11 views
6

Herhangi biri AudioQueue ile speex ses formatını kodlayan/çözen bir deneyiminiz varsa?ios'da AudioQueue ile speex'i kodlama/çözme

SpeakHere örneğini düzenleyerek uygulamayı denedim. Ama başarı değil!

Apple API belgesinden AudioQueue codec'i destekleyebilir, ancak hiçbir örnek bulamıyorum. Birisi bana bir öneri verebilir mi? Zaten elma örnek kodda XCode 4.

cevap

0

benim projede başarıyla speex codec'i derlenmiş "SpeakHere" Böyle bir şey yapabilirsiniz:

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

Eğer işlevinde "MyInputBufferHandler" Bazı şeyi yapabilir gibi

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

gibi kodlayıcı fonksiyonu:

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

Bu genel bir fikirdir. Elbette ki gerçektir, fakat VOIP'in açık bir kaynağını görebilirsiniz, belki size yardımcı olabilir. iyi şanslar.

0

Tüm bunlara FFMPEG ile ulaşabilir ve daha sonra AudioQueue ile PCM olarak oynayabilirsiniz. FFMPEG kütüphanenin bina o kadar acısız ama bütün kod çözme/kodlama işlemi o kadar da zor değil :)

FFMPEG official site SPEEX official site

Sen kütüphanelerini indirip bunları kendiniz kurmak zorunda kalacak ve daha sonra olacak onları FFMPEG'ye dahil etmeli ve onu inşa etmeliyiz.

+0

speex kodlayıcı bütün önerilerin verdin. Speex için FFMPEG'i derledim. Lütfen bu bağlantıya http://stackoverflow.com/questions/22935787/compiling-ffmpeg-to-support-speex-decoding bakın. – user2955351

0

Aşağıda AudioQueue ve kodlamak (geniş bantlı) speex'in kullanarak kullanarak Yakalama Ses için Kod olan (Audio Daha Kaliteli Sen, ayrı Konuya verileri kodlamak için yakalama formatına göre sizin örnek boyutunu değiştirme yapabilirsiniz için).

Ses biçimi

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

Yakalama geri arama

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

denedim

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

Bilgi için teşekkürler. 640'ın Speex'te (320 kısa) çerçeve boyutu olduğunu belirtiyorsunuz. "320 kısa" ne anlama geliyor? Kısacası iki bayt uzunluğundan beri 320 çift baytımız var mı? – csotiriou