【发布时间】:2017-08-24 14:10:02
【问题描述】:
我目前正在尝试使用 SDL 录制音频并对其进行处理,但在获取处理步骤所需的 16 位 PCM 音频时遇到了一些麻烦。我运行的设备只支持 AUDIO_F32 格式。所以我的 AudioSpec 如下;
SDL_AudioSpec wanted;
SDL_zero(wanted);
wanted.freq = 48000;
wanted.format = AUDIO_F32SYS;
wanted.channels = 1;
wanted.samples = 4096;
wanted.callback = NULL;
现在我必须关注包含录制音频的缓冲区;
std::vector<Uint8> buffered;
如何将Uint8 转换为 16 位 PCM 格式? Uint8 应该是定义为 unsigned char 的 32 位浮点音频,如果我是正确的。我已经尝试了下面的代码,但它似乎没有给出正确的结果;
std::vector<int16_t> pcm_buffer;
for( const Uint8& sample : buffered )
{
float sampleFloat = (float) sample;
sampleFloat *= 32767;
int16_t sampleInt = (int16_t) sampleFloat;
pcm_buffer.push_back(sampleInt);
}
我有一种感觉,我完全误解了我在做什么,所以我希望有人能指出我正确的方向。
【问题讨论】:
-
这是真实的代码吗?我有一种预感,
Uint应该真的是Uint8。如果您手动输入:请考虑复制 + 粘贴。 -
我不得不编辑部分代码,因为我做了很多实验,我的代码是/是一团糟,但它确实应该是 Uint8。