NAudio для разделения mp3-файла
Я очень новичок в аудио или mp3-вещах, искал способ иметь функцию для разделения mp3-файла на C#, asp.net после того, как я гуглил в течение хороших 3-х дней без большой помощи, я надеюсь, что кто-то здесь может указать мне правильное направление.
Могу ли я использовать NAudio для достижения этой цели? Есть ли какой-нибудь пример кода для этого? Заранее спасибо.
4 ответа:
MP3-файл состоит из последовательности MP3-кадров (плюс часто теги ID3 в начале и конце). Самый чистый способ разбить MP3-файл - скопировать определенное количество кадров в новый файл (и, если это важно, дополнительно принести теги ID3).
Класс NAudio
MP3FileReader
содержит методReadNextFrame
. Это возвращает классMP3Frame
, который содержит необработанные данные в виде массива байтов в свойствеRawData
. Он также включает СВОЙСТВОSampleCount
, которое можно использовать для точного измерения длительность каждого кадра MP3.
Мое окончательное решение для разделения mp3-файла на c# - использовать 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(); }
Спасибо за предложение Марка хита.
Требуемое пространство имен-NAudio.Волна.
Предыдущие ответы помогли мне начать работу. Наудио - это путь, по которому нужно идти.
Для моего PodcastTool мне нужно было разбить подкасты с интервалом в 2 минуты, чтобы сделать поиск в определенном месте быстрее.
Вот код для разделения mp3 каждые N секунд:
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(); }
Они были бы полезны Alvas Audio (commercial) и ffmpeg