NAudio для разделения mp3-файла


Я очень новичок в аудио или mp3-вещах, искал способ иметь функцию для разделения mp3-файла на C#, asp.net после того, как я гуглил в течение хороших 3-х дней без большой помощи, я надеюсь, что кто-то здесь может указать мне правильное направление.

Могу ли я использовать NAudio для достижения этой цели? Есть ли какой-нибудь пример кода для этого? Заранее спасибо.

4 10

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