2014-09-11 6 views
0

Lors de la lecture d'un fichier WAVE en tant que données binaires, j'obtiens la longueur du bloc 'data' des octets correspondants (Subchunk2Size).Comment obtenir la longueur exacte des données d'onde avec MediaFoundationReader?

Mais quand j'utilise NAudio MediaFoundationReader je reçois sligtly valeur différente de la taille des données, car il est calculé comme:

private long GetLength(IMFSourceReader reader) 
    { 
     ... 
     var lengthInBytes = (((long)variant.Value) * waveFormat.AverageBytesPerSecond)/10000000L; 
     ... 
     return lengthInBytes; 
    } 

Y at-il un moyen d'obtenir la longueur exacte des données witn NAudio MediaFoundationReader?

+0

Si vous voulez la longueur des données en octets d'un fichier WAV, pourquoi ne pas simplement utiliser WaveFileReader de NAudio et regarder la propriété Length? –

+0

Salut Mark, merci pour votre lib. J'utilise MediaFoundationReader, parce que je veux lire le son d'autant de types audio * et vidéo * que possible. Et MediaFoundationReader fait l'affaire. – Vladislav

Répondre

0

Voici ce que j'ai trouvé pour la première fois: utilisez List<Int32> au lieu de array pour stocker les données, donc je n'ai pas besoin de connaître la longueur exacte des données maintenant.

La solution suivante - est d'extraire les données sonores au fichier temp wav avec MediaFoundationReader et traiter ses données plus tard avec WaveFileReader (et la propriété Length). Voici comment je l'ai fait:

private void ExtractAndResampleAudio(WaveFormat resampleFormat) 
    { 
     using (var reader = new MediaFoundationReader(this.Filename)) 
     { 
      if (NeedResample(reader.WaveFormat, resampleFormat)) 
      { 
       using (var resampler = new MediaFoundationResampler(reader, CreateOutputFormat(resampleFormat))) 
       { 
        WaveFileWriter.CreateWaveFile(this.TempFilename, resampler); 
       } 
      } 
      else 
      { 
       WaveFileWriter.CreateWaveFile(this.TempFilename, reader); 
      } 
     } 
    } 

Cette solution a un effet secondaire étrange - sur Windows 7 MediaFoundationReader extrait Données légèrement moins. Sur Windows 8 longueur de données copiées correspondent au fichier source. J'ai signalé un problème au projet NAudio: https://naudio.codeplex.com/workitem/16453

Questions connexes