CSCore:可能,剪切音频文件

本文关键字:音频 文件 可能 CSCore | 更新日期: 2023-09-27 18:02:49

是否可以使用CSCore-Library剪切音频文件?例如,我想在第20秒开始播放mp3在第50秒停止然后我想生成一个新的mp3文件,它会这样做

CSCore:可能,剪切音频文件

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

  1. 解析mp3文件获取所有mp3帧。复制你不想剪掉的帧并粘贴到一个新的流中。
  2. 解码整个mp3文件,重新编码你不想被剪掉的数据。

第一种方法的缺点是它比方法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;
    }
}