2014-01-27 73 views
0

我有一些連接mp3文件的問題。例如,我有5個mp3文件。我想將它們連接到一個文件。在Java中連接MP3文件

我試試這個:

try { 
    InputStream in = new FileInputStream("C:/a.mp3"); 
    byte[] buffer = new byte[1024]; 
    OutputStream os = new FileOutputStream(new File("C:/output.mp3", 
      true)); 
    int count; 
    while ((count = in.read(buffer)) != -1) { 
     os.write(buffer, 0, count); 
     os.flush(); 
    } 
    in.close(); 
    in = new FileInputStream("C:/b.mp3");// second mp3 
    while ((count = in.read(buffer)) != -1) { 
     os.write(buffer, 0, count); 
     os.flush(); 
    } 
    in.close(); 
    os.close(); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} 

但這不工作。我在這個過程結束時得到一個mp3文件,它包含了來自源mp3文件的所有音樂數據,但是在選項中,我只能從第一個源mp3文件中看到fihish mp3的時間。而且,當我嘗試使用這個最終的MP3文件時,我使用Xuggle庫將此MP3音頻添加到MP4視頻,我得到錯誤。

我敢肯定,從每個mp3源文件的字節問題,其中記錄元信息。也許存在一些正確的連接mp3庫?

+1

http://en.wikipedia.org/wiki/MP3#File_structure –

+1

請參閱http://stackoverflow.com/a/62762/545127 – Raedwald

回答

2

您的方法存在多個問題。

a。)如果源文件中有任何元數據,則複製元數據。在concatinated文件中,這些元數據(Id3v1和Id3v2)將出現多次並且在它們不應該出現的位置(Id3v1 必須位於文件末尾,Id3v2位於開頭IIRC) 。這可能會混淆解碼器將文件識別爲損壞(它可能會播放第一部分,然後打嗝第二部分的意外元數據)。

b。)計算MP3的長度並不是那麼簡單,需要計算文件中MP3幀的數量。由於沒有頭部可以告訴幀的數量,所以唯一的方法是按順序掃描文件(如解碼)。在引入MP3時這曾經是一項成本高昂的操作,所以有多種方法可以解決這個問題(VBR頭部塊和Id3元標籤)。如果你的玩家依賴於這些,它將始終只檢測第一部分的長度。即使你正確地去掉元數據,你只能使用相同的參數(採樣率)連接MP3流,一些解碼器甚至可能對比特率和類型(單聲道/ MS/Istereo等)有額外的限制)。

你看,它可以做到,但它的不是瑣碎。

+0

在開始使用ID3v2標籤之後,該規範實際上允許在文件的任何位置發生更多的v2標籤(如「更新」)。 – ioctlLR

0

你不能追加這種方式的音樂文件。你需要的是一個外部庫(lame或...),在java中幾乎是不可能的,JMF已經死了。

+0

這實際上是一條評論。 –

+0

對不起,但無法評論,需要50聲望,只是想幫助他,並給一些isue ... –

+0

其實你可以追加MP3文件,只要你去掉或正確對待元數據。 –