2015-12-20 4 views
0

Я пытаюсь создать «микшерный пульт» в JAVA. В этом микшере каждый «слайдер» будет строкой, как если бы это была физическая консоль микширования. Но после моего поиска на Goo *** и прочитал oracle documentation, я действительно ничего не нашел, чтобы помочь мне.Принимая управление soundCard с помощью JAVA

Во-первых, я перечисляю доступные смесители (см. Код в конце) и, к счастью, он перечисляет все мои звуковые карты и находит строку и линию. Но тогда, что я должен делать?

Моя цель - создать «виртуальную линию», которая будет захватывать звук из любой линии (микрофона) или линейного выхода (захват звука, воспроизводимого в VLC), что позволяет мне «работать с ним», а затем повторно вводить это в другой строке. Конечно, мне придется установить для каждой строки, которая является «в» и который является «из» Примеры использования:

  • 3 физических линий в (микрофоны) было бы поймать, то «уровень отредактирован », а затем повторно внедрен в виртуальную линию, которая будет называться« хором », и эта виртуальная линия будет повторно перенесена в мою основную физическую линию, называемую« Master level ».

  • песня, которую играет VLC (например, мелодия песни), которая обычно отправляется на главный «выход», как «перехват». Затем я решил установить уровень перед его повторным запуском в моем Мастера и смешать его с микрофоном. Таким образом, это позволит мне настроить уровень певца с уровнем музыки.

Итак, кто мог бы помочь мне начать и прогресс? Спасибо за вашу помощь .

Код - список, который отображает мои миксеры:

import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.Control; 
import javax.sound.sampled.Line; 
import javax.sound.sampled.Mixer; 

public class Mixers { 

Mixers() {  
    try { 
     //List of the mixers from the system 
     Mixer.Info[] mixerInfo = AudioSystem.getMixerInfo(); 
     //Characteristics of each mixer 
     for (Mixer.Info info : mixerInfo) { 
      System.out.println("\n"+info+ " - Description : "+info.getDescription()); 
      Mixer mix=AudioSystem.getMixer(info); 

      //Controles available for this mixer 
      for (Control c:mix.getControls()) { 
       System.out.println ("\t Control supported by this mixer : "+c); 
      } 
      //Sources available for this mixer 
      for (Line.Info i : mix.getSourceLineInfo()) { 
       System.out.println("\t Source line available : "+i); 

       //Controls available for this Source 
       for (Control c : AudioSystem.getLine(i).getControls()) { 
        System.out.println ("\t\t ==> Controls supported by this source : "+c); 
       } 
      } 
      // TargeLines available for this mixer 
      for (Line.Info i : mix.getTargetLineInfo()) { 
       System.out.println("\t Target line available : "+i); 

       //Controls available for this Target 
       for (Control c : AudioSystem.getLine(i).getControls()) { 
        System.out.println ("\t\t Controls supported by this target : "+c); 
       } 
      }    
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    }    
} 

}

Еще раз спасибо всем, кто не читал мой пост до конца и дать мне начало решения.

Николя

+0

API-интерфейсы Java звучат только в текущей версии JVM. Они не могут использоваться для перехвата вывода из другой программы. –

+0

Хорошо .. Хорошо. Так что, если я играю звук в JVM с помощью vlcj например? Поскольку это другая тема, я открыл новый вопрос (спасибо, если вы можете прочитать и помочь мне тоже): http://stackoverflow.com/questions/34394960/catching-the-sound-played-with-vlcj –

ответ

0

Я не уверен, что Java Sound API может сделать это. Вероятно, вам стоит взглянуть на гораздо более низкий API, например OpenAL (у Java есть привязки к этому), который обеспечивает больший контроль над звуковыми потоками.

1

Если это можно сделать, я думаю, что следующий шаг, который вы хотите, - это быть в состоянии читать данные из разных микшеров и выполнять операции с «на кадр». Учебное пособие по Java Capturing Audio относится к чтению данных из внешних линий. В учебнике Using Files and Format Converters приведен пример кода, который показывает, как добраться до отдельных кадров. Под заголовком «Чтение звуковых файлов» приведен пример кода. Наиболее важный момент отмечен следующий комментарий:

// Here, do something useful with the audio data that's 
// now in the audioBytes array... 

В вашем случае, вы бы несколько auiodBytes массивов, по одному для каждой строки вы ввод.

Для смешивания данные кадра PCM из разных линий могут быть добавлены вместе. Регулятор громкости между линиями может быть выполнен с использованием множителя, например, коэффициента, который колеблется от 0 (тишина) до 1 (полный объем).

Следует проявлять осторожность, чтобы не менять множитель слишком много в одном кадре, иначе разрыв, введенный в данные, вызывает щелчок. Так что распространяйте любые изменения на несколько кадров. Линейные изменения в множителе не точно соответствуют слышимым уровням звука.Я думаю, что экспоненциальное распределение 3-й степени часто используется для преобразования между линейными значениями и эквивалентными множителями, которые действительно звучат как эти значения. Возможно, вы захотите включить функции min и max для обеспечения того, чтобы данные PCM никогда не выходили за пределы диапазона -1 и 1. Большая часть этого параграфа относится к тонким точкам смешивания и подвержена различным мнениям относительно наилучших практик.

В stackoverflow содержатся другие сообщения о том, как конвертировать из формата байтового потока в PCM и обратно. Насколько мне известно, javax.sound.sampled, источник этого кода, очень сильно зависит от собственного кода и довольно низкого уровня. Я смог много сделать с микшированием таким образом, хотя я полагаюсь на свои собственные источники данных, а не на внешние линии, которые вы пытаетесь сделать. Я не знаю, как управлять этими внешними линиями, особенно если вы хотите, чтобы ваш компьютер не воспроизводил их, пока вы играете в результирующий микс.

+0

Спасибо очень Фил. Я постараюсь шаг за шагом следовать вашим советам. Но я думаю, у меня будет много других вопросов ... –

+0

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

+0

Спасибо, Фил. Как вы пишете, это очень трудно понять и использовать, но кажется здоровым, когда вы знаете, как его использовать. –