2011-08-02 38 views
6

Nếu có ai có một số kinh nghiệm mã hóa/giải mã định dạng âm thanh speex với AudioQueue?Làm thế nào để mã hóa/giải mã speex với AudioQueue trong ios

Tôi đã cố gắng triển khai bằng cách chỉnh sửa mẫu SpeakHere. Nhưng không thành công!

Từ tài liệu API của Apple, AudioQueue có thể hỗ trợ codec, nhưng tôi không thể tìm thấy bất kỳ mẫu nào. Bất cứ ai có thể cho tôi một số gợi ý? Tôi đã biên soạn Speex giải mã thành công trong dự án của tôi trong XCode 4.

Trả lời

0

trong mã mẫu táo "SpeakHere" bạn có thể làm một số điều như thế này:

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

bạn có thể làm một số điều trong chức năng "MyInputBufferHandler" như

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

chức năng mã hóa như:

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

Đây là ý tưởng chung. Tất nhiên, thực tế là khó, nhưng bạn có thể thấy một số mã nguồn mở của VOIP, có thể có thể giúp bạn. chúc may mắn.

0

Bạn có thể đạt được tất cả những điều đó với FFMPEG và sau đó phát nó dưới dạng PCM với AudioQueue. Việc xây dựng các thư viện FFMPEG không phải là quá đau đớn nhưng toàn bộ quá trình giải mã/mã hóa không phải là khó :)

FFMPEG official site SPEEX official site

Bạn sẽ phải tải về libs và xây dựng chúng mình và sau đó bạn sẽ phải đưa chúng vào FFMPEG và xây dựng nó.

+0

Tôi đã thử tất cả những đề nghị mà bạn đã đưa ra. Tôi đã biên soạn FFMPEG cho speex. Vui lòng tham khảo liên kết này http://stackoverflow.com/questions/22935787/compiling-ffmpeg-to-support-speex-decoding. – user2955351

0

Dưới đây là mã để chụp âm thanh sử dụng âm thanh và mã hóa (băng rộng) sử dụng dấu phẩy (để có chất lượng âm thanh tốt hơn, bạn có thể mã hóa dữ liệu trong chủ đề riêng biệt, thay đổi kích thước mẫu theo định dạng chụp).

âm thanh định dạng

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

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

Speex encoder

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

Cảm ơn thông tin. Bạn đề cập đến 640 là kích thước khung hình trong Speex (320 ngắn). "320 short" nghĩa là gì? Đó là từ một đoạn ngắn là hai byte dài sau đó chúng tôi có 320 cặp byte? – csotiriou

Các vấn đề liên quan