我正在尝试将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); });

另外,请考虑更换
  • reserveresize
  • push_back或带有直接迭代器的输出迭代器进入目标容器
  • 07-28 02:10
    查看更多