2010-09-29 25 views
2

J'ai capturé de l'audio en utilisant le mode de capture en boucle. La forme d'onde capturée est une forme d'onde de 32 bits. J'ai du mal avec la conversion de cette forme d'onde de 16 bits, donc les encodeurs comme lame peuvent y faire face (il est dit Format de données non pris en charge: 0x0003).Conversion d'une forme d'onde de 32 bits en une forme d'onde de 16 bits

J'ai essayé de déplacer les bits (pas mon point fort) dans le flux d'onde lui-même de 32 bits à 16 bits, mais le résultat semble toujours déformé.

La classe Wave32To16Stream semble sauter sur cette affaire: si (sourceStream.WaveFormat.Encoding = WaveFormatEncoding.IeeeFloat!) Throw new ApplicationException ("Seulement 32 bits à virgule flottante pris en charge");

Idéalement, je voudrais juste capturer directement à 16 bits, est-il impossible de définir la profondeur de bits de capture? Sinon, quelqu'un pourrait-il m'aider à convertir le flux d'ondes?

Un exemple d'une forme d'onde capturée se trouvent ici: http://dl.dropbox.com/u/454409/test.wav (10mb)

Je voudrais aussi se contenter d'un moyen de coder ce mp3 avec boiteux, j'ai essayé chaque permutation des paramètres que je peux penser à l'obtenir pour accepter le fichier wave. Ce qui est intéressant, c'est Audacity (qui utilise lame_enc pour encoder des mp3) a été capable de créer un mp3 à partir de la forme d'onde (mais peut-être Audacity le convertit automatiquement en 16bit avant de le passer en lame).

Répondre

3

Format 0x0003 est en fait ieeeFloat, vous ne devriez pas obtenir cette exception. Mieux vaut vérifier la valeur lue. Vous ne pouvez pas convertir les valeurs avec le décalage de bit, vous devez convertir de float à court. Un casting simple fait le travail.

+0

Cela m'a pointé dans la bonne direction, a résolu mon problème. – hreinn1000

2

Sox peut convertir cela pour vous.

http://sox.sourceforge.net/

les lignes de commande appropriés:

http://sox.sourceforge.net/Docs/FAQ

sox tout fichier -b 16 outfile taux -I 22050 tramage -s

N.B. Le rééchantillonnage et le tramage nécessitent une certaine marge. Si SoX signale qu'un quelconque écrêtage s'est produit pendant le traitement , alors la conversion devrait être refaite avec une certaine atténuation, par ex.

SOX 16 gain de outfile de tout fichier -1 taux 44100 tramage -s

+0

Il y a un peu de magie impliquée dans la conversion en 16 bits correctement. L'erreur d'arrondi est audible lors de la lecture sur les volumes.Sox a des shapers de bruit plutôt intelligents qui sont capables de rendre l'erreur d'arrondi inaudible en la cachant dans des endroits inaudibles. –

1

Si votre format 32 bits est flottant, il est probable que les valeurs de l'échantillon vont de -1 à 1. Pour convertir en 16 bits (entiers), vous devez multiplier par 32767 et convertir en INT16. Si la plage de flottant de 32 bits est supérieure à -1..1, vous devez rechercher les valeurs minimum et maximum et calculer un facteur d'échelle qui récupère les échantillons dans la plage INT16.

Vous devrez peut-être ajouter un tramage.