Enregistrement Wave

comemich Messages postés 39 Date d'inscription jeudi 3 février 2005 Statut Membre Dernière intervention 23 août 2017 - 15 nov. 2007 à 22:58
comemich Messages postés 39 Date d'inscription jeudi 3 février 2005 Statut Membre Dernière intervention 23 août 2017 - 10 sept. 2008 à 22:05
J' ai commencé à développer une application en VB.NET qui nécessite d' enregistrer du son.
Je n' ai pas trouvé beaucoup d'exemples de codes souces consacré à ce sujet, et les explications de MSDN m'embrouillent encore plus.

Voici ce que j' ai fait:

' Déclaration de la fonction fournie par Microsoft
Private
Declare
Function mciSendString
Lib "winmm.dll"
Alias "mciSendStringA" (
ByVal lpstrCommand
As
String,
ByVal lpstrReturnString
As
String,
ByVal uReturnLength
As
Integer,
ByVal hwndCallback
As
Integer)
As
Integer
' Routine pour démarer l'enregistrement

Public
Sub Enregistrer()

' Fermeture (au cas où)
mciSendString("close all", vbNullString, 0, 0)

' Ouverture du périphérique MCI
mciSendString("open new type waveaudio alias Son ", vbNullString, 0, 0)

' Qualité du son
mciSendString("set Son samplespersec 44100", vbNullString, 0, 0)

' Nombre de bit
mciSendString("set Son bitspersample 16", vbNullString, 0, 0)

' Nombre de canaux (stéréo)
mciSendString("set Son channels 2", vbNullString, 0, 0)

' Préparation de la capture
mciSendString("seek Son to start", vbNullString, 0, 0)

' Capture
mciSendString("record Son", vbNullString, 0, 0)

End
Sub

' Routine pour terminer l'enregistrement
Public
Sub Sauver(
ByVal Fichier
As
String)
Fichier = Chr(34) & Fichier & Chr(34)

' Arrèter l'enregistrement
mciSendString("stop Son", vbNullString, 0, 0)

' sauvegarder dans le fichier
mciSendString("save Son " & Fichier, vbNullString, 0, 0)

' et fermer le MCI
mciSendString("close son", vbNullString, 0, 0)

End
Sub

Ces deux routines permettent bien de démarer l' enregistrement puis de l' arrêtet en sauvegardant dans le fichier Wave. Mais la qualité du son est très dégradée.

Pourquoi le son enregistré par MCI en 44100 HZ 16 bits est il si mauvais ?
Y a-t-il une autre façon d'enregistrer un wave?.
Il y a beaucoup de programmeurs qui posent des questions dans les forums sur ce sujet, mais personne n' obtient de réponse. Pourquoi ?.

8 réponses

us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
16 nov. 2007 à 15:45
A priori, si tu enregistres déjà un Wave sur ton PC sans passer par la programmation, par exemple avec le Magnétophone de Windows, tu obtiendra aussi un son de mauvaise qualité... Pourquoi ? C'est parce que soit ton Micro est de mauvaise qualité, soit le paramètrage n'est pas bien adapté. Par exemple, il faut souvent coché l'option "l'ampli Micro" dans Volume>paramètre Avancé... Voilà donc, peut-être la raison de l'absence d'explication, puisse que ce n'est pas vraiment un problème de codage, mais de réglage... encore que... qu'on pourrait penser à faire ces réglages par code... mais, mais... hélas ! ces réglages qui améliorent l'enregistrement dépendent aussi beaucoup du matériel de chacun... donc c'est un pb à régler au cas par cas... difficile dans ces conditions de les régler par le biais du codage, en définitive...

Amicalement,
Us.
0
comemich Messages postés 39 Date d'inscription jeudi 3 février 2005 Statut Membre Dernière intervention 23 août 2017
17 nov. 2007 à 00:46
Pas du tout !
Quand j'enregistre avec le magnétophone de windows ou avec un autre logiciel, j'obtient un résultat tout à fait satisfaisant. Ce n'est donc pas un problème de hard ni une question de réglage du mixer audio que je controle parfaitement . J'ai même appris à controler les lignes audio du mixer dans ma programation et cette partie de l'application fonctionne parfaitement.
Dailleurs, le son qui sort de ma carte son (Sound Blaster Live! de Créative) est très bon. Et quand je l'enregistre avec l' API windows ( mciSendString ) j'obtiens un fichier wave 44100 Hz 16 bits stéréo conforme aux paramètres spécifiés dans mon code . Mais quand j'écoute ce fichier avec un player (par exemple Windows Média Player) j'entend un son tout écrasé, tout minable, comme étouffé dans une boite. Le volume est bon mais il n'y a pas d'aigüs et peu de graves.
J'ai beau relire la documentation de Microsoft (en anglais) sur Multimédia Control Interface , je ne vois pas ce qui manque pour que l'enregistrement soit correct.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
17 nov. 2007 à 22:52
Je disais à priori. Maintenant j'ai testé ton code sur VB6, et il marche très bien. Le son sur mon Player (windows player) ne pose aucun problème... donc à postériori, le pb est spécifique à toi... enfin à quelque chose de mal configuré sur ton PC (puisque le matériel est correct)... JE ne connais pas exactement la cause , mais j'émetterai une hypothèse sous forme de question : est-ce un pb avec un codec ?


