2016-11-01 12 views
1

我試圖使用OPUS API的基本編碼和解碼功能與本公司主營:解碼與作品API使用opus_decode_float

#include <stdlib.h> 
#include <errno.h> 
#include <string.h> 
#include <opus/opus.h> 
#include <stdio.h> 

int  main(int argc, char **argv) 
{ 
    OpusEncoder *enc; 
    OpusDecoder *dec; 
    unsigned char   *str; 
    float   frame = 0.32; 
    int   ret = 0; 
    int   error; 
    float   *returned; 

    if ((str = malloc(4096)) == NULL) 
    return (-1); 
    enc = opus_encoder_create (24000, 1, OPUS_APPLICATION_AUDIO, &error); 

    printf("ret = %d | input = %.2f\n", error, frame); 

    ret = opus_encode_float(enc, &frame, 480, str, 4096); 

    printf("ret = %d\n", ret); 

    dec = opus_decoder_create (24000, 1, &error); 
    ret = opus_decode_float(dec, str, ret, returned, 480, 0); 

    printf("ret = %d | res = %.2f\n", ret, returned[0]); 

    return (0); 
} 

麻煩的是,我試圖通過0.32浮球使用opus_decoder_float對它進行編碼和解碼,但是當我試圖打印我的結果時,我只能得到0.00,並且找不到使用此特定功能的任何示例。

我沒有得到與RET值的錯誤信息,該程序打印:

ret = 0 | input = 0.32 
ret = 3 
ret = 480 | res = 0.00 

我怎樣才能在返回浮動的0.32?

+0

建議檢查像'enc'和'dec'這樣的返回值。 – chux

回答

0

returned未初始化。 opus_decode_float()printf()接收到一個不確定值的指針。

// problem code 
    returned float   *returned; 
    ... 
    // What value is `returned`? 
    ret = opus_decode_float(dec, str, ret, returned, 480, 0); 
    printf("ret = %d | res = %.2f\n", ret, returned[0]); 

建議修復,分配內存。 opus_decode_float()

returned float   *returned; 
    ... 
    int frame_size = 480; 
    int channels = 1; // from `opus_encoder_create (24000, 1, ...` 

    returned = malloc(sizeof *returned * frame_size * channels); 
    assert(returned); 
    ret = opus_decode_float(dec, str, ret, returned, frame_size, 0); 

    printf("ret = %d | res = %.2f\n", ret, returned[0]); 
    free(returned); 

此外,正如我讀docpcm下面需要一個指向一個大陣列的float(frame_size *信道),而不是僅僅1.

opus_int32 opus_encode_float(OpusEncoder *st, const float *pcm, 
    int frame_size, unsigned char *data, opus_int32 max_data_bytes) 

// Too small? 
float frame = 0.32; 
ret = opus_encode_float(enc, &frame, 480, str, 4096); 
+0

這可能是麻煩,雖然即使我說分配浮點數,我仍然得到0.00最後。 – sh5164

+0

@ S.Hochberg注意:代碼中有許多_magic numbers_,如4096,24000,1,沒有自證據的含義 - 這增加了理解代碼的難度。例子:在各個地方最好使用像'int frame_size = 480;'和'frame_size'這樣的東西,而不是'480'來清楚地表達對象的含義。 AFAIK 4096是錯誤的。爲什麼4096? – chux

+0

那麼他們需要的緩衝區大小,所以出於測試目的,我沒有想到這一點,只是將其設置爲4096. 24000和1是Opus API對應於輸入信號的採樣率的數字,以及通道(1對應於單聲道和2個立體聲) – sh5164

0

作品具有2.5到6.5毫秒的先行,取決於編碼器參數。因此,與輸入相比,解碼的輸出將稍微延遲,並且對於採樣精確的解碼,您應該跳過解碼器的初始採樣,並在最後解碼相同數量的額外採樣。可以使用獲得先行的樣本的確切數目:

opus_int32 skip; 
opus_encoder_ctl(enc, OPUS_GET_LOOKAHEAD(&skip)); 

這意味着你應該跳過第一skip解碼的樣本來獲得對應於輸入的第一個樣品的樣品。

還請記住,它是有損壓縮。雖然它的意圖聽起來與原始音色相同,但您不應該期望樣本的值相同。