Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

オーディオデータの連結

オーディオデータを配列に格納し、それを1つの配列に繋げて
その繋げた配列をオーディオファイルとして保存するプログラムを作りたいのですが
保存ボタンを押して保存してもファイルが生成されないようです。
どのコードが悪いのか見当が付かないので、ご指摘頂けたらと思います。

import java.awt.*;   
import java.awt.event.*;   
import javax.swing.*;   
import java.io.*;   
import javax.sound.sampled.*;
   
public class SampleWriter extends JFrame
{
    private Container cnt;
    private JPanel pn;
    private JButton get1, get2, save;
    private File fl1, fl2, newfile;
    private AudioInputStream ais1, ais2, newais;
    private AudioFormat format1, format2;
    private DataLine.Info info1, info2;
    private SourceDataLine line1, line2, newline;
    private int bufferSize1, bufferSize2;
    private byte buffer1[] = new byte[bufferSize1];
    private byte buffer2[] = new byte[bufferSize2];
    private TargetDataLine newdl;
    private AudioFileFormat.Type targetType;
    private int max1, max2;
    TargetDataLine tar;
    ByteArrayOutputStream bao;
    OutputStream out;
    ByteArrayInputStream input;
    public static void main(String args[])
    {
        new SampleWriter();
    }
    public SampleWriter()
    {
        get1 = new JButton("取得1");
        get2 = new JButton("取得2");
        save = new JButton("保存");
        pn = new JPanel();
        cnt = getContentPane();
        pn.setLayout(new GridLayout(3, 1));
        pn.add(get1);
        pn.add(get2);
        pn.add(save);
        cnt.add(pn);
        setSize(200, 200);
        setVisible(true);
        get1.addActionListener(new SampleActionListener());
        get2.addActionListener(new SampleActionListener());
        save.addActionListener(new SampleActionListener());    
    }
    class SampleActionListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            JFileChooser fc = new JFileChooser();
            try
            {
                if(e.getSource() == get1)
                {
                    fl1 = new File("001.wav");   
                    ais1 = AudioSystem.getAudioInputStream(fl1);   
                    format1 = ais1.getFormat();   
                    info1 = new DataLine.Info(SourceDataLine.class,format1);   
                    line1 = (SourceDataLine) AudioSystem.getLine(info1);  
                    line1.open(format1);   
                    max1 = line1.getBufferSize();
                    ais1.read(buffer1,0,max1);
                }
                else if(e.getSource() == get2)
                {
                    System.out.println("get2");
                    fl2 = new File("002.wav");   
                    ais2 = AudioSystem.getAudioInputStream(fl2);   
                    format2 = ais2.getFormat();   
                    info2 = new DataLine.Info(SourceDataLine.class,format2);   
                    line2 = (SourceDataLine) AudioSystem.getLine(info2);  
                    line2.open(format2);   
                    max2 = line2.getBufferSize();
                    ais2.read(buffer2,0,max2);
                }
                else if(e.getSource() == save)
                {
                    System.arraycopy(buffer2, 0, buffer1, buffer1.length+1, buffer2.length);
                    bao.write(buffer1, 0, buffer1.length);
                    bao.writeTo(out);
                    byte audio[] = bao.toByteArray();
                    input = new ByteArrayInputStream(audio);
                      newais = new AudioInputStream(input, format1,
                        audio.length / format1.getFrameSize());

                    targetType = AudioFileFormat.Type.WAVE;
                        newfile = new File("tesss.wav");
                        AudioSystem.write(newais, targetType, new File("dousuka.wav"));    
                }    
            }
            catch(Exception ex){}
        }
    }
}

13

回答

80510

閲覧

13件の回答

評価

0

キミには無理!

評価

0

どこまで実行できてるのか確かめるために、せめてデバッグコードくらいは入れてみたかね。

というかこのコードは自分で書いたのか?

評価

0

エクセプション出てるのでは?
バッファ1,2のlengthが0とかで。

評価

0

<$さん
ご回答ありがとうございます。
このコードは複数のプログラムとクラスライブラリを参考に書いたものです。
デバッグしてみたところ、buffer1及びbuffer2の配列の格納がうまくいかずに
長さが0になってしまっている模様です。

<nanashiさん
ご回答ありがとうございます。
どのボタンを押しても例外は出てきませんでした。
すみません、maxとbufferSizeを取り違えていたので修正したコードを記載します。
ご指摘の通り、buffer1、buffer2の長さが0になってしまっていました。

import java.awt.*;   
import java.awt.event.*;   
import javax.swing.*;   
import java.io.*;   
import javax.sound.sampled.*;
   
