2017-02-11 88 views
2

我试图从here修剪wav文件

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); 
     } 
    } 
} 

private static void TrimWavFile(WaveFileReader reader, WaveFileWriter writer, int startPos, int endPos) 
{ 
    reader.Position = startPos; 
    byte[] buffer = new byte[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.WriteData(buffer, 0, bytesRead); 
      } 
     } 
    } 
} 

修剪使用代码的文件我写的究竟什么在那里,但是当我打开我修剪的文件时,它说,他已损坏。

此代码是如何工作的? while (reader.Position < endPos)始终为真,并且reader.Position不会更改。

编辑1 else if()与else相同,但我只是为了确定。

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; 
      } 
     } 

回答

0

我发现soluton。我必须写作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(); 
     } 
    } 
+0

很奇怪 - 这就是使用陈述应该为你做的 –

1

你应该跳出while循环,如果bytesRequired <= 0或者bytesRead == 0

+0

我做到了,我仍然得到这个: https://i.stack.imgur.com/wDT0S.png 你有任何想法,为什么? – EldarGoren

+0

是可以输入的文件吗?什么是波形? –

+0

输入是可播放的,它是一个wav文件。 – EldarGoren