2012-07-16 3 views
0

input/output으로 remoteIO 오디오 장치를 사용하여 Speex 오디오를 인코딩하고 디코딩해야하는 iOS 프로젝트에서 작업하고 있습니다.iOS Audio Unit + Speex 인코딩이 왜곡되었습니다.

speex가 오류를 인쇄하지 않지만 내가 얻은 오디오는 음성으로 인식 할 수 있지만 매우 왜곡되어 있습니다. 이득과 같은 소리가 로봇 식으로 출력됩니다.

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

오디오 장치 : 여기

가 인코딩 및 디코딩 기능이다 (인코딩하기 위해 입력 오디오 유닛으로부터 부호 정수의 320 바이트 함수 렌더링, 디코딩에 입력 된 압축 데이터의 62 바이트) 형식 :

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

오류 어디서나보고되지 않고 나는 오디오 장치는 처리가 몇 D 후, 8000

+0

: AudioUnit.i에서 작업하고 있습니다. Audiounit에서 160 바이트와 같은 원하는 바이트를 가져올 수 없습니다. 항상 2의 힘을줍니다. Audiounit 녹음 콜백에서 320 바이트를 얻을 수 있습니까? 그렇다면 아이디어를주십시오. –

+0

맞습니다. 오디오 장치는 오직 2 개의 샘플의 파워를 제공합니다. 오디오 데이터를 버퍼링 한 다음 사용 가능한 경우 320 바이트 청크로 버퍼에서 데이터를 추출해야합니다. –

답변

0

의 샘플 속도를 확인했다 이것에 미치게되는 것들은 마침내 그것을 알아 냈다. Speex의 트릭은 SpeexBit 및 인코더 void *를 초기화하고 전체 세션에서 사용해야한다는 것입니다. 왜냐하면 나는 인코딩 된 모든 부분에 대해 그것들을 재현하고 있었기 때문에 그것은 이상한 울리는 결과를 초래했다.

나는 이동하면 :

는 while 루프의 모든 중
speex_bits_init(&bits); 
enc_state = speex_encoder_init(&speex_nb_mode); 

큰했다.

관련 문제