我需要将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
我真正想要的是将audioclip与其他成员对象或类型一起保存在单个序列化文件中。因此,每当我重新加载文件(实际上将包含这些RandomClass对象的arrayList)时,我得到每个RandomClass对象的每个数据成员,而不需要将原始的audioclip保留在硬盘上(即我想创建某种类型的包含audioclip作为其数据成员一部分的对象的存档。我还需要能够播放audioClip而无需将它们保存回硬盘上的* .wav。就像VLC可以在zip文件中播放整个播放列表而无需提取每个剪辑。 有任何想法吗?
谢谢,
答案 0 :(得分: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并转置那些面向音频的类。致力于解决方案...