Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
序列化java音频剪辑的变通方法_Java_Audio_Serialization_Serializable - Fatal编程技术网

序列化java音频剪辑的变通方法

序列化java音频剪辑的变通方法,java,audio,serialization,serializable,Java,Audio,Serialization,Serializable,我需要将音频剪辑序列化为文件,作为另一个数据的一部分 不幸的是,音频剪辑似乎无法序列化。有没有 对象,我可以将其序列化为代理。我可以搬回去的东西 必要时在音频剪辑之间来回移动 我尝试了这个简单的代码/类 import java.applet.AudioClip; import java.io.FileOutputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.net.URL;

我需要将音频剪辑序列化为文件,作为另一个数据的一部分 不幸的是,音频剪辑似乎无法序列化。有没有 对象,我可以将其序列化为代理。我可以搬回去的东西 必要时在音频剪辑之间来回移动

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

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文件中播放整个播放列表,而不必提取每个片段。 有什么想法吗


谢谢,明白了!!!我终于找到了做这件事的方法。正如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);
    }
}
附言。
我尝试使用AudioInputStream+AudioSystem.write()组合保存到数组(ByteArrayOutputStream-->byte[]),但它不起作用。检查并转换这些面向音频的类。正在开发解决方案…

@EJB嗯,我还需要能够在重新加载后播放音频片段,我不知道如何从字节数组转换到音频片段。我不想在播放剪辑之前将字节保存到*.wav为什么不?这就是全部。@EJP我做了一些搜索,最终得到了这个。我转置了第二个示例,用AudioInputStream inputStream和ImageIO.write()替换了BuffereImage,并用AudioSystem.write()替换。它似乎不起作用。说实话,我不确定我是否知道如何从音频流到字节数组。拿着电话。AudioInputStream必须以文件中的字节流开始。这就是你要送的。