Можно ли разделить левый и правый канал от аудиосэмпла в SFML?

я использую const sf::Int16* samples = buffer.getSamples(); собрать все аудио образцы в массиве. Мой файл sample.wav составляет 16 бит на семпл. От Вот Я вижу, что первые 8 бит соответствуют левому каналу, а последние — правому.

Я в настоящее время доступ к образцам с помощью samples[i] но это возвращает целочисленное значение. Как мне действовать, чтобы разделить каналы?

1

Решение

Каждый образец представляет собой одно 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());
1

Другие решения

Конечно, с помощью побитовых операторов это легко:

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 бит.

Живая демо.

0

По вопросам рекламы [email protected]