当前位置: 首页 > 知识库问答 >
问题:

AudioSystem Write,AudioInputStream,从InputStream获得的修改字节

窦凯定
2023-03-14

我从InputStream中获取字节,但需要修改并保存到Wav文件中。

AudioFormat adfmt = new AudioFormat(8000.0f, 8, 1, true , true);
int bufferSize = (int) adfmt.getSampleRate()* adfmt.getFrameSize();
byte[] buffer = new byte[bufferSize];
Socket clientSocketO = new Socket(...);
OutputStream output = clientSocketO.getOutputStream();

DataLine.Info dlInfo = new DataLine.Info(TargetDataLine.class, adfmt);
TargetDataLine tdLine = (TargetDataLine) AudioSystem.getLine(dlInfo);
tdLine.open(adfmt);
tdLine.start();   // start capturing

boolean bRunningO = true;
while (bRunningO) {
    int count = tdLine.read(buffer, 0, buffer.length);
    if (count > 0) {
        byte[] outgoingBytes = Arrays.copyOf(buffer, count);
        output.write(outgoingBytes);
    }
}
tdLine.flush();
AudioFormat adfmt = new AudioFormat(8000.0f, 8, 1, true , true);
int bufferSize = (int) adfmt.getSampleRate()* adfmt.getFrameSize();
byte[] buffer = new byte[bufferSize];
Socket clientSocketI = new Socket(...);
InputStream input =  clientSocketI.getInputStream();
String fileName = System.getProperty("file.separator") + "SomeFile.wav"
File fileStreamedWav = new File((new File("")).getAbsolutePath() + fileName);
AudioInputStream ais;
ByteArrayInputStream bis;
DataLine.Info dlInfo = new DataLine.Info(SourceDataLine.class, adfmt);
//SourceDataLine sdLine = (SourceDataLine) AudioSystem.getLine(dlInfo);
//sdLine.open(adfmt);
//sdLine.start();   // start playback

AudioFileFormat.Type afType = AudioFileFormat.Type.WAVE;
boolean bRunningI = true;
while (bRunningI) {
    try {
        int read = input.read(buffer); //Socket Reading bytes
        byte[] incomingBytes;
        if (read > 0) {
            incomingBytes = Arrays.copyOf(buffer, read);
            if (incomingBytes!= null) {
                //sdLine.write(incomingBytes, 0, incomingBytes.length);

                //Same Size bytes, but isn't necessary submit the put Code
                byte[] changedBytes = MethodChangerBytes(incomingBytes);
                bis = new ByteArrayInputStream(changedBytes);
                ais = new AudioInputStream(bis, adfmt, 
                    changedBytes.length/adfmt.getFrameSize());
                int W = AudioSystem.write(ais, afType, fileStreamedWav);
                System.out.println("AudioSystem.write:" + W);
            }
        }
    } catch (IOException e) {
        bRunningI = false;
    }
}
byte[] MethodChangerBytes(byte[] incoming) {
    byte[] outgoing = new byte[incoming.length];
    for (int i = 0; i < incoming.length; i ++) {
        // Really is not important what happens here
        double Sample = (double)(short)(((incoming[i] - 128) & 0xFF) << 8);
        Sample *= 2.0;
        outgoing[i] = (byte)(((int()Sample >> 8) + 128) & 0xFF);
    }
    return outgoing;
}

AudioInputStream(InputStream流,AudioFormat格式,长长度)

AudioSystem.write(AudioInputStream stream,AudioFileFormat.type fileType,File out)

问题是:

共有1个答案

云星波
2023-03-14

有一个缓冲区:

ByteArrayOutputStream outputStream=new ByteArrayOutputStream();

写到这个缓冲区,然后将写移到循环之外;当读取所有字节时,保存:

boolean bRunningI = true;
try {
while (bRunningI) {
    int read = input.read(buffer); //Socket Reading bytes
    byte[] incomingBytes;
    if (read > 0) {
        incomingBytes = Arrays.copyOf(buffer, read);
        if (incomingBytes!= null) {
            //sdLine.write(incomingBytes, 0, incomingBytes.length);

            //Same Size bytes, but isn't necessary submit the put Code
            byte[] changedBytes = MethodChangerBytes(incomingBytes);
            outputStream.write(changedBytes, 0, changedBytes.length);
        }
    }
}
byte[] allBytes=outputStream.toByteArray();
bis = new ByteArrayInputStream(allBytes);
ais = new AudioInputStream(bis, adfmt, 
                changedBytes.length/adfmt.getFrameSize());
int W = AudioSystem.write(ais, afType, fileStreamedWav);
System.out.println("AudioSystem.write:" + W);
} catch (IOException e) {
    bRunningI = false;
}
 类似资料:
  • 问题内容: 我用于将Image存储到。 我想 修改 该 文件的名称 得到保存到服务器之前的文件。 我也想在保存之前将其转换为其他缩略图形式。 这是我的工作方式。 在客户端 在服务器端,我收到查询“ params”,但未获取“文件名” 我的存储型号名称是 如何更改要保存在服务器上的文件的文件名? 问题答案: 我想到了。 我们必须定义一个自定义函数 的getFileName 在。 假设我的 数据源 的

  • 获得并应用修改 编译qemu还会用到的库文件有 libsdl1.2-dev 等。安装命令如下: sudo apt-get install libsdl1.2-dev # 安装库文件 libsdl1.2-dev 获得 qemu 的安装包以后,对其进行解压缩(如果格式无法识别,请下载相应的解压缩软件)。 例如 qemu.tar.gz/qemu.tar.bz2 文件,在命令行中可以使用: tar

  • 我使用的是改装版2.0b2。收到响应后,我尝试通过以下方式从响应中获取InputStream: 但是这个应用程序一直在扔: 尽管回复正确。我到底做错了什么?

  • 正如在如何使用Jersey拦截器获取请求主体中所讨论的,我正在修改ContainerRequestFilter中的EntityInputStream。 但是,后来我不知道如何访问修改后的InputStream。我可以在资源中获得ServletContext,但我不知道如何获得我在过滤器中实际修改的对象ContainerRequest。 我被困在旧版本的球衣1.8上,所以我不确定这是否是问题的一部分

  • 问题内容: 如何从BufferedImage对象获取InputStream?我尝试了这个,但是ImageIO.createImageInputStream()总是返回NULL 图片缩略图已正确生成,因为我可以成功将 bigImage绘制 到 JPanel 。 谢谢。 问题答案: 如果您尝试将图像保存到文件,请尝试: 如果您只想读取字节,请尝试执行写调用,但将其传递给ByteArrayOutputS

  • 问题内容: 我想从java.io.InputStream读取超时。显然,执行此操作的正确方法是使用java.nio.channels.SelectableChannel和java.nio.channels.Selector。不幸的是,目前尚不清楚如何从InputStream转到SelectableChannel。 InputStream来自非常规来源-http://java.sun.com/pro