0
我正在研究一个需要使用remoteIO音频单元作为输入/输出对Speex音频进行编码和解码的iOS项目。iOS音频单元+ Speex编码失真
我遇到的问题是虽然Speex不会打印任何错误,但我得到的音频有点可识别为声音,但非常失真,有点听起来像增益只是以机器人的方式打开。
这里是编码和解码功能(输入到编码是从音频单元320个字节带符号的整数的渲染功能,输入到解码是62个字节的压缩的数据):
#define AUDIO_QUALITY 10
#define FRAME_SIZE 160
#define COMP_FRAME_SIZE 62
char *encodeSpeexWithBuffer(spx_int16_t *buffer, int *insize) {
SpeexBits bits;
void *enc_state;
char *outputBuffer = (char *)malloc(200);
speex_bits_init(&bits);
enc_state = speex_encoder_init(&speex_nb_mode);
int quality = AUDIO_QUALITY;
speex_encoder_ctl(enc_state, SPEEX_SET_QUALITY, &quality);
speex_bits_reset(&bits);
speex_encode_int(enc_state, buffer, &bits);
*insize = speex_bits_write(&bits, outputBuffer, 200);
speex_bits_destroy(&bits);
speex_encoder_destroy(enc_state);
return outputBuffer;
}
short *decodeSpeexWithBuffer(char *buffer) {
SpeexBits bits;
void *dec_state;
speex_bits_init(&bits);
dec_state = speex_decoder_init(&speex_nb_mode);
short *outTemp = (short *)malloc(FRAME_SIZE * 2);
speex_bits_read_from(&bits, buffer, COMP_FRAME_SIZE);
speex_decode_int(dec_state, &bits, outTemp);
speex_decoder_destroy(dec_state);
speex_bits_destroy(&bits);
return outTemp;
}
和音频单元格式:
// Describe format
audioFormat.mSampleRate = 8000.00;
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger |
kAudioFormatFlagsNativeEndian |
kAudioFormatFlagIsPacked;
audioFormat.mFramesPerPacket = 1;
audioFormat.mChannelsPerFrame = 1;
audioFormat.mBitsPerChannel = 16;
audioFormat.mBytesPerPacket = 2;
audioFormat.mBytesPerFrame = 2;
没有错误报道的任何地方。我已经证实,音频单元为处理在8000
你好我AudioUnit.i工作不能从Audiounit得到像(160字节)所需的字节,它总是给2的力量。是否有可能从Audiounit录音回调得到320字节?如果是的话请给点意见 – 2012-07-27 06:50:28
这是正确的。音频单元只给你2个样本的权力。您必须缓冲音频数据,然后以320字节块的形式从缓冲区提取数据(如果可用) – 2012-08-11 06:31:41