我是非常新的音頻或MP3的東西,一直在尋找一種方式,以分離一個MP3文件在C#,asp.net的功能。在沒有太多幫助的情況下,Google搜索了三天的好消息後,我希望這裏的某個人能夠指引我一個正確的方向。NAudio拆分MP3文件
我可以使用NAudio來實現嗎?有沒有任何示例代碼?提前致謝。
我是非常新的音頻或MP3的東西,一直在尋找一種方式,以分離一個MP3文件在C#,asp.net的功能。在沒有太多幫助的情況下,Google搜索了三天的好消息後,我希望這裏的某個人能夠指引我一個正確的方向。NAudio拆分MP3文件
我可以使用NAudio來實現嗎?有沒有任何示例代碼?提前致謝。
我在c#中分割mp3文件的最終解決方案是使用NAudio。這裏是一個示例腳本,希望它可以幫助社區中的某個人:
string strMP3Folder = "<YOUR FOLDER PATH>";
string strMP3SourceFilename = "<YOUR SOURCE MP3 FILENAMe>";
string strMP3OutputFilename = "<YOUR OUTPUT MP3 FILENAME>";
using (Mp3FileReader reader = new Mp3FileReader(strMP3Folder + strMP3SourceFilename))
{
int count = 1;
Mp3Frame mp3Frame = reader.ReadNextFrame();
System.IO.FileStream _fs = new System.IO.FileStream(strMP3Folder + strMP3OutputFilename, System.IO.FileMode.Create, System.IO.FileAccess.Write);
while (mp3Frame != null)
{
if (count > 500) //retrieve a sample of 500 frames
return;
_fs.Write(mp3Frame.RawData, 0, mp3Frame.RawData.Length);
count = count + 1;
mp3Frame = reader.ReadNextFrame();
}
_fs.Close();
}
感謝Mark Heath對此的建議。
所需的命名空間是NAudio.Wave。
你爲什麼要關閉並重新打開每個幀的文件流?這將表現不佳。 – BrokenGlass 2011-05-24 03:35:39
這只是爲了在NAudio上進行快速測試。你是對的,它不應該繼續打開和關閉文件流,編輯代碼。 – 2011-05-24 05:44:42
這將是有益的Alvas Audio(商業)和ffmpeg
感謝您的評論,我會先給NAudio一試。 :) – 2011-05-24 01:15:23
-1 - Alvas Audio是商業! – 2012-08-22 12:26:36
對不起。剛剛編輯 – 2012-08-22 12:29:50
MP3文件是由MP3幀(加上開頭和結尾往往ID3標籤)的序列。然後,分離MP3文件的最簡單方法是將一定數量的幀複製到一個新文件中(如果這很重要,也可以選擇帶上ID3標籤)。
NAudio的MP3FileReader
課程特色ReadNextFrame
方法。這將返回一個MP3Frame
類,該類包含RawData
屬性中的原始數據作爲字節數組。它還包括一個SampleCount
屬性,您可以使用它來準確測量每個MP3幀的持續時間。
感謝您的評論,我會試試這個..我會回來稍後更新我的發現。謝謝! – 2011-05-24 01:15:02
每個mp3Frame有多少毫秒?有什麼公式或什麼我可以用來獲得每毫秒的每個MP3幀的長度? – SolidSnake 2011-06-02 21:03:22
@ ermac2014使用採樣率。如果您知道每秒採樣數量並知道採樣數量,則按採樣率除以採樣數量以獲得持續時間。 – 2011-06-06 08:46:02
以前的答案幫助我開始。 NAudio是要走的路。
對於我的PodcastTool我需要以2分鐘的時間間隔分開播客,以便更快地找到特定的地點。
下面的代碼來分割每N秒一個mp3:的
var mp3Path = @"C:\Users\ronnie\Desktop\mp3\dotnetrocks_0717_alan_dahl_imagethink.mp3";
int splitLength = 120; // seconds
var mp3Dir = Path.GetDirectoryName(mp3Path);
var mp3File = Path.GetFileName(mp3Path);
var splitDir = Path.Combine(mp3Dir,Path.GetFileNameWithoutExtension(mp3Path));
Directory.CreateDirectory(splitDir);
int splitI = 0;
int secsOffset = 0;
using (var reader = new Mp3FileReader(mp3Path))
{
FileStream writer = null;
Action createWriter = new Action(() => {
writer = File.Create(Path.Combine(splitDir,Path.ChangeExtension(mp3File,(++splitI).ToString("D4") + ".mp3")));
});
Mp3Frame frame;
while ((frame = reader.ReadNextFrame()) != null)
{
if (writer == null) createWriter();
if ((int)reader.CurrentTime.TotalSeconds - secsOffset >= splitLength)
{
// time for a new file
writer.Dispose();
createWriter();
secsOffset = (int)reader.CurrentTime.TotalSeconds;
}
writer.Write(frame.RawData, 0, frame.RawData.Length);
}
if(writer != null) writer.Dispose();
}
修改我的樣本以實現這一點不應該很困難。你試過了嗎?我可以在某個時候對其進行破解,而不是這一刻。開始和停止修剪點的測量單位是多少? – 2013-01-03 21:39:39
我一直在嘗試還沒有得到它。我第一次和NAudio合作。測量結果將是一個時間跨度。開始和停止。所以基本上是一個修剪開始和修剪結束。 – 2013-01-04 23:32:02
這裏你去:http://stackoverflow.com/a/14169073/64334 – 2013-01-05 05:51:57
可能重複的[修剪一個MP3編程方式](http://stackoverflow.com/questions/551074/trim-an-mp3-programatically ) – ErikE 2013-01-05 08:09:20