2009-07-21 80 views
3

我有一個不同的單詞/短語庫,爲了在目前建立句子,我將這些短語的組合添加到一個播放列表中以形成一個句子。不幸的是,如果用戶正在運行CPU密集型應用程序(我的大多數用戶都是這樣),那麼在句子中間可能會有幾秒鐘的滯後(在短語之間)。如何合併/加入MP3文件與C#?

爲了解決這個問題,我正在考慮一種方法,它可以將MP3文件的正確組合合併到一個適當的短語中,將其保存在%temp%目錄中,然後播放這個應該是MP3文件克服我遇到的問題。

在C#中執行此操作的最簡單方法是什麼?是否有捷徑可尋?這些文件相當小,每個文件長3-4秒,一個句子可以由3到20個短語組成。

回答

1

MP3文件由「幀」組成,每幀代表一段短片段(我認爲大約25毫秒)的音頻。

所以是的,你可以只是連接他們沒有問題。

+0

我將主要控制使用哪些mp3文件,如果使用不同的比特率,會不會有問題? – James 2009-07-21 19:20:06

+0

如果您的音頻播放器可以處理VBR文件,則不會出現問題,因爲這正是VBR的工作原理。 – bart 2009-07-22 13:07:41

+3

這完全不正確。由於存儲位,您不能簡單地將框架彼此靠在一起。請參閱本節的第4部分:http://lame.sourceforge.net/tech-FAQ.txt – Brad 2011-07-06 21:33:27

0

由於MP3是一個壓縮音頻源,我想你不能將它們連接成一個文件,而不要先將每個文件解碼爲它將播放的波形。這可能相當密集。也許你可以在回放你的短語時使用關鍵部分作弊,以便在短語完成之前CPU不會從你手中被盜。這不一定和其他線程打起來不錯,但如果你的短語很短,可能會奏效。

+1

這是不正確的。您*可以*分割/合併MP3流,但由於位存儲器需要非常小心地完成。請參閱http://lame.sourceforge.net/tech-FAQ.txt – Brad 2011-07-06 21:34:25

5

這裏是如何使用NAudio串連MP3文件:

public static void Combine(string[] inputFiles, Stream output) 
{ 
    foreach (string file in inputFiles) 
    { 
     Mp3FileReader reader = new Mp3FileReader(file); 
     if ((output.Position == 0) && (reader.Id3v2Tag != null)) 
     { 
      output.Write(reader.Id3v2Tag.RawData, 0, reader.Id3v2Tag.RawData.Length); 
     } 
     Mp3Frame frame; 
     while ((frame = reader.ReadNextFrame()) != null) 
     { 
      output.Write(frame.RawData, 0, frame.RawData.Length); 
     } 
    } 
} 

看到here更多信息