在iOS AudioQueue中用Speex进行编码和解码
来源:互联网 发布:mac windows 哪个好 编辑:程序博客网 时间:2024/05/18 01:05
转自 http://blog.csdn.net/qq871531334/article/details/18992737
the apple sample code "SpeakHere" you can do some thing like this:
AudioQueueNewInput(
&mRecordFormat,
MyInputBufferHandler,
this /* userData */,
NULL /* run loop */,
NULL /* run loop mode */,
0 /* flags */, &mQueue)
you can do some thing in function "MyInputBufferHandler" like
[self encoder:(short *)buffer->mAudioData count:buffer->mAudioDataByteSize/sizeof(short)];
the encoder function like:
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;
}
This is the general idea.Of course fact is hard, but you can see some open source of VOIP, maybe can help you. good luck.
Below is the Code For Capturing Audio using audioqueue and encode (wide-band) using speex (For Better Quality of Audio You can encode data in separate Thread , Change your sample size according to your capture format).
Audio format
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; }
- 在iOS AudioQueue中用Speex进行编码和解码
- 在iOS AudioQueue中用Speex进行编码和解码
- 在iOS AudioQueue中用Speex进行编码和解码
- 在iOS AudioQueue中用Speex进行编码和解码
- speex 基本编码解码流程
- iOS 编码和解码
- 编译speex / speexdsp for iOS audiounit边录边播,audioqueue边录边播
- IOS中对Url进行编码和解码
- IOS中对Url进行编码和解码
- IOS中对Url进行编码和解码
- IOS中对Url进行编码和解码
- 转载:在 Java 中如何进行 BASE64 编码和解码
- 在 Java 中如何进行 BASE64 编码和解码
- 在 Java 中如何进行 BASE64 编码和解码
- 在 Java 中如何进行 BASE64 编码和解码
- 在LoadRunner中进行Base64的编码和解码
- 在 Java 中如何进行 BASE64 编码和解码
- 在 Java 中如何进行 BASE64 编码和解码
- 大话项目管理工具之Jira篇
- 数据库原理——基本概念
- myeclipse_快捷键大全(2)
- windows的磁盘操作之五——获取物理磁盘上的所有逻辑分区号
- Git学习笔记四
- 在iOS AudioQueue中用Speex进行编码和解码
- json计算并传多个值到后台
- 安卓应用程序插件化开发框架 -AAP Framework
- XStream实现xml和java对象之间的互相转换(包括对属性,别名,下划线_的处理),同理JSON也可以
- windows的磁盘操作之六——获取系统所在物理磁盘号
- Java之斐波那契数列
- 打包前代码混淆
- RailsCasts13 Dangers of Model in Session 将model放在session中是危险的
- 签到功能之三部曲