【发布时间】:2018-07-26 01:11:15
【问题描述】:
我正在使用const sf::Int16* samples = buffer.getSamples(); 来收集数组中的所有音频样本。我的 sample.wav 文件是每个样本 16 位。从here我看到前8位对应于左声道,后8位对应于右声道。
我目前正在使用samples[i] 访问样本,但这会返回一个整数值。我应该如何继续拆分频道?
【问题讨论】:
我正在使用const sf::Int16* samples = buffer.getSamples(); 来收集数组中的所有音频样本。我的 sample.wav 文件是每个样本 16 位。从here我看到前8位对应于左声道,后8位对应于右声道。
我目前正在使用samples[i] 访问样本,但这会返回一个整数值。我应该如何继续拆分频道?
【问题讨论】:
每个样本都是一个 16 位的值;它不是两个 8 位值。
通道是交错的。 这意味着 - 在双声道声音样本中 - 第一个样本(16 位值)是左声道,第二个是右声道,第三个是左声道,第四个是右声道,依此类推。
以下代码将单个立体声缓冲区 (originalBuffer) 拆分为两个单独的单声道缓冲区 (leftBuffer 和 rightBuffer):
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());
【讨论】:
当然,使用位运算符很容易:
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 位数字类型。
【讨论】: