【问题标题】:workaround to serialize a java audioClip序列化 java audioClip 的解决方法
【发布时间】:2013-09-04 01:24:47
【问题描述】:

我需要将 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 文件中播放整个播放列表,而无需提取每个剪辑。 有任何想法吗?

谢谢,

【问题讨论】:

  • @EJB 好吧,我还需要能够在重新加载后播放音频剪辑,我不知道如何从字节数组转到音频剪辑。我不想在能够播放剪辑之前保存到 *.wav 字节
  • 为什么不呢?就是这样。
  • @EJP 我做了一些搜索,最终找到了这个image to byte array。我通过将 BufferedImage 替换为 AudioInputStream inputStream 和 ImageIO.write() 通过 AudioSystem.write() 来转换第二个示例,它似乎不起作用。说实话,我不确定我知道如何从 AudioStream 转到字节数组。
  • 握住手机。 AudioInputStream 必须以文件中的字节流开始。这就是您要发送的内容。

标签: java audio serialization serializable


【解决方案1】:

明白了!!!我终于找到了方法。就像 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);
    }
}

附: 我尝试了使用 AudioInputStream + AudioSystem.write() 的组合来保存到数组(ByteArrayOutputStream --> byte[]),但它不起作用。检查image to byte Array 并使用那些面向音频的类进行转置。正在寻找解决方案...

【讨论】:

    猜你喜欢
    • 2016-06-15
    • 2015-04-22
    • 2019-05-03
    • 2023-03-09
    • 2014-10-01
    • 1970-01-01
    • 2013-05-22
    • 2017-09-03
    相关资源
    最近更新 更多