Насколько я знаю, звуковой интерфейс Java не конвертируется в RAW-аудио. Он конвертирует в WAV, который является RAW аудио с 44-байтовым заголовком . Когда вы поймете это, вы сможете разбить проблему на 2 части:
1. Конвертируйте аудио из любого формата в формат WAV.
Приведенный ниже пример кода был протестирован только из WAV в WAV (другой формат аудио), но теоретически при вызове AudioSystem.getAudioInputStream(audioFormat, originalAudioStream);
должен быть найден соответствующий код c, если он есть.
Этот метод преобразует аудиобайты в заданный формат и выдает результат байта [] в виде WAV.
private static final AudioFormat EXAMPLE_FORMAT = new AudioFormat(
16_000,
16,
1,
true,
false
);
public byte[] formatAudioToWav(@NotNull final byte[] audioFileContent,
@NotNull final AudioFormat audioFormat) throws
IOException,
UnsupportedAudioFileException {
try (
final AudioInputStream originalAudioStream = AudioSystem.getAudioInputStream(new ByteArrayInputStream(audioFileContent));
final AudioInputStream formattedAudioStream = AudioSystem.getAudioInputStream(audioFormat, originalAudioStream);
final AudioInputStream lengthAddedAudioStream = new AudioInputStream(formattedAudioStream, audioFormat, audioFileContent.length);
final ByteArrayOutputStream convertedOutputStream = new ByteArrayOutputStream()
) {
AudioSystem.write(lengthAddedAudioStream, AudioFileFormat.Type.WAVE, convertedOutputStream);
return convertedOutputStream.toByteArray();
}
}
2. Уберите заголовок из файла WAV, созданного на шаге 1.
public byte[] formatWavToRaw(@NotNull final byte[] audioFileContent) {
return Arrays.copyOfRange(audioFileContent, 44, audioFileContent.length);
}
Примечания
- Преимущество кода заключается в правильном закрытии всех потоков, но у него есть недостаток в работе с byte [] напрямую, поэтому он не будет хорошо работать с большими файлами. Его можно преобразовать в чистые потоки, но обратите внимание, что вам нужна длина одного из потоков в вызове
new AudioInputStream(formattedAudioStream, audioFormat, audioFileContent.length);
. - Другим недостатком является то, что, даже если код разборчив, есть 3 AudioInputStream, которые необходимо создать / обернуть, чтобы сделать эту работу, что несколько запутанно. Мне не удалось найти лучшего решения.
Дальнейшее чтение