首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS音频单元+ Speex编码失真

iOS音频单元+ Speex编码失真
EN

Stack Overflow用户
提问于 2012-07-16 15:38:07
回答 1查看 1.2K关注 0票数 0

我正在做一个iOS项目,需要使用remoteIO音频单元作为输入/输出来编码和解码Speex音频。

我遇到的问题是,虽然speex没有打印任何错误,但我得到的音频在某种程度上可以识别为语音,但非常失真,听起来像是增益是以机器人的方式启动的。

以下是编码和解码函数(编码的输入是来自音频单元渲染函数的320字节的有符号整数,解码的输入是62字节的压缩数据):

代码语言:javascript
复制
#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;
}

和音频单元格式:

代码语言:javascript
复制
// 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的采样率进行处理

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-18 01:14:41

在为这件事疯狂了几天之后,我终于明白了。Speex的诀窍在于,您必须初始化SpeexBit和编码器void*,并在整个会话中使用它们。因为我为编码的每一段重新创建了它们,所以产生了奇怪的结果。

一旦我搬家了:

代码语言:javascript
复制
 speex_bits_init(&bits);
 enc_state = speex_encoder_init(&speex_nb_mode);

在while循环之外,一切都运行得很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11499957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档