java - 序列化Java AudioClip的解决方法

标签 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

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

谢谢,

最佳答案

哥!我终于找到了解决方法。就像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并与那些面向音频的类进行转置。解决方案...

关于java - 序列化Java AudioClip的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18547741/

相关文章:

java - ARCore 应用中的黑白视频流背景

java - 找不到 PropertySource : I/O error on GET request

java - 更改 X-Touch Mini 上的 LED – Mackie Control(MC 模式)

java - 在java中,发出选择性的嘟嘟声

java - Gson 注释不适用于我的模型。

基于Java的memcached客户端,优化将数据放入memcache

java - 从 Android 应用程序对象显示对话框(或需要可用于多个 Activity 的例程)

iphone - iPhone-用户讲话时如何接收声音/音频?

ios - MPMoviePlayerController 中断 AirPlay iPod 音频,但它在设备上运行良好

serialization - symfony 反序列化嵌套对象