私はオーディオやmp3に非常に慣れておらず、C#、asp.netでmp3ファイルを分割する機能を持つ方法を探していました。大きな助けを借りずに良い3日間グーグルした後、ここの誰かが私を正しい方向に向けてくれることを願っています。
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 です。
MP3 ファイルは、一連の MP3 フレームで構成されています (さらに、多くの場合、先頭と末尾に ID3 タグがあります)。MP3 ファイルを分割する最もクリーンな方法は、特定の数のフレームを新しいファイルにコピーすることです (必要に応じて、必要に応じて ID3 タグも一緒に移動します)。
NAudio のMP3FileReader
クラスにはReadNextFrame
メソッドがあります。MP3Frame
これは、生データをプロパティのバイト配列として含むクラスを返しRawData
ます。SampleCount
また、各 MP3 フレームの長さを正確に測定するために使用できるプロパティも含まれています。
以前の回答は私が始めるのに役立ちました。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();
}