Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中从字节数组编写WAV文件_Java - Fatal编程技术网

如何在Java中从字节数组编写WAV文件

如何在Java中从字节数组编写WAV文件,java,Java,我想开发一个简单的java音乐播放器,使用这个Sonic算法来加速和播放音乐。这是主类:。java只是调用Sonic.java,然后它就可以播放音乐了。尽管它在运行WAV文件时工作得很好,但我想要的是从加速的输入流中编写一个新的WAV文件 我尝试在Main.java的do while循环中将字节写入ByteArrayOutputStream,并将它们转换为本地WAV文件,同时生成的音乐被切断,显然在此过程中会丢失一些数据 public class App { private static vo

我想开发一个简单的java音乐播放器,使用这个Sonic算法来加速和播放音乐。这是主类:。java只是调用Sonic.java,然后它就可以播放音乐了。尽管它在运行WAV文件时工作得很好,但我想要的是从加速的输入流中编写一个新的WAV文件

我尝试在Main.java的do while循环中将字节写入ByteArrayOutputStream,并将它们转换为本地WAV文件,同时生成的音乐被切断,显然在此过程中会丢失一些数据

public class App {

private static void runSonic(
        AudioInputStream audioStream,
        SourceDataLine line,
        float speed,
        float pitch,
        float rate,
        float volume,
        boolean emulateChordPitch,
        int quality,
        int sampleRate,
        int numChannels) throws IOException
{
    Sonic sonic = new Sonic(sampleRate, numChannels);
    int bufferSize = line.getBufferSize();
    byte inBuffer[] = new byte[bufferSize];
    byte outBuffer[] = new byte[bufferSize];
    int numRead,numWritten;
    AudioFormat af = audioStream.getFormat();
    ByteArrayOutputStream output = new ByteArrayOutputStream();

    sonic.setSpeed(speed);
    sonic.setPitch(pitch);
    sonic.setRate(rate);
    sonic.setVolume(volume);
    sonic.setChordPitch(emulateChordPitch);
    sonic.setQuality(quality);
    int count = 0;
    do {
        numRead = audioStream.read(inBuffer, 0, bufferSize);
        if(numRead <= 0) {
            sonic.flushStream();
        } else {
            sonic.writeBytesToStream(inBuffer, numRead);
        }
        do {
            numWritten = sonic.readBytesFromStream(outBuffer, bufferSize);
            if(numWritten > 0) {
                line.write(outBuffer, 0, numWritten);
                output.write(outBuffer);
            }
        } while(numWritten > 0);
    } while(numRead > 0);


    byte fileBuffer[] = output.toByteArray();

    ByteArrayInputStream bais1 = new ByteArrayInputStream(fileBuffer);

    AudioInputStream aisAccelerated1 =
            new AudioInputStream(bais1, af, fileBuffer.length);
    try {
        AudioSystem.write(aisAccelerated1, AudioFileFormat.Type.WAVE, new
                File("newFile.wav")
        );
    }
    catch(Exception e) {
        e.printStackTrace();
    }
}

public static void main(
        String[] argv) throws UnsupportedAudioFileException, IOException, LineUnavailableException
{
    float speed = 1.5f;
    float pitch = 1.5f;
    float rate = 1.0f;
    float volume = 1.0f;
    boolean emulateChordPitch = false;
    int quality = 0;
    String fileName = "file.wav";

    AudioInputStream stream = AudioSystem.getAudioInputStream(new File(fileName));
    AudioFormat format = stream.getFormat();
    int sampleRate = (int)format.getSampleRate();
    int numChannels = format.getChannels();
    SourceDataLine.Info info = new DataLine.Info(SourceDataLine.class, format,
            ((int)stream.getFrameLength()*format.getFrameSize()));
    SourceDataLine line = (SourceDataLine)AudioSystem.getLine(info);
    line.open(stream.getFormat());
    line.start();
    runSonic(stream, line, speed, pitch, rate, volume, emulateChordPitch, quality,
            sampleRate, numChannels);
    line.drain();
    line.stop();
}
公共类应用程序{
私有静态无效runSonic(
音频输入流音频流,
源数据线,
浮动速度,
浮球,
浮动汇率,
浮动量,
布尔音高,
国际质量,
int采样器,
int numChannels)引发IOException
{
Sonic Sonic=新的Sonic(采样器、数字通道);
int bufferSize=line.getBufferSize();
字节inBuffer[]=新字节[bufferSize];
字节溢出器[]=新字节[bufferSize];
int numRead,numwrited;
AudioFormat af=audioStream.getFormat();
ByteArrayOutputStream输出=新建ByteArrayOutputStream();
音速设置速度(速度);
音速设定音高(音高);
声波凝固速率(速率);
音速设定音量(音量);
sonic.setChordPitch(模拟回声音高);
音质;
整数计数=0;
做{
numRead=audioStream.read(inBuffer,0,bufferSize);
if(numRead 0){
行写入(突发,0,numwrited);
输出。写入(突发);
}
}而(numwrited>0);
}而(numRead>0);
byte fileBuffer[]=output.toByteArray();
ByteArrayInputStream bais1=新的ByteArrayInputStream(文件缓冲区);
音频输入流已加速1=
新的音频输入流(bais1,af,fileBuffer.length);
试一试{
AudioSystem.write(AISCAlerated1,AudioFileFormat.Type.WAVE,新版本
文件(“newFile.wav”)
);
}
捕获(例外e){
e、 printStackTrace();
}
}
公共静态真空总管(
字符串[]argv)引发不支持的DaudioFileException、IOException、LineUnavailableException
{
浮动速度=1.5f;
浮动节距=1.5f;
浮动率=1.0f;
浮子体积=1.0f;
布尔值=假;
int-quality=0;
字符串fileName=“file.wav”;
AudioInputStream=AudioSystem.getAudioInputStream(新文件(文件名));
AudioFormat=stream.getFormat();
int sampleRate=(int)format.getSampleRate();
int numChannels=format.getChannels();
SourceDataLine.Info=newdataline.Info(SourceDataLine.class,format,
((int)stream.getFrameLength()*format.getFrameSize());
SourceDataLine=(SourceDataLine)AudioSystem.getLine(info);
line.open(stream.getFormat());
line.start();
runSonic(流、线、速度、音高、速率、音量、音高、质量、,
取样器,数字通道);
line.drain();
line.stop();
}
}

谁能告诉我这里发生了什么?我认为存储在Exputffer中的所有字节都是以这种方式写入输出流的

您可以使用上面的链接找到整个类

output.write(outBuffer);
问题就在这里。应该是

output.write(outBuffer, 0, numWritten);

您正在向输出写入垃圾。

请提供问题中的所有相关代码,而不是通过链接。如果代码太多,试着缩小范围。这可能会有帮助:谢谢你,它现在演奏得很好!