Преобразование стерео в моно с использованием TarsosDSP не работает - PullRequest
0 голосов
/ 31 мая 2018

Я хотел бы использовать некоторые функции TarsosDSP для звуковых данных.Входящие данные - стерео, но Tarsos поддерживает только моно, поэтому я попытался перевести их в моно следующим образом, но результат по-прежнему звучит как стереоданные, интерпретируемые как моно, т.е. преобразование через MultichannelToMono, похоже, не имеетэффект, хотя его реализация выглядит хорошо с первого взгляда.

@Test
public void testPlayStereoFile() throws IOException, UnsupportedAudioFileException, LineUnavailableException {
    AudioDispatcher dispatcher = AudioDispatcherFactory.fromFile(FILE,4096,0);
    dispatcher.addAudioProcessor(new MultichannelToMono(dispatcher.getFormat().getChannels(), false));
    dispatcher.addAudioProcessor(new AudioPlayer(dispatcher.getFormat()));
    dispatcher.run();
}

Есть что-то, что я делаю здесь неправильно?Почему процессор MultichannelToMono не передает данные в моно?

1 Ответ

0 голосов
/ 02 июня 2018

Единственный способ, который я нашел, который работает, это использовать аудиосистему Java для выполнения этого преобразования перед отправкой данных в TarsosDSP, похоже, он не правильно преобразовывает размер кадра

Я нашел следующий фрагмент в https://www.experts -exchange.com / questions / 26925195 / java-стерео-в-моно-преобразование-неподдерживаемое-преобразование-ошибка.html , которые я использую для преобразования в моно перед применением более сложных преобразований звука с TarsosDSP.

public static AudioInputStream convertToMono(AudioInputStream sourceStream) {
    AudioFormat sourceFormat = sourceStream.getFormat();

    // is already mono?
    if(sourceFormat.getChannels() == 1) {
        return sourceStream;
    }

    AudioFormat targetFormat = new AudioFormat(
            sourceFormat.getEncoding(),
            sourceFormat.getSampleRate(),
            sourceFormat.getSampleSizeInBits(),
            1,
            // this is the important bit, the framesize needs to change as well,
            // for framesize 4, this calculation leads to new framesize 2
            (sourceFormat.getSampleSizeInBits() + 7) / 8,
            sourceFormat.getFrameRate(),
            sourceFormat.isBigEndian());
    return AudioSystem.getAudioInputStream(targetFormat, sourceStream);
}
...