Я работаю над базовой обработкой звука на Java, используя AudioInputStream
. Моя программа может правильно загружать 16-битный целочисленный звук PCM, закодированный двумя дорожками, но не стерео. При представлении файла, который (согласно ffprobe)
Input #0, wav, from XXX:
Duration: 00:00:02.80, bitrate: 1411 kb/s
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, 2 channels, s16, 1411 kb/s
Все в порядке. Однако при предъявлении
Duration: 01:19:15.58, bitrate: 1536 kb/s
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, stereo, s16, 1536 kb/s
(это файл, который я действительно хочу отредактировать), он терпит неудачу с
Exception in thread "main" javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input file
at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)
Кодирование такое же, и маловероятно, что разница в частоте дискретизации вызовет проблему. Похоже, что это исключение вызвано стереофоническим и 2-канальным каналом, но стерео должно быть двухканальным, не так ли?
Я могу воспроизвести эту проблему с помощью
AudioSystem.getAudioInputStream(new File("file under test"));
Вы можете построить соответствующий AudioFormat
вручную и проверить его с помощью isFormatSupported (аудиоформат)
Поддержка 44100 является стандартной в Java, но 48000 более случайна и зависит от ОС компьютера, на котором выполняется код. См. 6.3 Аудио форматы
Audacity хорошо работает как инструмент для преобразования аудиоресурсов, если вы не хотите возиться со сложностями кодирования.