C# 修剪wav文件

C# 修剪wav文件,c#,wpf,audio,trim,naudio,C#,Wpf,Audio,Trim,Naudio,我正在尝试使用中的代码修剪文件 如果bytesRequired我找到了解决方案,您应该中断while循环。完成后,我不得不编写writer.Dispose()。 就像这样: public static void TrimWavFile(string inPath, string outPath, TimeSpan cutFromStart, TimeSpan cutFromEnd) { using (WaveFileReader reader = new WaveFileReader(

我正在尝试使用中的代码修剪文件


如果
bytesRequired我找到了解决方案,您应该中断while循环。完成后,我不得不编写writer.Dispose()。
就像这样:

public static void TrimWavFile(string inPath, string outPath, TimeSpan cutFromStart, TimeSpan cutFromEnd)
 {
    using (WaveFileReader reader = new WaveFileReader(inPath))
    {
        using (WaveFileWriter writer = new WaveFileWriter(outPath, reader.WaveFormat))
        {
            int bytesPerMillisecond = reader.WaveFormat.AverageBytesPerSecond / 1000;

            int startPos = (int)cutFromStart.TotalMilliseconds * bytesPerMillisecond;
            startPos = startPos - startPos % reader.WaveFormat.BlockAlign;

            int endBytes = (int)cutFromEnd.TotalMilliseconds * bytesPerMillisecond;
            endBytes = endBytes - endBytes % reader.WaveFormat.BlockAlign;
            int endPos = (int)reader.Length - endBytes; 

            TrimWavFile(reader, writer, startPos, endPos);
            writer.Dispose();
        }
    }

您使用的示例代码有点过时,并且有一些bug。 以下是一个更新版本(对我来说非常适用):


我这样做了,但我仍然明白:你知道为什么吗?输入文件可以播放吗?什么是波形?输入是可播放的,它是一个wav文件。我调试了程序,它甚至没有进入else和打破while循环。我在问题中添加了代码。奇怪-这就是using语句应该为您做的
while (reader.Position < end)
        {
            int bytesRequired = (int)(end - reader.Position);
            if (bytesRequired > 0)
            {
                int bytesToRead = Math.Min(bytesRequired, buffer.Length);
                int bytesRead = reader.Read(buffer, 0, bytesToRead);
                if (bytesRead > 0)
                {
                    writer.Write(buffer, 0, bytesRead);
                }
                else if (bytesRead == 0)
                {
                   break;
                }
            }
            else if (bytesRequired <= 0)
            {
                break;
            }
        }
public static void TrimWavFile(string inPath, string outPath, TimeSpan cutFromStart, TimeSpan cutFromEnd)
 {
    using (WaveFileReader reader = new WaveFileReader(inPath))
    {
        using (WaveFileWriter writer = new WaveFileWriter(outPath, reader.WaveFormat))
        {
            int bytesPerMillisecond = reader.WaveFormat.AverageBytesPerSecond / 1000;

            int startPos = (int)cutFromStart.TotalMilliseconds * bytesPerMillisecond;
            startPos = startPos - startPos % reader.WaveFormat.BlockAlign;

            int endBytes = (int)cutFromEnd.TotalMilliseconds * bytesPerMillisecond;
            endBytes = endBytes - endBytes % reader.WaveFormat.BlockAlign;
            int endPos = (int)reader.Length - endBytes; 

            TrimWavFile(reader, writer, startPos, endPos);
            writer.Dispose();
        }
    }
private void Cut()
{
  var filename = @"G:\Voice\Samples\LongAudioFile.wav";
  FileInfo fi = new FileInfo(filename);
  var outputPath = System.IO.Path.Combine(fi.Directory.FullName, string.Format("{0}_Shorter{1}", fi.Name.Replace(fi.Extension, ""), fi.Extension));

  TrimWavFile(filename, outputPath, TimeSpan.FromHours(1));
}

public static void TrimWavFile(string inPath, string outPath, TimeSpan duration)
{
  using (WaveFileReader reader = new WaveFileReader(inPath))
  {
    using (WaveFileWriter writer = new WaveFileWriter(outPath, reader.WaveFormat))
    {
      float bytesPerMillisecond = reader.WaveFormat.AverageBytesPerSecond / 1000f;

      int startPos = 0;
      startPos = startPos - startPos % reader.WaveFormat.BlockAlign;

      int endBytes = (int)Math.Round(duration.TotalMilliseconds * bytesPerMillisecond);
      endBytes = endBytes - endBytes % reader.WaveFormat.BlockAlign;
      int endPos = endBytes;

      TrimWavFile(reader, writer, startPos, endBytes);
    }
  }
}

private static void TrimWavFile(WaveFileReader reader, WaveFileWriter writer, int startPos, int endPos)
{
  reader.Position = startPos;
  byte[] buffer = new byte[reader.BlockAlign * 1024];
  while (reader.Position < endPos)
  {
    int bytesRequired = (int)(endPos - reader.Position);
    if (bytesRequired > 0)
    {
      int bytesToRead = Math.Min(bytesRequired, buffer.Length);
      int bytesRead = reader.Read(buffer, 0, bytesToRead);
      if (bytesRead > 0)
      {
        writer.Write(buffer, 0, bytesRead);
      }
    }
  }
}
int startPos = 0;
int startBytes = (int)Math.Round(startPoint.TotalMilliseconds * bytesPerMillisecond);
startBytes = startBytes - startBytes % reader.WaveFormat.BlockAlign;
int startPos = startBytes;