编码 Opus 时编码的声音丢失数据

Encoded Sound loses data when encoding Opus

我正在尝试使用 Opus 对通过 PortAudio 记录的一些数据进行编码,因此每当我尝试对数据进行编码时,写入的数据都会丢失,因为对于向量的每次迭代,unsigned char 向量最终都是空的,原始的数据是从 PortAudio

录制的

这是我的结构:

typedef struct {
    int size;
    std::vector<unsigned char> *sound;
} AudioEnc;

typedef struct {
    int size;
    std::vector<float> sound;
} AudioData;

这是我的编码代码:

#define SAMPLE_RATE (48000)
#define FRAMES_PER_BUFFER (1920)
#define NUM_SECONDS (1)

    AudioEnc Opus::Encode(AudioData data)
    {
        AudioEnc enc = {.size = 0, .sound = new std::vector<unsigned char>};
        unsigned int max_size =  NUM_SECONDS * SAMPLE_RATE;
        float sound[max_size];
    
        enc.sound->resize(max_size);
        if (data.size == 0)
            enc.size = opus_encode_float(_encode, sound, FRAMES_PER_BUFFER, enc.sound->data(), max_size);
        else
            enc.size = opus_encode_float(_encode, data.sound.data(), FRAMES_PER_BUFFER, enc.sound->data(), max_size);
        return (enc);
    }
    
    AudioData Opus::Decode(AudioEnc data)
    {
        AudioData dec;
        dec.sound.resize(NUM_SECONDS * SAMPLE_RATE * 2);
        dec.size = opus_decode_float(_decode, data.sound->data(), data.size, dec.sound.data(), FRAMES_PER_BUFFER, 0) * 2;
        return (dec);
    } 

当我在 opus_encode_float 方法之后遍历 enc 时,声音的所有值都是空的。

你们知道哪里出了问题吗?

问题似乎出在您保留了两种尺码。您正在混合使用 C 和 C++ 风格,这可能解释了 std::vector<unsigned char> *。但更重要的是,std::vector<unsigned char> 存储了它自己的大小,但您还存储了一个单独的大小。而且他们好像不同意。

修复很简单。不要将 .size 存储在 AudioEnc 和 AudioData 中。相反,对向量调用 .resize 以记住从 Opus 返回的大小。这将丢弃未使用的条目。