3

ファイル(mp3を想定)を4つの部分に分割したいのですが、このコードを試しました。ただし、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ファイルの任意の部分を切り取って正しく再生できます(これはフレーム境界で実行する必要がありますが、ほとんどのアプリケーションは誤ったヘッダーを処理します)。ただし、レイヤーIIIの場合、これは100%正しくありません。MPEG Layer IIIファイルの内部データ編成により、フレームは相互に依存していることが多く、そのようにカットすることはできません。

私の推測では、あなたは以前のフレームに依存しているどこかで分割することができたと思います。

于 2012-07-06T15:12:07.953 に答える
0

http://mpgedit.org/mpgedit/mpeg_format/MP3Format.htmlを見ると、MP3ファイルの個々のフレームは32ビット長です。つまり、バイトのグループで読み取り/書き込みを行う必要があります。現在、1バイトのグループで書き込んでいます。つまり、フレームをフラグメント化しています(たとえば、フレームの1バイトはFile1にあり、他の3バイトはfile2にあり、byte1を期待しているmp3ファイルを読み取っているプログラムを台無しにします。 )。

ただし、独自のmp3ファイルストリームを作成するのではなく、組み込みのmp3ファイルストリームを使用することをお勧めします。

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

于 2012-07-06T15:18:35.213 に答える