有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

序列化java音频剪辑的音频解决方案

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

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

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。木卫一。NotSerializableException:sun。小程序。AppletAudioClip

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

谢谢


共 (1) 个答案

  1. # 1 楼答案

    明白了!!!我终于找到了做这件事的方法。正如EJP所说的关键部分是保存在字节数组中。到目前为止,我提出的唯一解决方案是在sun之外使用技术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并与那些面向音频的类进行转置。正在研究解决方案