32-битное аудио в 24-битное - PullRequest
2 голосов
/ 30 ноября 2011

Я пытаюсь преобразовать 32-битные аудиоданные в 24-битное аудио.Однако, когда я пытаюсь играть в нее, я слышу только шум.Кажется, я упускаю что-то очень простое?

Это должно быть little endian raw 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 Ответ

2 голосов
/ 30 ноября 2011

Если вход также 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); });

Также рассмотрите возможность замены

  • reserve с resize
  • push_back или выходной итератор с прямым итератором в целевой контейнер
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...