【问题标题】:Is it possible to split left and right channel from audio sample in SFML?是否可以从 SFML 中的音频样本中分离左声道和右声道?
【发布时间】:2018-07-26 01:11:15
【问题描述】:

我正在使用const sf::Int16* samples = buffer.getSamples(); 来收集数组中的所有音频样本。我的 sample.wav 文件是每个样本 16 位。从here我看到前8位对应于左声道,后8位对应于右声道。

我目前正在使用samples[i] 访问样本,但这会返回一个整数值。我应该如何继续拆分频道?

【问题讨论】:

    标签: c++ audio sfml sample


    【解决方案1】:

    每个样本都是一个 16 位的值;它不是两个 8 位值。

    通道是交错的。 这意味着 - 在双声道声音样本中 - 第一个样本(16 位值)是左声道,第二个是右声道,第三个是左声道,第四个是右声道,依此类推。

    以下代码将单个立体声缓冲区 (originalBuffer) 拆分为两个单独的单声道缓冲区 (leftBufferrightBuffer):

    sf::SoundBuffer originalBuffer;
    // set up original buffer here - assumed to be stereo during this example
    const sf::Int16* originalSamples{ originalBuffer.getSamples() };
    const sf::Uint64 sizeOfSingleChannel{ originalBuffer.getSampleCount() / 2u };
    sf::Int16* leftSamples{ new sf::Int16[sizeOfSingleChannel] };
    sf::Int16* rightSamples{ new sf::Int16[sizeOfSingleChannel] };
    for (sf::Uint64 i{ 0u }; i < sizeOfSingleChannel; ++i)
    {
        leftSamples[i] = originalSamples[i * 2u];
        rightSamples[i] = originalSamples[i * 2u + 1u];
    }
    sf::SoundBuffer leftBuffer;
    sf::SoundBuffer rightBuffer;
    leftBuffer.loadFromSamples(leftSamples, sizeOfSingleChannel, 1u, originalBuffer.getSampleRate());
    rightBuffer.loadFromSamples(rightSamples, sizeOfSingleChannel, 1u, originalBuffer.getSampleRate());
    

    【讨论】:

      【解决方案2】:

      当然,使用位运算符很容易:

      int main() {
          uint16_t number = 0xfacb;                                        // decimal: 64203
          uint8_t low_byte = static_cast<uint8_t>(number & 0xFF);          // low byte: 203
          uint8_t high_byte = static_cast<uint8_t>((number & ~0xFF) >> 8); // high byte: 250
      
          std::cout << std::bitset<16>(number) << " " << std::bitset<8>(high_byte) << " " << std::bitset<8>(low_byte) << "\n"; 
          std::cout << number << " " << static_cast<unsigned short>(high_byte) << " " << static_cast<unsigned short>(low_byte) << "\n"; 
      }
      

      请记住将按位运算的结果分配给您的 8 位数字类型。

      Live demo.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-01
        • 2019-01-28
        • 1970-01-01
        • 2018-06-03
        • 1970-01-01
        相关资源
        最近更新 更多