2011-08-02 4 views
6

में ऑडियोक्यूयू के साथ speex को एन्कोड/डीकोड कैसे करें यदि किसी के पास कुछ अनुभव है जो ऑडियोक्यूयू के साथ स्पीक्स ऑडियो प्रारूप को एन्कोड/डीकोड करता है?आईओएस

मैंने SpeakHere नमूना संपादित करके इसे कार्यान्वित करने का प्रयास किया है। लेकिन सफलता नहीं!

सेब एपीआई दस्तावेज़ से, ऑडियोक्यूयू कोडेक का समर्थन कर सकता है, लेकिन मुझे कोई नमूना नहीं मिला है। क्या कोई मुझे कुछ सुझाव दे सकता है? मैं पहले से ही XCode 4.

उत्तर

0

सेब नमूना कोड में में अपने प्रोजेक्ट में Speex कोडेक संकलित सफलतापूर्वक "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; 
    } 

यह सामान्य विचार है। निश्चित रूप से तथ्य कठिन है, लेकिन आप वीओआईपी के कुछ खुले स्रोत देख सकते हैं, शायद आपकी मदद कर सकते हैं। शुभकामनाएँ।

0

आप एफएफएमपीईजी के साथ यह सब हासिल कर सकते हैं और फिर इसे ऑडियोक्यूयू के साथ पीसीएम के रूप में खेल सकते हैं। FFMPEG पुस्तकालय का निर्माण नहीं तो दर्द रहित है लेकिन पूरे डिकोड/एनकोड प्रक्रिया है कि कठिन नहीं है :)

FFMPEG official site SPEEX official site

आप libs डाउनलोड करने और उन्हें अपने आप को निर्माण करना होगा और फिर आप करेंगे उन्हें एफएफएमपीईजी में शामिल करना और इसे बनाना है।

+0

मैं कोशिश की है सभी सुझावों आपने दिया है मैंने भाषण के लिए एफएफएमपीईजी संकलित किया है। कृपया इस लिंक का संदर्भ लें http://stackoverflow.com/questions/22935787/compiling-ffmpeg-to-support-speex-decoding। – user2955351

0

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

जानकारी के लिए धन्यवाद। आप उल्लेख करते हैं कि 640 स्पीक्स (320 छोटा) में फ्रेम आकार है। "320 छोटा" क्या मतलब है? चूंकि कम से कम दो बाइट लंबा है तो हमारे पास 320 जोड़े बाइट हैं? – csotiriou