13

我对音频或 mp3 的东西非常陌生,正在寻找一种方法来在 C#、asp.net 中分割一个 mp3 文件。在没有太多帮助的情况下搜索了 3 天后,我希望这里有人可以为我指明正确的方向。

我可以使用 NAudio 来完成此任务吗?是否有任何示例代码?提前致谢。

4

4 回答 4

13

我在 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。

于 2011-05-24T03:10:26.643 回答
12

MP3 文件由一系列 MP3 帧(通常加上开头和结尾的 ID3 标签)组成。拆分 MP3 文件的最简单方法是将一定数量的帧复制到一个新文件中(如果这很重要,还可以选择带上 ID3 标签)。

NAudio 的MP3FileReader类有一个ReadNextFrame方法。这将返回一个MP3Frame类,该类在属性中包含作为字节数组的原始数据RawData。它还包括一个SampleCount属性,您可以使用它来准确测量每个 MP3 帧的持续时间。

于 2011-05-23T12:27:35.137 回答
6

以前的答案帮助我入门。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();
    }
于 2011-11-23T02:13:39.547 回答
2

这些会很有帮助Alvas Audio(商业)和ffmpeg

于 2011-05-23T08:00:02.150 回答