32位音频到24位

时间:2011-11-29 22:59:18

标签: c++ audio

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

1 个答案:

答案 0 :(得分:2)

如果输入也是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输出迭代器与直接迭代器放入目标容器