2014-02-12 5 views
1

Я пытаюсь понизить аудио .wav с 22050 до 8000 с помощью AudioInputStream, но преобразование возвращает мне 0 байтов данных. Вот код:Java - понижающая дискретизация с 22050 до 8000 дает нулевые байты

AudioInputStream ais; 
AudioInputStream eightKhzInputStream = null; 
ais = AudioSystem.getAudioInputStream(file); 
if (ais.getFormat().getSampleRate() == 22050f) { 
    AudioFileFormat sourceFileFormat = AudioSystem.getAudioFileFormat(file); 
    AudioFileFormat.Type targetFileType = sourceFileFormat.getType(); 
    AudioFormat sourceFormat = ais.getFormat(); 
    AudioFormat targetFormat = new AudioFormat(
     sourceFormat.getEncoding(), 
     8000f, 
     sourceFormat.getSampleSizeInBits(), 
     sourceFormat.getChannels(), 
     sourceFormat.getFrameSize(), 
     8000f, 
     sourceFormat.isBigEndian()); 
    eightKhzInputStream = AudioSystem.getAudioInputStream(targetFormat, ais); 
    int nWrittenBytes = 0; 
    nWrittenBytes = AudioSystem.write(eightKhzInputStream, targetFileType, file); 

Я уже проверил AudioSystem.isConversionSupported(targetFormat, sourceFormat) и возвращает истину. Есть идеи?

ответ

1

Я только что проверил ваш код с различными аудиофайлами, и все, кажется, работает нормально. Я могу только догадываться, что вы либо тестируете свой код с пустым звуковым файлом (bytes == 0), либо, что файл, который вы пытаетесь преобразовать, не поддерживается системой Java Audio.

Попробуйте использовать другой файл ввода и/или преобразовать файл ввода в совместимый файл, и он должен работать.

Вот основной метод, который работал на меня:

public static void main(String[] args) throws InterruptedException, UnsupportedAudioFileException, IOException { 
    File file = ...; 
    File output = ...; 

    AudioInputStream ais; 
    AudioInputStream eightKhzInputStream = null; 
    ais = AudioSystem.getAudioInputStream(file); 
    AudioFormat sourceFormat = ais.getFormat(); 
    if (ais.getFormat().getSampleRate() == 22050f) { 
     AudioFileFormat sourceFileFormat = AudioSystem.getAudioFileFormat(file); 
     AudioFileFormat.Type targetFileType = sourceFileFormat.getType(); 

     AudioFormat targetFormat = new AudioFormat(
       sourceFormat.getEncoding(), 
       8000f, 
       sourceFormat.getSampleSizeInBits(), 
       sourceFormat.getChannels(), 
       sourceFormat.getFrameSize(), 
       8000f, 
       sourceFormat.isBigEndian()); 
     if (!AudioSystem.isFileTypeSupported(targetFileType) || ! AudioSystem.isConversionSupported(targetFormat, sourceFormat)) { 
       throw new IllegalStateException("Conversion not supported!"); 
     } 
     eightKhzInputStream = AudioSystem.getAudioInputStream(targetFormat, ais); 
     int nWrittenBytes = 0; 

     nWrittenBytes = AudioSystem.write(eightKhzInputStream, targetFileType, output); 
     System.out.println("nWrittenBytes: " + nWrittenBytes); 
    } 
} 
+0

САИ указывает на реальный файл: ais.available() возвращает 26000 или около того, и это стандартный файл WAV. В конце концов, если формат был бы неизвестен для Java Audio System, я бы получил и исключение при запросе AudioInputStream, не так ли? –

+0

Да, вы должны получить исключение на самом деле ... во всяком случае, ваш код работает на моем компьютере, я отправлю рабочий основной метод за второй – Balder

+0

. Я добавил проверку, действительно ли преобразование действительно поддерживается для кода. Попробуйте и посмотрите, если выбрано IllegalStateException или нет. – Balder