2017-02-11 1 views
2

Je suis en train de découper un fichier en utilisant le code de hereCoupez un fichier 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); 
      } 
     } 
    } 
} 

J'ai écrit exactement ce qui est là-dedans, mais quand j'ouvre le fichier i parés il est dit qu'il est corrompu.

Comment fonctionne ce code? Le while (reader.Position < endPos) est toujours vrai et le reader.Position ne change pas.

Édition 1 Les autres if() sont identiques à l'autre mais je l'ai mis juste pour être sûr.

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

Répondre

0

Je trouve le Soluton. Je devais écrire writer.Dispose() après il était fini. Comme ça:

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

étrange - c'est ce que la déclaration d'utilisation aurait dû faire pour vous –

1

vous devez sortir de la boucle while si bytesRequired <= 0 ou si bytesRead == 0

+0

je l'ai fait et je suis toujours obtenir ceci: https://i.stack.imgur.com/wDT0S.png Vous avez une idée pourquoi vous? – EldarGoren

+0

est le fichier d'entrée jouable? quel est le waveformat? –

+0

L'entrée est jouable et c'est un fichier wav. – EldarGoren