Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.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 使用字节数组创建音频输入流_Java_Arrays_Java Io_Javasound - Fatal编程技术网

Java 使用字节数组创建音频输入流

Java 使用字节数组创建音频输入流,java,arrays,java-io,javasound,Java,Arrays,Java Io,Javasound,我仍在进行用JAVA创建混合控制台的小项目,我遇到了一个新的障碍。 我正在尝试从byteArray创建一个音频输入流,然后,阅读它来听到声音。但我的密码有点错误:我什么也没听到 这是我的密码: import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.OutputStream; import javax.sound.sampled.

我仍在进行用JAVA创建混合控制台的小项目,我遇到了一个新的障碍。 我正在尝试从byteArray创建一个音频输入流,然后,阅读它来听到声音。但我的密码有点错误:我什么也没听到

这是我的密码:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.OutputStream;

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.TargetDataLine;

public class SoudTest {
private SourceDataLine sLine;
private AudioFormat audioFormat;
private AudioInputStream audioInputStream;
private AudioInputStream audioInputStream2;
private ByteArrayOutputStream byteArrayOutputStream= new ByteArrayOutputStream();;
private File file = new File ("test.wav");
private File file2 = new File ("test2.wav");
SoudTest () {
    /*
     * The aim of this code is to test the possibility or creating a mixing console in JAVA like the physical mixing consoles
     * First step : Create an inputstream from a file, a microphone or anything else
     * This is like plugging a source to a line-in of a stripe of a mixing console
     * Second : Reading this input stream and create a byte array
     * This byte array will be sent to the "master output" of the mixing console
     * Question to answer later : how to create a byte array that will act like a buffer for the next steps...
     * Third : Using this byte array to create an audioInputStream
     * This step is like having the "master volume" getting what is sent by the stripe.
     * Fourth : reading this audioInputStream
     * The sound should flow out to the speaker
     */

    //1st step      
    try {
        audioInputStream=AudioSystem.getAudioInputStream(file);

    } catch (Exception e) {
        e.printStackTrace();
    }


    AudioFileFormat.Type targetType = AudioFileFormat.Type.WAVE;

    //2nd step
    try {
        AudioSystem.write(audioInputStream, targetType, byteArrayOutputStream);

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        System.out.println("Finally...");
        //tLine.close();
        System.out.println("Line closed");
        try {
            audioInputStream.close();
            System.out.println("Stream closed.");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /////////////////////////////////////////////////////////////

    //3rd step
    System.out.println("Size of the outputStream : "+byteArrayOutputStream.size());
    byte[] byteArray = byteArrayOutputStream.toByteArray();
    System.out.println("Size of byte array : "+byteArray.length);
    ByteArrayInputStream bis = new ByteArrayInputStream(byteArray);

    audioFormat = new AudioFormat(44100, 16, 2, true, false);
    audioInputStream2=new AudioInputStream(bis, audioFormat, 1024);

    DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat);
    try  {
        //System.out.println(info);
        sLine=(SourceDataLine) AudioSystem.getLine(info);
        System.out.println(sLine.getLineInfo());
    } catch (Exception e) {
        e.printStackTrace();
    }

    try {
        sLine.open(audioFormat);
    } catch (Exception e){
        e.printStackTrace();
    }
    sLine.start();
    System.out.println("Line Started");


    //4th step
    try {
        byte bytes[] =  new byte[1024];
        int bytesRead=0;
        int loop=0;
        while ((bytesRead=audioInputStream2.read(bytes, 0, bytes.length))!= -1) {
            //getVolumeLevel(bytes);
            try {
                sLine.write(bytes, 0, bytesRead);
                System.out.println(loop);
            } catch (Exception e) {
                e.printStackTrace();
            }
            loop+=1;
        }
        System.out.println("No bytes anymore !");

    } catch (Exception e) {
        e.printStackTrace();
    }       
    System.out.println("Line stopped");
}
}

以下是我的控制台中的输出:

最后。。。 线路关闭

小溪关闭了

输出流的大小:35527724

字节数组大小:35527724

接口源数据线支持PCM_签名未知采样率、16位、立体声、4字节/帧、小尾端和0到1000000字节的缓冲区格式

开始排队

0 1. 2. 三,

不再有字节了! 停线

我的原始文件的大小为35.5 Mo,字节数组的长度为35.527.727,因此看起来是可能的。然后,我的“块”数组的大小是1024,所以我预计大约有37700个循环。那么为什么我的“循环计数”停在“3”


我希望我的代码是明确的enouth的评论。谢谢你的帮助;-)

好吧,我想:我很愚蠢。当我创建audioInputStream2时,我没有对最后一个参数进行足够的处理

而不是:
audioInputStream2=新的AudioInputStream(bis,audioFormat,1024)

我应该写:
audioInputStream2=新的AudioInputStream(bis,audioFormat,byteArray.length)