无法从AudioInputStream中读取单个字节

时间:2015-09-09 19:45:21

标签: java audio

我尝试使用javax.sound library.

更改wav文件的采样率

在实施我希望的方法后,我尝试了它,它工作了! 但是创建的.wav文件只有几个字节大。确切地说它是从最初的~50 MB只有2.090字节

问题是,Java无法从我打开的AudioInputStream读取单个字节。

仅供参考,使用过的文件是使用JLayer转换mp3文件的产品。它工作正常,JLayer没有问题,但我想如果我发布我的整个源代码会更好。注意:我使用了许多System.out.printlns进行日志记录。

所以一开始我导入了所有需要的库,你可以看到我也导入了JLayer。

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

import javax.sound.sampled.*;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.JOptionPane;

import javazoom.jl.converter.Converter;
import javazoom.jl.decoder.JavaLayerException;

public class MyConverter {

    private static AudioInputStream lowResAis = null;
    private static AudioInputStream audioInputStream = null;

设置完这些全局常量后,我正在编写我的主要部分,并预先选择了一个演示文件用于测试目的。

    public static void main(String[] args) {
        MyConverter converterdemo = new MyConverter();
        String wavfilepath = "C:\\Users\\JohnDoe\\Desktop\\Second Nature.wav";
        File f = new File(wavfilepath);
        converterdemo.convertMp3toWav("C:\\Users\\JohnDoe\\Desktop\\Second Nature.mp3", "C:\\Users\\JohnDoe\\Desktop\\Second Nature.wav");
        converterdemo.compressWavFile(wavfilepath);
        converterdemo.writeToSoundFile(f);
        System.out.println("Everything worked!");
    }

这是我的转换方法

public void convertMp3toWav(String sourcefilename, String targetfilename){
        Converter con = new Converter();
        try {
            con.convert(sourcefilename, targetfilename);
            System.out.println("Wav File converted!");
        } catch (JavaLayerException e) {
            this.showOptionPane("Could not convert by using JLayer!");
        }
    }

转换方法很好(相信我的音频文件没有问题),但这是方法,我担心一点点

添加此行后:System.out.println(AudioSystem.getAudioFileFormat(audioInputStream).getByteLength());

我收到以下错误:java.io.IOException: cannot read a single byte if frame size > 1

我无法从自己的Stream中读取。

public void compressWavFile(String sourcefilename){
        try {
            InputStream musicfile = new BufferedInputStream(new FileInputStream(sourcefilename));
        audioInputStream = AudioSystem.getAudioInputStream(musicfile);
            AudioFormat format = audioInputStream.getFormat();
            AudioFormat outDataFormat = new AudioFormat((float) 22000.0,
                    (int) 16, (int) 1, true, false);
            if(AudioSystem.isConversionSupported(outDataFormat, format)){
                System.out.println("Conversion Supported!");
                lowResAis = AudioSystem.getAudioInputStream(outDataFormat, audioInputStream);
            }
            System.out.println("low res created!");
        } catch (UnsupportedAudioFileException e) {
            this.showOptionPane("Audio File not Supported!"); e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

我故意没有使用try with resource,因为一些巫术,新创建的AudioInputStream在关闭原始audioInputStream后也会关闭,而public void writeToSoundFile(File out){ if(AudioSystem.isFileTypeSupported( AudioFileFormat.Type.WAVE, lowResAis)){ try { AudioSystem.write(lowResAis, AudioFileFormat.Type.WAVE, out); System.out.println("New wav file written!"); } catch (IOException e) { e.printStackTrace(); this.showOptionPane("Could not write to new Audio File!"); } } try { System.out.println("closing stream!"); lowResAis.close(); audioInputStream.close(); } catch (IOException e) { this.showOptionPane("Could not close Audio Stream!"); e.printStackTrace(); } } 现在是一个静态变量。

AudioInputStream

最后一位仅用于将新创建的File写入给定的thread safe。我也不认为这里可能出现任何问题。

我真的认为我的AudioInputStreams存在问题,因为这是唯一可能出错的地方。

编辑:

我添加了一个新的“showOptionPane”方法,以便始终保持private void showOptionPane(String msg){ SwingUtilities.invokeLater(new Runnable(){ @Override public void run() { JOptionPane.showMessageDialog(null, msg, "Error", JOptionPane.ERROR_MESSAGE); } }); }

MyType *var[size];

0 个答案:

没有答案