public class SampleWrite extends JFrame
{
    private Container cnt;
    private JPanel pn;
    private JButton get1, get2, save;
    private File fl1, fl2;
    private AudioInputStream ais1, ais2, newais;
    private AudioFormat format1, format2;
    private DataLine.Info info1, info2;
    private SourceDataLine line1, line2;
    private int bufferSize1, bufferSize2;
    private int max1, max2;
    private byte buffer1[] = new byte[bufferSize1];
    private byte buffer2[] = new byte[bufferSize2];
    private AudioFileFormat.Type targetType;
   
    TargetDataLine tar;
    ByteArrayOutputStream bao;
    OutputStream out;
    ByteArrayInputStream input;
    public static void main(String args[])
    {
        new SampleWrite();
    }
    public SampleWrite()
    {
        get1 = new JButton("取得1");
        get2 = new JButton("取得2");
        save = new JButton("保存");
        pn = new JPanel();
        cnt = getContentPane();
        pn.setLayout(new GridLayout(3, 1));
        pn.add(get1);
        pn.add(get2);
        pn.add(save);
        cnt.add(pn);
        setSize(200, 200);
        setVisible(true);
        get1.addActionListener(new SampleActionListener());
        get2.addActionListener(new SampleActionListener());
        save.addActionListener(new SampleActionListener());    
    }
    class SampleActionListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            JFileChooser fc = new JFileChooser();
            try
            {
                if(e.getSource() == get1)
                {
                    fl1 = new File("001.wav");   
                    ais1 = AudioSystem.getAudioInputStream(fl1);   
                    format1 = ais1.getFormat();   
                    info1 = new DataLine.Info(SourceDataLine.class,format1);   
                    line1 = (SourceDataLine) AudioSystem.getLine(info1);  
                    line1.open(format1);   
                    bufferSize1 = line1.getBufferSize();
                    if(bufferSize1 > 0)
                    {
                        System.out.println("get1");
                    }
                    ais1.read(buffer1,0,bufferSize1);
                    if(buffer1.length > 0)
                    {
                        System.out.println("buffer1");
                    }
                
                }
                else if(e.getSource() == get2)
                {
                    
                    fl2 = new File("002.wav");   
                    ais2 = AudioSystem.getAudioInputStream(fl2);   
                    format2 = ais2.getFormat();   
                    info2 = new DataLine.Info(SourceDataLine.class,format2);   
                    line2 = (SourceDataLine) AudioSystem.getLine(info2);  
                    line2.open(format2);   
                    bufferSize2 = line2.getBufferSize();
                    if(bufferSize2 > 0)
                    {
                        System.out.println("get2");
                    }
                    ais2.read(buffer2,0,bufferSize2);
                    if(buffer2.length > 0)
                    {
                        System.out.println("buffer2");
                    }
                }
                else if(e.getSource() == save)
                {
                    System.arraycopy(buffer2, 0, buffer1, buffer1.length+1, buffer2.length);
                    if(buffer1.length > buffer2.length/2)
                    {
                        System.out.println("test");
                    }
                    bao.write(buffer1, 0, buffer1.length);

                    byte audio[] = bao.toByteArray();
                    if(audio.length != 0)
                    {
                        System.out.println("save");
                    }
                    input = new ByteArrayInputStream(audio);
                      newais = new AudioInputStream(input, format1,
                        audio.length / format1.getFrameSize());

                    targetType = AudioFileFormat.Type.WAVE;
                        AudioSystem.write(newais, targetType, new File("test10.wav"));    
                }    
            }
            catch(Exception ex){}
        }
    }
}

評価

0

エクセプション出てても
キャッチして何もしてないからわからない気がします。
後バッファ1,2って宣言時にnewしなくても、
bufferSize1 = line1.getBufferSize();
の後でnew すればいいのでは?

評価

0

>nanashiさん
ご指摘頂いたように、bufferSizeを定義した後に
bufferをnew byte[bufferSize]と記述してみたところ
デバッグコードが表示されました。ありがとうございます!
しかし、saveボタンを押してもデバッグコードが表示されないので
System.arraycopyの作業が出来ていないのかもしれません。
ご指摘頂いたところを書き換え、ais.readとしていたところをline.writeにした修正コードを記載します。

import java.awt.*;   
import java.awt.event.*;   
import javax.swing.*;   
import java.io.*;   
import javax.sound.sampled.*;
   
