如果任何人有使用AudioQueue編碼/解碼Speex音頻格式的經驗?如何在ios中使用AudioQueue對speex進行編碼/解碼
我試圖通過編輯SpeakHere示例來實現它。但不成功!
從apple API文檔中,AudioQueue可以支持編解碼器,但我找不到任何示例。任何人都可以給我一些建議嗎?我已經在蘋果的示例代碼的XCode 4
如果任何人有使用AudioQueue編碼/解碼Speex音頻格式的經驗?如何在ios中使用AudioQueue對speex進行編碼/解碼
我試圖通過編輯SpeakHere示例來實現它。但不成功!
從apple API文檔中,AudioQueue可以支持編解碼器,但我找不到任何示例。任何人都可以給我一些建議嗎?我已經在蘋果的示例代碼的XCode 4
編譯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;
}
這是一般的想法。當然事實很難,但你可以看到一些VOIP的開源,也許可以幫助你。 祝你好運。
您可以使用FFMPEG實現所有功能,然後將其作爲帶有AudioQueue的PCM播放。 的FFMPEG庫的建設是不那麼痛苦,但整個解碼/編碼過程並不難:)
FFMPEG official site SPEEX official site
您必須下載庫和自己構建它們,然後你會必須將它們包含到FFMPEG中並構建它。
下面是一個使用使用Speex語音 audioqueue和編碼(寬帶)的代碼捕獲音頻(音頻質量越好,您可以編碼在單獨的線程中的數據,根據您的拍攝格式更改樣本大小)。
音頻格式
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;
}
感謝您的信息。您提到640是Speex中的幀大小(320短)。 「320短」是什麼意思?既然短是兩個字節長,那麼我們有320對字節? – csotiriou
我已經嘗試了所有的建議你已經給了。我已經爲speex編譯了FFMPEG。請參閱此鏈接http://stackoverflow.com/questions/22935787/compiling-ffmpeg-to-support-speex-decoding。 – user2955351