3

我想将一个文件(假设是一个 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)
    {

    }
4

4 回答 4

9

您不能像这样拆分结构化文件:MP3 文件在文件开头有一个标题,用于描述文件其余部分的内容。拆分文件时,您只会在第一部分获得标题。

至于切割非结构化文件,比如文本,你的代码应该会好得多,只要你不介意你的句子在单词中间分裂。

于 2012-07-06T15:11:17.843 回答
4

MP3 文件的开头或结尾都有标题,这意味着您不能仅根据文件大小对文件进行分块。当您拆分主文件时,您需要一个能够读取这些标题并将它们复制到每个部分的库。

于 2012-07-06T15:11:06.347 回答
0

看起来 mp3 帧是相互依赖的,不能只是剪切。请参阅格式说明。具体来说:

由于没有文件头,您可以剪切 MPEG 文件的任何部分并正确播放(这应该在帧边界上完成,但大多数应用程序会处理不正确的头)。但是,对于第三层,这不是 100% 正确的。由于 MPEG Layer III 文件中的内部数据组织,帧通常是相互依赖的,不能像那样被切断。

我的猜测是你已经设法在依赖于早期帧的地方进行拆分。

于 2012-07-06T15:12:07.953 回答
0

查看http://mpgedit.org/mpgedit/mpeg_format/MP3Format.html一个 MP3 文件的单个帧是 32 位长,这意味着您需要读取/写入字节组。目前您正在以 1 个字节为一组写入,这意味着您正在对帧进行分段(例如,帧的一个字节在 File1 中,其他 3 个字节在 file2 中,弄乱了正在读取您的 mp3 文件的任何程序,它期望 byte1 )。

但是,我建议不要编写自己的 mp3 文件流,而是使用内置的

javax.sound.sampled.AudioInputStreamjavax.sound.sampled.AudioOutputStream

于 2012-07-06T15:18:35.213 回答