Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2013, 17:44   #1
vlad1280
 
Регистрация: 14.04.2013
Сообщений: 6
По умолчанию Трансляция звука

Возникла проблема, нужно передать звук с микрофона на сервере всем клиентам, сделать своего рода радио.
Как выглядит само получение массива байтов с микрофона и последующее его прочтение с воспроизведением ?

Пробовал написать, но не работает ничего. Вот код работающий без передачи.

Код:
  
System.out.println("Прослушивание приёма звука с микрофона");
DataLine.Info micInfo = new DataLine.Info(TargetDataLine.class, format);
TargetDataLine mic = (TargetDataLine) AudioSystem.getLine(micInfo);
mic.open(format);
byte tmpBuff[] = new byte[1024*format.getFrameSize()];
mic.start();
while(outVoice) {
  int count = mic.read(tmpBuff,0,tmpBuff.length);
  if (count > 0) baos.write(tmpBuff, 0, count);
}
mic.drain();
mic.close();
System.out.println("Стоп");
Код:
//код метода для задания формата
private AudioFormat getAudioFormat() {
    float sampleRate = 44100.0F;
    int sampleSizeBits = 16;
    int channels = 2;
    boolean signed = true;
    boolean bigEndian = false;
    return (new AudioFormat(sampleRate, sampleSizeBits, channels, signed, bigEndian));
}
Код:
System.out.println("Прослушивание передачи звука");
DataLine.Info speakerInfo = new DataLine.Info(SourceDataLine.class, format);
SourceDataLine speaker = (SourceDataLine) AudioSystem.getLine(speakerInfo);
speaker.open(format);
speaker.start();
while(inVoice) { 
  byte[] data = baos.toByteArray();
  baos.reset();
  ByteArrayInputStream bais = new ByteArrayInputStream(data);
  AudioInputStream ais = new AudioInputStream(bais,format,data.length);
  int numBytesRead = format.getFrameSize()*1024;
  if ((numBytesRead = ais.read(data)) != -1) speaker.write(data, 0, numBytesRead);
  ais.close();
  bais.close();
}
  speaker.drain();
  speaker.close();
  System.out.println("Стоп");
Коды после того как сделал передачу с сервера клиентам:
Клиент
Код:
...
ObjectOutputStream oos = new ObjectOutputStream(client.getOutputStream());
ObjectInputStream ois = new ObjectInputStream(client.getInputStream());
            
DataLine.Info speakerInfo = new DataLine.Info(SourceDataLine.class, format);
SourceDataLine speaker = (SourceDataLine) AudioSystem.getLine(speakerInfo);
speaker.open(format);
speaker.start();
while(inVoice) { 
  byte[] data = baos.toByteArray();
  ByteArrayInputStream bais = new ByteArrayInputStream(data);
                
  AudioInputStream ais = new AudioInputStream(bais,format,data.length);
  int numBytesRead = format.getFrameSize()*1024;
  if ((numBytesRead = ois.read(data)) != -1) 
    speaker.write(data, 0, numBytesRead);
  ais.close();
  bais.close();
}
speaker.drain();
speaker.close();
System.out.println("Стоп");
ois.close();
oos.close();
Сервер:
Код:
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
	   
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());

System.out.println("Прослушивание приёма звука");
DataLine.Info micInfo = new DataLine.Info(TargetDataLine.class, format);
TargetDataLine mic = (TargetDataLine) AudioSystem.getLine(micInfo);
mic.open(format);

byte tmpBuff[] = new byte[1024*format.getFrameSize()];
mic.start();
while(outVoice) {
  int count = mic.read(tmpBuff,0,tmpBuff.length);
  if (count > 0) oos.write(tmpBuff, 0, count);
}

mic.drain();
mic.close();
ois.close();
oos.close();
socket.close();

Последний раз редактировалось vlad1280; 14.04.2013 в 18:12.
vlad1280 вне форума Ответить с цитированием
Старый 15.04.2013, 21:48   #2
vlad1280
 
Регистрация: 14.04.2013
Сообщений: 6
По умолчанию

Всё исправил, работает, было пару тупейших ошибок.
vlad1280 вне форума Ответить с цитированием
Старый 26.04.2013, 13:36   #3
surkis
Новичок
Джуниор
 
Регистрация: 26.04.2013
Сообщений: 1
По умолчанию

сам задал вопрос, сам ответил )))
surkis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Аудио трансляция павел1111 Свободное общение 4 17.03.2013 11:45
Одновременная трансляция Green4el Свободное общение 0 25.02.2013 15:33
раздельная трансляция denrubun Общие вопросы C/C++ 3 02.02.2013 02:50
Трансляция звука по локальной сети (UDP и BASS.DLL) cactus628 Работа с сетью в Delphi 10 04.12.2012 14:32
Трансляция арифметических выражений StakanpORTvejna Microsoft Office Excel 2 12.03.2009 05:57