Изменение высоты звука / темпа во время кодирования с Android MediaCodec

Я использую AudioRecord для получения звука в режиме реального времени с микрофона устройства и кодирую / сохраняю его в файл в фоновом режиме, используя классы MediaCodec и MediaMuxer.

Есть ли способ изменить высоту и (или) темп аудиопотока перед его сохранением в файл?

2 ответа

Под тоном / темпом вы подразумеваете саму частоту или скорость сэмплов? Если это так, то каждый образец должен проецироваться в течение более короткого или более длительного периода времени:

Пример:

    private static byte[] ChangePitch(byte[] samples, float ratio) {

        byte[] result = new byte[(int)(Math.Floor (samples.Length * ratio))];

        for (int i = 0; i < result.Length; i++) {
            var pointer = (int)((float)i / ratio);
            result [i] = samples [pointer];
        }

        return result;
    }

Если вы просто хотите изменить высоту тона, не влияя на скорость, вам нужно прочитать о фазовом вокодере. Это здравая наука, и есть много проектов для достижения этой цели. https://en.wikipedia.org/wiki/Phase_vocoder

Чтобы изменить высоту звука / темп аудиопотока, вам нужно будет самостоятельно сэмплировать его перед кодированием с использованием кодека. Имейте в виду, что вам также нужно изменить метки времени, если вы измените темп потока.

Другие вопросы по тегам