2017-02-11 7 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)은 항상 true이고 reader.Position은 변경되지 않습니다.

편집 1 else if()는 else와 동일하지만 확실하게 넣습니다. bytesRequired <= 0가 또는 bytesRead == 0

답변

0

경우 나는 soluton를 찾을 경우 while 루프의 탈옥해야

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

이상한 - 그게 당신을 위해 성명을 썼음에 틀림 없어. –

1

. 완료 후 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

나는 그것을했고, 나는 아직도이 받고 있어요 : https://i.stack.imgur.com/wDT0S.png 당신이 어떤 생각 이유가 있습니까를? – EldarGoren

+0

은 재생할 수있는 입력 파일입니까? waveformat 무엇입니까? –

+0

입력은 재생 가능하며 wav 파일입니다. – EldarGoren