Amicalement,


Us.


 
0
comemich Messages postés 39 Date d'inscription jeudi 3 février 2005 Statut Membre Dernière intervention 23 août 2017
18 nov. 2007 à 00:25
Merci d' avoir testé mon code. ça me rassure d' apprendre que ça peut marcher, même si mon problème n'est pas réglé. il y a de l'espoir. Depuis 2 semaines que je bute sur ce problème, je commençais à désespérer.


J'y connais rien en codec, mais est ce que c'est pas le même qu'utilise l'API et les autres applications ? .
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
18 nov. 2007 à 11:32
JE ne serais pas de répondre complètement, car je ne sais pas comment se débrouille l'API exactement... mais, tous les programmes qui enregistres ou lit un Wave n'utilisent pas forcément les mêmes Codecs. Bien souvent, il en existe une tripotter... et parfois, (souvent) c'est aussi la jungle ! En effet, certains codecs qu'on installent deviennent prioritaires à la place d'un autre et c'est pas toujours du meilleur effet... enfin, ce n'est qu'une piste de réflexion...


Amicalement,


Us.
0
comemich Messages postés 39 Date d'inscription jeudi 3 février 2005 Statut Membre Dernière intervention 23 août 2017
20 avril 2008 à 21:12
ça fait 6 mois que je cherche une solution. J'ai enfin trouvé. C'est très simple (voir ci dessous) . Il faut définir tous les paramètres de qualité du son dans la même instruction "mciSendString" pour avoir un enregistrement sonore de bonne qualité.



Module



ModuleMCI


' Utilisation du MULTIMEDIA CONTROL INTERFACE de winmm.dll pour enregistrer le son dans un fichier wave






Private



Declare



Function
mciSendString

Lib
"winmm.dll"

Alias
"mciSendStringA" (

ByVal
lpstrCommand

As



String
,

ByVal
lpstrReturnString

As



String
,

ByVal
uReturnLength

As



Integer
,

ByVal
hwndCallback

As



Integer
)

As



Integer






Public



Sub
Enregistrer()


' Fermeture (au cas où)

mciSendString("close all", vbNullString, 0, 0)







' Ouverture du périphérique MCI

mciSendString("open new type waveaudio alias Son ", vbNullString, 0, 0)







' Qualité du son:

mciSendString("set Son samplespersec 44100 bitspersample 16 channels 2 alignment 4 bytespersec 176400", vbNullString, 0, 0)







' Préparation de la capture

mciSendString("seek Son to start", vbNullString, 0, 0)







' Capture

mciSendString("record Son", vbNullString, 0, 0)







End



Sub






Public



Sub
Sauver(

ByVal
Fichier

As



String
)Fichier = Chr(34) & Fichier & Chr(34)


' Arrèter l'enregistrement

mciSendString("stop Son" & Chr(0), vbNullString, 0, 0)







' sauvegarder dans le fichier

mciSendString("save Son " & Fichier & Chr(0), vbNullString, 0, 0)







' et fermer le MCI

mciSendString("close son" & Chr(0), vbNullString, 0, 0)







End



SubEnd





Module
0
nabilG Messages postés 20 Date d'inscription mercredi 18 juin 2003 Statut Membre Dernière intervention 19 juin 2009
10 sept. 2008 à 11:00
Bonjour Comemich,
J'ai utilisé votre exemple pour enregistrer un fichier son wave avec le microphone. Ca marche et ça enregistre, sauf que quand je veux exploiter le fichier dans une autre application qui ne traite que les fichiers son 16 bits, un message me dit que le fichier est 8 bits(Pourtant j'ai mis dans mciSendString 16 bits).
Avez-vous une idée d'où est-ce que ça peut provenir?
Merci.

Avec mes remerciements
0
comemich Messages postés 39 Date d'inscription jeudi 3 février 2005 Statut Membre Dernière intervention 23 août 2017
10 sept. 2008 à 22:05
Comemich
0
Rejoignez-nous