编码 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 返回的大小。这将丢弃未使用的条目。
我正在尝试使用 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 返回的大小。这将丢弃未使用的条目。