Java Sound API: захват звука с целевого порта - PullRequest
4 голосов
/ 20 мая 2010

Я пишу простое программное обеспечение для потоковой передачи звука по локальной сети. У меня реализованы все сетевые компоненты, но я спотыкаюсь о том, что использую Java Sound API. Я успешно записал звук с микрофона и линейного входа, но я не могу захватить его с каких-либо целевых портов, таких как динамики. У меня вопрос, возможно ли захватить порт назначения Master? Вот фрагмент кода, который работает при инициализации строки.

private boolean startCapture(){
    try{
        DataLine.Info info = new DataLine.Info( TargetDataLine.class, format);
        line = (TargetDataLine)AudioSystem.getLine(info);
        audioBuffer = new byte[bufferSize];
        line.open(format);
        line.start();
        return true;
    }catch(Exception e){
        System.out.println("Exception thrown when capturing audio:\n" + e);
        return false;
    }
}

Выполнение кода, подобного этому, просто использует микрофон в качестве моей линии. Здесь - информация о моей звуковой системе. Наиболее важным, вероятно, является тот факт, что я использую Linux.

Заранее спасибо за любую помощь, которую вы можете мне дать.

Ответы [ 3 ]

1 голос
/ 10 июня 2011

Одна проблема с сетевым звуком заключается в том, что компьютеры на каждом конце могут иметь немного различающиеся частоты дискретизации из-за различий между тактовыми частотами звуковой карты. Компьютерные часы меняются. Если отправляющий компьютер работает медленнее, чем принимающий, тогда, даже если у вас есть буфер, ваш буфер будет медленно очищаться. Если он работает быстрее, вы будете постепенно получать избыток данных. Этот человек попробовал только то, что вы делали, и увидел выбывших. Обратите внимание, что покупка более дорогих звуковых карт уменьшит его проблему, но не решит ее полностью, если он не сделает что-то вроде привязки их к сигналу времени GPS. Ваш обычный случайный пользователь этого не сделает.

Может быть, для коротких передач вы можете сойти с рук. Если вы, например, делаете голос и прекращаете передачу, когда динамик тихий, тогда вы можете синхронизировать свои буферы при повторном запуске. Интересно, что бы это сделало с задержкой. «Правильное» решение требует повторной выборки аудио на принимающей стороне, чтобы справиться с небольшой разницей в частоте дискретизации.

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

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

1 голос
/ 29 марта 2013

Вот способ (не программный способ).

Перейти: Панель управления \ Оборудование и звук \ нажмите на значок звука. Теперь перейдите к записи, щелкните правой кнопкой мыши -> выберите оба - выберите включить, отключенные устройства. Вы найдете значок «Стерео микшер». Сделайте его устройством по умолчанию.

Теперь попробуйте записать звук. Проблема решена.

0 голосов
/ 20 мая 2010

динамики - это SourceDataLine, а не TargetDataLine. Я не понимаю, как можно "захватить" из динамика?

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