public class SampleWrite extends JFrame
{
    private Container cnt;
    private JPanel pn;
    private JButton get1, get2, save;
    private File fl1, fl2;
    private AudioInputStream ais1, ais2, newais;
    private AudioFormat format1, format2;
    private DataLine.Info info1, info2;
    private SourceDataLine line1, line2;
    private int bufferSize1, bufferSize2;
    private AudioFileFormat.Type targetType;
    private byte buffer1[], buffer2[];   
    TargetDataLine tar;
    ByteArrayOutputStream bao;
    OutputStream out;
    ByteArrayInputStream input;
    public static void main(String args[])
    {
        new SampleWrite();
    }
    public SampleWrite()
    {
        get1 = new JButton("取得1");
        get2 = new JButton("取得2");
        save = new JButton("保存");
        pn = new JPanel();
        cnt = getContentPane();
        pn.setLayout(new GridLayout(3, 1));
        pn.add(get1);
        pn.add(get2);
        pn.add(save);
        cnt.add(pn);
        setSize(200, 200);
        setVisible(true);
        get1.addActionListener(new SampleActionListener());
        get2.addActionListener(new SampleActionListener());
        save.addActionListener(new SampleActionListener());    
    }
    class SampleActionListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            JFileChooser fc = new JFileChooser();
            try
            {
                if(e.getSource() == get1)
                {
                    fl1 = new File("001.wav");   
                    ais1 = AudioSystem.getAudioInputStream(fl1);   
                    format1 = ais1.getFormat();   
                    info1 = new DataLine.Info(SourceDataLine.class,format1);   
                    line1 = (SourceDataLine) AudioSystem.getLine(info1);  
                    line1.open(format1);   
                    bufferSize1 = line1.getBufferSize();
                    if(bufferSize1 > 0)
                    {
                        System.out.println("get1");
                    }
                    buffer1 = new byte[bufferSize1];
                    line1.write(buffer1,0,bufferSize1);
                    if(buffer1.length > 0)
                    {
                        System.out.println("buffer1");
                    }
                
                }
                else if(e.getSource() == get2)
                {
                    
                    fl2 = new File("002.wav");   
                    ais2 = AudioSystem.getAudioInputStream(fl2);   
                    format2 = ais2.getFormat();   
                    info2 = new DataLine.Info(SourceDataLine.class,format2);   
                    line2 = (SourceDataLine) AudioSystem.getLine(info2);  
                    line2.open(format2);   
                    bufferSize2 = line2.getBufferSize();
                    if(bufferSize2 > 0)
                    {
                        System.out.println("get2");
                    }
                    buffer2 = new byte[bufferSize2];
                    line2.write(buffer2,0,bufferSize2);
                    if(buffer2.length > 0)
                    {
                        System.out.println("buffer2");
                    }
                }
                else if(e.getSource() == save)
                {
                    System.arraycopy(buffer2, 0, buffer1, buffer1.length+1, buffer2.length);
                    if(buffer1.length >0)
                    {
                        System.out.println("test");
                    }
                    bao.write(buffer1, 0, buffer1.length);

                    byte audio[] = bao.toByteArray();
                    if(audio.length != 0)
                    {
                        System.out.println("save");
                    }
                    input = new ByteArrayInputStream(audio);
                      newais = new AudioInputStream(input, format1,
                        audio.length / format1.getFrameSize());

                    targetType = AudioFileFormat.Type.WAVE;
                        AudioSystem.write(newais, targetType, new File("test10.wav"));    
                }    
            }
            catch(Exception ex){}
        }
    }
}

評価

0

line.writeは違う気がします。
line.writeに変えたところを元に戻して
catch(Exception ex){}を
catch(Exception ex){
    ex.printStackTrace();
}
に変えればとりあえずどこが悪いのかわかると思いますー

@System.arraycopyと配列について調べるとたぶん幸せに。。。

評価

0

>nanashiさん
ご回答ありがとうございます。
度々本当に申し訳ないです。
ご指摘通りの操作を行ったところ、waveファイルが生成出来るようになりました!
しかし、そのwaveファイルの中身は1秒間の雑音だけでした・・・。
従って、バッファを全て読むことが出来ていない模様です。
試しにbufferSizeにinfo.getMaxBufferSizeを入れてみたところ
NegativeArraySizeExceptionが出てしまったので直接最大バイト数を入れることは出来ないみたいです。

こちらが、今回修正したコードです。

import java.awt.*;   
import java.awt.event.*;   
import javax.swing.*;   
import java.io.*;   
import javax.sound.sampled.*;
   
