Прежде всего, вам нужно будет выводить данные как SourceDataLine
, а не Clip
.Clip
не может воспроизводиться, пока не получит весь звуковой файл.
Обычный план - прочитать строку ввода любым способом и преобразовать ее в нужный формат в цикле, вызывающем sdl.write.() метод.
Что-то в следующих строках должно работать, для входящих данных
while(playerRunning)
{
readBuffer = getInputPCM();
audioBytes = convertToFollowAudioFormat(readBuffer);
sourceDataLine.write(audioBytes, 0, sdlBufferSize);
}
Если ваши входящие данные являются плавающими, в диапазоне от -1 до 1, и вы выводите вБазовый формат «Качество CD» Java (44100 fps, 16-битный, стерео, little-endian), тогда преобразование может выглядеть следующим образом:
for (int i = 0, n = buffer.length; i < n; i++)
{
buffer[i] *= 32767;
audioBytes[i*2] = (byte) buffer[i];
audioBytes[i*2 + 1] = (byte)((int)buffer[i] >> 8 );
}
return audioBytes;
В зависимости от формы вашего PCM, вы можете иметьсделать немного больше или меньше.Например, если вы читаете целые или краткие значения в диапазоне от -32767 до 32767, то шаг умножения не требуется.
Чтобы получить SourceDataLine
, выводящий аудиоформат "CD Quality" на аудио линию по умолчанию:
AudioFormat audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
44100, 16, 2, 4, 44100, false);
Info info = new DataLine.Info(SourceDataLine.class, audioFormat);
SourceDataLine sdl = (SourceDataLine)AudioSystem.getLine(info);
Что касается вашего метода getInputPCM
, я предполагаю, что вы можете представлять только данные PCM в потоке, и нет необходимости в дальнейшем разборе.Если вы хотите выполнить задачу преобразования PCM в байты в C # перед отправкой, это также вполне допустимо.
Более подробно о различных выходных форматах написано в семпловом пакете учебника Java . AudioCue , который является своего рода суперподобным Clip
.