Pourquoi certains fichiers wav sont-ils lus dans mon application c # dirigée mais d'autres pas?

StackOverflow https://stackoverflow.com/questions/100654

  •  01-07-2019
  •  | 
  •  

Question

J'ai une application c # qui lit de simples fichiers wav via Directound. Avec les données de test que j'ai eues, le code a bien fonctionné. Cependant, lorsque j’utilisais des données du monde réel, une erreur très inutile s’était produite lors de la création du tampon secondaire: "ArgumentException: la valeur ne se situe pas dans la plage attendue".

Les wavs de test avaient un débit binaire de 512 kbps, une taille d’échantillon audio de 16 bits et un taux d’échantillonnage audio de 32 kHz. Les nouvelles ondes sont respectivement de 1152 kbps, 24 bits et 48 kHz. Comment puis-je obtenir directement du son pour gérer ces valeurs plus grandes, ou sinon, comment puis-je détecter par programme ces valeurs avant de tenter de lire le fichier?

c’est géré DirectX v9.00.1126 que j’utilise, et j’ai inclus un exemple de code ci-dessous:

using DS = Microsoft.DirectX.DirectSound;  
...  
DS.Device device = new DS.Device();
device.SetCooperativeLevel(this, CooperativeLevel.Normal);  
...
BufferDescription bufferDesc = new BufferDescription();
bufferDesc.ControlEffects = false;  
...
try
{
    SecondaryBuffer sound = new SecondaryBuffer(path, bufferDesc, device);
    sound.Play(0, BufferPlayFlags.Default);
}
...

Information supplémentaire: les fichiers wav du monde réel ne seront pas lus dans le lecteur Windows Media non plus, ce qui signifie qu'un codec est nécessaire pour la lecture du fichier, alors qu'ils fonctionnent correctement dans winamp.

Informations complémentaires 2: en comparant les octets des données de test de travail avec les mauvaises données du monde réel, je peux voir qu'au-delà du bloc RIFF, les mauvaises données ont un "bext". chunk, que l’internet m’informe, c’est les métadonnées associées à l’extension audio broadcast, alors que les données de test vont directement dans un chut fmt. Il y a / un / un bloc fmt dans les mauvaises données, donc je ne sais pas s'il est mal formé ou si les chargeurs devraient chercher plus loin pour les données fmt. Je peux voir si je peux obtenir des informations sur ce bloc rouge bext auprès des personnes qui m'ont fourni les données. S'ils peuvent le supprimer, mon code peut toujours fonctionner.

Était-ce utile?

La solution

Toutes les cartes son ne prennent pas en charge la lecture d’échantillons 24 bits et, même dans ce cas, elles doivent souvent être ouvertes exclusivement dans ce mode. Il existe un problème similaire avec les taux d'échantillonnage. Votre carte son fonctionne peut-être à 44,1 kHz, auquel cas il est nécessaire de ré-échantillonner 48 kHz pour pouvoir le lire.

J'ai écrit une bibliothèque audio .NET open source intitulée NAudio qui vous permettra de découvrir quel taux d'échantillonnage et quelle profondeur de bits un fichier WAV donné est. Il propose également différentes méthodes de lecture audio (par exemple, via les API Wav ...) et la possibilité de ré-échantillonner des fichiers à l'aide de l'objet DMO resampler.

Autres conseils

En plus du problème d’échantillonnage, WAV n’est qu’un format de conteneur et l’audio peut être compressé dans n’importe quelle myriade de formats audio (tout comme AVI est un conteneur de vidéo). Vous pouvez donc utiliser un outil comme GSpot pour savoir si votre fichier WAV est codé dans un fichier. format non standard dans et installez le codec. Winamp a plus de codecs installés par défaut que WMP, ce qui expliquerait que Winamp le lit et que WMP ne le fait pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top