Я пытаюсь воспроизвести аудио-буфер с использованием Java в Linux.
При попытке открыть линию я получаю следующее исключение (не при записи звука в нее) ...
Exception in thread "main" java.lang.IllegalArgumentException: No line matching interface SourceDataLine supporting format PCM_FLOAT 44100.0 Hz, 16 bit, mono, 2 bytes/frame, is supported.
public boolean open()
{
try {
int smpSizeInBits = bytesPerSmp * 8;
int frameSize = bytesPerSmp * channels; // just an fyi, frameSize does not always == bytesPerSmp * channels for non PCM encodings
int frameRate = (int)smpRate; // again this might not be the case for non PCM encodings.
boolean isBigEndian = false;
AudioFormat af = new AudioFormat(AudioFormat.Encoding.PCM_FLOAT , smpRate, smpSizeInBits, channels, frameSize, frameRate, isBigEndian);
DataLine.Info info = new DataLine.Info(SourceDataLine.class, af);
int bufferSizeInBytes = bufferSizeInFrames * channels * bytesPerSmp;
line = (SourceDataLine) AudioSystem.getLine(info);
line.open(af, bufferSizeInBytes);
open = true;
}
catch(LineUnavailableException e) {
System.out.println("PcmFloatPlayer: Unable to open, line unavailble.");
}
return open;
}
Мне интересно, действительно ли мои предположения о кодировке PCM_FLOAT неверны.
У меня есть код, который читает в файле wav.Wavfile - это моно, 16 бит, несжатый формат.Затем я преобразовываю аудио в числа с плавающей запятой в диапазоне от -1,0 до 1,0 для обработки.
Я предположил, что кодировка PCM_FLOAT - это просто необработанные данные PCM, которые были преобразованы в значения с плавающей запятой в диапазоне от -1,0 до 1,0.Правильно ли это?
Затем я предположил, что SourceDataLine преобразует аудио с плавающей точкой в соответствующий формат на основе моей информации о переданном формате (моно, 16 бит, 2 байта / кадр).Опять же, это предположение неверно?
Должен ли я преобразовать звук с плавающей запятой -1.0 в 1.0 обратно в желаемый формат вывода и установить для SourceDataLine значение PCM_SIGNED (при условии, что это мой требуемый формат)?
РЕДАКТИРОВАТЬ:
Кроме того, когда я вызвал AudioSystem.getTargetEncodings (), с PCM_FLOAT, он возвращает три кодировки.Означает ли это, что он примет PCM_FLOAT и сможет конвертировать в возвращенные кодировки, основываясь на том, что поддерживает соответствующая аудиосистема?
AudioFormat.Encoding[] encodings = AudioSystem.getTargetEncodings(AudioFormat.Encoding.PCM_FLOAT);
for(AudioFormat.Encoding e : encodings)
System.out.println(e);
приводит к ...
PCM_SIGNED PCM_UNSIGNED PCM_FLOAT