public class SampleWrite extends JFrame
{
    private Container cnt;
    private JPanel pn;
    private JButton get1, get2, save;
    private File fl1, fl2;
    private AudioInputStream ais1, ais2, newais;
    private AudioFormat format1, format2;
    private DataLine.Info info1, info2;
    private SourceDataLine line1, line2;
    private int bufferSize1, bufferSize2;
    private AudioFileFormat.Type targetType;
    private byte buffer1[], buffer2[];   
    TargetDataLine tar;
    ByteArrayOutputStream bao;
    OutputStream out;
    ByteArrayInputStream input;
    public static void main(String args[])
    {
        new SampleWrite();
    }
    public SampleWrite()
    {
        get1 = new JButton("取得1");
        get2 = new JButton("取得2");
        save = new JButton("保存");
        pn = new JPanel();
        cnt = getContentPane();
        pn.setLayout(new GridLayout(3, 1));
        pn.add(get1);
        pn.add(get2);
        pn.add(save);
        cnt.add(pn);
        setSize(200, 200);
        setVisible(true);
        get1.addActionListener(new SampleActionListener());
        get2.addActionListener(new SampleActionListener());
        save.addActionListener(new SampleActionListener());    
    }
    class SampleActionListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            JFileChooser fc = new JFileChooser();
            try
            {
                if(e.getSource() == get1)
                {
                    fl1 = new File("001.wav");   
                    ais1 = AudioSystem.getAudioInputStream(fl1);   
                    format1 = ais1.getFormat();   
                    info1 = new DataLine.Info(SourceDataLine.class,format1);   
                    line1 = (SourceDataLine) AudioSystem.getLine(info1);  
                    line1.open(format1);   
                    bufferSize1 = line1.getBufferSize();
                    if(bufferSize1 > 0)
                    {
                        System.out.println("get1");
                    }
                    buffer1 = new byte[bufferSize1];
                    ais1.read(buffer1,0,bufferSize1);
                    if(buffer1.length > 0)
                    {
                        System.out.println("buffer1");
                    }
                
                }
                else if(e.getSource() == get2)
                {
                    
                    fl2 = new File("002.wav");   
                    ais2 = AudioSystem.getAudioInputStream(fl2);   
                    format2 = ais2.getFormat();   
                    info2 = new DataLine.Info(SourceDataLine.class,format2);   
                    line2 = (SourceDataLine) AudioSystem.getLine(info2);  
                    line2.open(format2);   
                    bufferSize2 = line2.getBufferSize();
                    if(bufferSize2 > 0)
                    {
                        System.out.println("get2");
                    }
                    buffer2 = new byte[bufferSize2];
                    ais2.read(buffer2,0,bufferSize2);
                    if(buffer2.length > 0)
                    {
                        System.out.println("buffer2");
                    }
                }
                else if(e.getSource() == save)
                {
                    byte test[] = new byte[buffer1.length + buffer2.length];
                    System.arraycopy(buffer1, 0, test, 0, buffer1.length);
                    //System.arraycopy(buffer2, 0, test, buffer1.length-1, buffer2.length);
                    if(test.length >0)
                    {
                        System.out.println("test");
                    }
                    bao = new ByteArrayOutputStream();
                    bao.write(test, 0, test.length);
                    System.out.println("test2");
                    
                    byte audio[] = bao.toByteArray();
                    if(audio.length != 0)
                    {
                        System.out.println("save");
                    }
                    input = new ByteArrayInputStream(audio);
                      newais = new AudioInputStream(input, format1,
                        audio.length / format1.getFrameSize());

                    targetType = AudioFileFormat.Type.WAVE;
                        AudioSystem.write(newais, targetType, new File("test12.wav"));    
                }    
            }
            catch(Exception ex){
                ex.printStackTrace();
            }
        }
    }
}

評価

0

とりあえず、ais1が生データだから、長さはais1.available()で取れるらしい。

評価

0

ああなんだ。arraycopyしてないだけか。

評価

0

>$さん
ありがとうございます!
bufferSizeにais.available()を代入することによって
元のファイルと同じwaveファイルを生成することが出来ました^^

$さん、nanashiさん
お二方とも本当にありがとうございました!
ご協力感謝致します!

評価

0

忙しい間に解決したみたいで良かったです。

//コメントになってるarraycopyて、
試してないんですけど、System.arraycopy(buffer2, 0, test, buffer1.length , buffer2.length);
ではだめなんですかね??

評価

0

>nanashiさん
コメントにしていた理由は、とりあえずget1だけ取り込めるかどうか実験してみた名残ですw
その確認をした後、コメント外してみるとget2で取り込んだ部分だけノイズになってしまっていたので
nanashiさんの仰る通りのコーディングで無事に完全なwaveファイルが生成できました。
お陰様で、締め切りまでにゼミ論提出が出来そうです!
お忙しい中、最後まで丁寧なお心遣いありがとうございました^^

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。