2013-08-31 16 views
0

我需要序列化一個音頻剪輯到一個文件,作爲另一個數據 結構的一部分,不幸的是,音頻剪輯似乎不可序列化。是否有可以作爲代理序列化的 對象。根據需要,我可以在AudioClip之間移動 和之前的東西?解決方法,以序列化一個java 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對象的每個數據成員,而無需將原始audioclip保留在硬盤上(即,我想創建某種包含audioclip作爲其數據成員的一部分的對象的歸檔)。我還需要能夠播放音頻剪輯,而無需將它們保存回* .wav到硬盤上。就像VLC可以在一個zip文件中播放整個播放列表而無需提取每個片段。 有什麼建議嗎?

感謝,

+1

只保存字節。 – EJP

+0

@EJB那麼,我還需要能夠在重新加載後播放音頻剪輯,並且我不知道如何從字節數組到音頻剪輯。我不想保存到* .wav的字節才能播放剪輯 –

+0

爲什麼不能?就是這樣。 – EJP

回答

0

GOTCHA!我終於找到了做到這一點的方法。像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); 
    } 
} 

P.S. 我試着用AudioInputStream + AudioSystem.write()保存到一個數組(ByteArrayOutputStream - > byte [])它不起作用的組合。檢查image to byte Array並用那些面向音頻的類轉置。在解決方案上工作...

相關問題