解决方法以序列化java audioClip

时间:2013-08-31 11:40:17

标签: java audio serialization serializable

我需要将AudioClip序列化为文件,作为另一个数据的一部分 结构,不幸的是AudioClip似乎不是可序列化的。有没有 对象我可以序列化为代理。我可以搬回去的东西 AudioClip之间是否有必要?

我尝试了这个简单的代码/类

import java.applet.AudioClip;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.URL;
import javax.swing.JApplet;


public class RandomClass implements Serializable {

    private AudioClip myAudioClip;
    private int RandomInteger;
    private String RandomString;


    public RandomClass(String soundpath){
        soundpath = soundpath.replace(" ", "%20");
        soundpath = soundpath.replace("\\", "/");
        try{
            URL sound = new URL("file:/"+soundpath);
            myAudioClip = JApplet.newAudioClip(sound);
        }catch(Exception e){
                e.printStackTrace();
        }
    }

    public void serializeMe(){

        try{

             FileOutputStream fout = new FileOutputStream("c:\\serialized.ser");
             ObjectOutputStream oos = new ObjectOutputStream(fout);   
             oos.writeObject(this);
             oos.close();

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


    public static void main(String args[]){

        RandomClass d = new RandomClass("C:\\audioclip.wav");
        d.serializeMe();
    }
}

我收到了java.io.NotSerializableException:sun.applet.AppletAudioClip

我真正想要的是将audioclip与其他成员对象或类型一起保存在单个序列化文件中。因此,每当我重新加载文件(实际上将包含这些RandomClass对象的arrayList)时,我得到每个RandomClass对象的每个数据成员,而不需要将原始的audioclip保留在硬盘上(即我想创建某种类型的包含audioclip作为其数据成员一部分的对象的存档。我还需要能够播放audioClip而无需将它们保存回硬盘上的* .wav。就像VLC可以在zip文件中播放整个播放列表而无需提取每个剪辑。 有任何想法吗?

谢谢,

1 个答案:

答案 0 :(得分:0)

GOTCHA !!!我终于找到了做到这一点的方法。就像EJP所说关键部分是保存在一个字节数组中。到目前为止,我提出的唯一解决方案是每次我想播放声音文件时,除了sun.audio.AudioPlayer和sun.audio.AudioStream之外还使用to convert a file to a byte array技术。

以下是一个示例类:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.logging.Level;
import java.util.logging.Logger;
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;

public class SoundSerializer implements Serializable {

    private byte[] buf;
    private int randomInteger =0;
    private String randomString = "";

    public SoundSerializer() throws FileNotFoundException, IOException {
        File file = new File("C:\\soundFile.wav");

        FileInputStream fis = new FileInputStream(file);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        buf = new byte[1024];

        for (int readNum; (readNum = fis.read(buf)) != -1;) {
            bos.write(buf, 0, readNum); //no doubt here is 0
            //Writes len bytes from the specified byte array starting at offset off to this byte array output stream.
            System.out.println("read " + readNum + " bytes,");
        }

        buf = bos.toByteArray();
    }


    /**
     *fonction to test the sound after deserialization
     */
    public void playSound(){
        InputStream is = new ByteArrayInputStream(buf);
        AudioStream audioStream = null;
        try {
            audioStream = new AudioStream(is);
        } catch (IOException ex) {
            Logger.getLogger(SoundSerializer.class.getName()).log(Level.SEVERE, null, ex);
        }
        AudioPlayer.player.start(audioStream);
    }
}

P.S。 我尝试使用AudioInputStream + AudioSystem.write()的组合保存到一个数组(ByteArrayOutputStream - > byte [])它不起作用。检查image to byte Array并转置那些面向音频的类。致力于解决方案...