NAudio разделить mp3 файл - PullRequest
11 голосов
/ 23 мая 2011

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

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

Ответы [ 4 ]

12 голосов
/ 23 мая 2011

Файл MP3 состоит из последовательности кадров MP3 (плюс часто теги ID3 в начале и в конце).Самый чистый способ разделить MP3-файл - скопировать определенное количество кадров в новый файл (и, при необходимости, принести с собой теги ID3, если это важно).

Класс MP3FileReader NAudio имеет ReadNextFrame метод.Это возвращает класс MP3Frame, который содержит необработанные данные в виде байтового массива в свойстве RawData.Он также включает свойство SampleCount, которое можно использовать для точного измерения длительности каждого кадра MP3.

10 голосов
/ 24 мая 2011

Мое окончательное решение для разделения 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.Wave.

5 голосов
/ 23 ноября 2011

Предыдущие ответы помогли мне начать.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();
    }
2 голосов
/ 23 мая 2011

это будет полезно Alvas Audio (коммерческий) и ffmpeg

...