【问题标题】:NAudio to split mp3 fileNAudio 分割 mp3 文件
【发布时间】:2011-08-30 23:01:12
【问题描述】:

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

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

【问题讨论】:

标签: c# asp.net split mp3 naudio


【解决方案1】:

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

【讨论】:

  • 谢谢你的评论,我先试试NAudio。 :)
【解决方案2】:

以前的答案帮助我入门。 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();
    }

【讨论】:

  • 修改我的示例来实现这一点应该不难。你试过了吗?我可以在某个时候尝试一下,但不是现在。开始和停止微调点的测量单位是什么?
  • 我一直在尝试仍然没有得到它。我第一次使用 NAudio。测量将是一个时间跨度。开始和停止。所以基本上是修剪开始和修剪结束。
  • 我试过了,但 CurrentTime 总是为零,有人知道为什么吗?
【解决方案3】:

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

【讨论】:

  • 为什么要关闭并重新打开每一帧的文件流?这不会很好。
  • 这只是为了对 NAudio 进行快速测试。你是对的,它不应该一直打开和关闭文件流,编辑代码。
  • 一帧有多长?
  • @AndreyKaplun double audioLengthInSeconds = (double) frame.SampleCount / frame.SampleRate;
【解决方案4】:

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

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

【讨论】:

  • 感谢您的评论,我将对此进行尝试。我稍后会回来更新我的发现。谢谢!
  • 每个 mp3Frame 有多少毫秒??是否有任何公式或东西可以用来获取每个 mp3frame 的长度(以毫秒为单位)?
  • @ermac2014 使用采样率。如果您知道每秒的样本数并且知道样本数,则将样本数除以采样率即可得到持续时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
相关资源
最近更新 更多