CSCore:可能,削减音频文件

时间:2014-05-11 10:54:52

标签: c# audio mp3 cscore

是否可以使用CSCore-Library剪切音频文件?例如,我想在第二个20开始播放一个mp3,并在第二个50开始停止它,我想生成一个新的mp3文件,但是它确实是这样。

1 个答案:

答案 0 :(得分:3)

有两种方法可以剪切mp3文件。

  1. 解析mp3文件以获取所有mp3帧。复制您不想剪切的帧并将其粘贴到新流中。
  2. 解码整个mp3文件并重新编码您不想删除的数据。
  3. 第一种方法的缺点是比方法2更复杂,你不能精确地切割mp3。这意味着,你被限制在mp3帧的大小。

    第二种方法正是您所寻找的。但是存在一个大问题:自Windows 8以来仅支持MP3编码。这意味着您无法在Windows XP,Vista或Windows 7中使用此方法。

    - >我建议你使用任何第三方组件,如lame,ffmpeg,......

    无论如何......方法2的一个例子:

    private static void Main(string[] args)
    {
        TimeSpan startTimeSpan = TimeSpan.FromSeconds(20);
        TimeSpan endTimeSpan = TimeSpan.FromSeconds(50);
    
        using (IWaveSource source = CodecFactory.Instance.GetCodec(@"C:\Temp\test.mp3"))
        using (MediaFoundationEncoder mediaFoundationEncoder =
            MediaFoundationEncoder.CreateWMAEncoder(source.WaveFormat, @"C:\Temp\dest0.mp3"))
        {
            AddTimeSpan(source, mediaFoundationEncoder, startTimeSpan, endTimeSpan);
        }
    }
    
    private static void AddTimeSpan(IWaveSource source, MediaFoundationEncoder mediaFoundationEncoder, TimeSpan startTimeSpan, TimeSpan endTimeSpan)
    {
        source.SetPosition(startTimeSpan);
    
        int read = 0;
        long bytesToEncode = source.GetBytes(endTimeSpan - startTimeSpan);
    
        var buffer = new byte[source.WaveFormat.BytesPerSecond];
        while ((read = source.Read(buffer, 0, buffer.Length)) > 0)
        {
            int bytesToWrite = (int)Math.Min(read, bytesToEncode);
            mediaFoundationEncoder.Write(buffer, 0, bytesToWrite);
            bytesToEncode -= bytesToWrite;
        }
    }