0

我需要将 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

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

谢谢,

4

1 回答 1

0

明白了!我终于找到了方法。就像 EJP 所说的,关键部分是保存在一个字节数组中。到目前为止,我想出的唯一解决方案是每次我想播放声音文件时,除了 sun.audio.AudioPlayer 和 sun.audio.AudioStream 之外,还使用该技术将文件转换为字节数组。

这是一个示例类:

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);
    }
}

PS我尝试了一个使用AudioInputStream + AudioSystem.write()的组合来保存到一个数组(ByteArrayOutputStream - > byte [])它没有工作。检查图像到字节数组并使用那些面向音频的类进行转置。正在寻找解决方案...

于 2013-09-01T21:17:09.133 回答