我正在尝试将32位音频数据转换为24位音频。但是,当我尝试演奏时,我得到的只是噪音。似乎我缺少一些非常基本的东西?
应该是小尾数原始PCM。
template<typename T>
static std::vector<int8_t> audio_32_to_24(const T& audio_data)
{
auto size = std::distance(std::begin(audio_data), std::end(audio_data));
auto input8 = reinterpret_cast<const int8_t*>(&(*std::begin(audio_data)));
auto output8 = std::vector<int8_t>();
output8.reserve(size*3);
for(int n = 0; n < size; ++n)
{
output8.push_back(input8[n*4+1]);
output8.push_back(input8[n*4+2]);
output8.push_back(input8[n*4+3]);
}
return output8;
}
最佳答案
如果输入也为LE,则输出字节顺序似乎是相反的:
output8.push_back(input8[n*4+3]);
output8.push_back(input8[n*4+2]);
output8.push_back(input8[n*4+1]);
编辑纯粹出于乐趣,我考虑将其替换为(因为看起来您可能正在使用C++ 0x:
size_t i = 0;
std::copy_if(
reinterpret_cast<const int8_t*>(&*std::begin(audio_data)),
reinterpret_cast<const int8_t*>(&*std::end(audio_data)),
std::back_inserter(output),
[&i] (int) { return 0 == (i++ % 4); });
另外,请考虑更换
reserve
与resize
push_back
或带有直接迭代器的输出迭代器进入目标容器