我想将一个文件(假设一个mp3)分成四个部分。我试过这段代码。但只有File1.mp3正常工作。我无法玩别人。我在这里做错了什么?
try {
FileInputStream in=new FileInputStream(f);
long i=f.length();
long j=i/4;
FileOutputStream f0=new FileOutputStream("File1.mp3");
FileOutputStream f1=new FileOutputStream("File2.mp3");
FileOutputStream f2=new FileOutputStream("File3.mp3");
FileOutputStream f3=new FileOutputStream("File4.mp3");
for(long k=0;k<j;k++){
f0.write(in.read());
}
f0.close();
for(long l=0;l<j;l++){
f1.write(in.read());
}
f1.close();
for(long m=0;m<j;m++){
f2.write(in.read());
}
f2.close();
for(long n=0;n<j;n++){
f3.write(in.read());
}
f3.close();
in.close();
}
catch (IOException e)
{
}
答案 0 :(得分:8)
你不能像这样分割结构化文件:MP3 file has a header at the beginning of the file描述文件其余部分的内容。拆分文件时,只在第一部分中获得标题。
就削减非结构化文件(例如文本)而言,只要你不介意将句子分成一个单词,你的代码应该会好得多。
答案 1 :(得分:4)
MP3文件在开头或结尾都有标题,这意味着你不能只根据文件的大小来分块。您需要一个能够读取这些标题的库,并在拆分主文件时将它们复制到每个部分中。
答案 2 :(得分:0)
看起来mp3帧彼此依赖,不能只是被剪切。请参阅this格式说明。具体做法是:
由于没有文件头,您可以剪切MPEG文件的任何部分并播放 它是正确的(这应该在框架边界,但大多数 应用程序将处理错误的标头)。但是,对于第三层, 这不是100%正确。由于MPEG中的内部数据组织 第三层文件,帧通常彼此依赖并且它们相互依赖 不能像那样被切断。
我的猜测是你已经设法拆分了依赖于早期帧的地方。
答案 3 :(得分:0)
查看http://mpgedit.org/mpgedit/mpeg_format/MP3Format.html MP3文件的单个帧是32位长,这意味着您需要以字节组的形式进行读/写。目前你正在写1个字节的组,这意味着你正在分割帧(例如,帧的一个字节在File1中,其他3个字节在file2中,弄乱了正在读取你的mp3文件的任何程序,它正在期待byte1 )。
但是,我建议不要编写自己的mp3文件流,而是使用内置的
javax.sound.sampled.AudioInputStream
和javax.sound.sampled.AudioOutputStream