jueves, 16 de febrero de 2012

Crear archivo WAV

Hace unos pocos días me toco capturar sonido por el microfono y asociar este a un registro de datos, bueno la verdad es que no es nada nuevo, pero para los que siguen mi blogs y no les ha tocado hacer esto les ayudaré a hacerlo.

Para ello utilizaremos las ventajas que ofrece la librería de Windows "winmm.dll", yo me he guiado usando una un tutorial de Visual Basic 6 el cual lo pueden consultar Aquí.

Desde programa y usando esta librería podremos crear un archivo .wav. Ya he subido un detalle de como despues pueden comprimir a .mp3 en archivo creado jejeje.

Bueno, el uso de esta librería es muy simple, solo debemos instanciar una función desde nuestro programa y enviarle las opciones que deseamos ejecutar, para ello:

En el formulario crearemos la siguiente variable, que hará referencia a la función de la dll que vamos a utilizar de la siguiente forma.

Private Declare Function mciSendString Lib _
"winmm.dll" Alias "mciSendStringA" _
(ByVal lpstrCommand As String, _
ByVal lpstrReturnString As String, _
ByVal uReturnLength As Long, _
ByVal hwndCallback As Long) As Long

luego en el método que atenderá la captura de sonido, debemos escribir la siguiente llamada:

SendCommand("open new type waveaudio alias WavFile")
SendCommand("record WavFile insert")

No deben cambiar ni una tilde, ya que la dll ase uso de los texto para ejecutar las instrucciones.

Deben tener en cuenta que, el máximo de grabación estará dado por la capacidad de almacenamiento del disco, ya que en estos momentos estamos capturando la información y la estamos dejando en memoria, por lo cual se debe controlar el período máximo de grabación, mediante un timer o algo por el estilo.

Una vez que ya han capturado el sonido que deseaban, el siguiente paso es guardarlo a lo cual deben ejecutar

SendCommand("save WavFile c:\Ruta\..\wav.wav")

Con esto, ya hemos creado un archivo .wav. Lo que queda ahora es cerrar el proceso, para ello, debemos utilizar la siguiente linea de comando:

SendCommand("close WavFile")


Mi método controla los dos pasos, por lo cual les escribo un ejemplo reducido de este:

Dim m_Monitor As Boolean = False

Private Sub sbtRekord_Click _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles sbtRekord.Click

Try
If Not Me.m_Monitor Then

Me.m_Monitor = True
sender.Text = "Terminar la grabación"

SendCommand("open new type waveaudio alias WavFile")
SendCommand("record WavFile insert")

Else

Me.m_Monitor = True
sender.Text = "Iniciar la grabacion"

If Not System.IO.Directory.Exists("c:\Ruta\..\") Then
System.IO.Directory.CreateDirectory("c:\Ruta\..\")
End If

If System.IO.File.Exists("c:\Ruta\..\wav.wav") Then
System.IO.File.Delete("c:\Ruta\..\wav.wav")
End If

SendCommand("save WavFile " & dir_path + arv_name)
SendCommand("close WavFile")

End If

Catch ex As Exception
MessageBox.Show(ex.ToString())
End Try
End Sub

Por ultimo, siempre no deben olvidar de cerrar el proceso, por lo cual en el método que atiende el evento Closing del formulario deben cerrar la llamada a la clase, como se muestra acontinuación:

Private Sub Frm_Closing _
(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) _
Handles MyBase.Closing
Try

SendCommand("close WavFile")

Catch ex As Exception
MessageBox.Show(ex.ToString())
End Try
End Sub

Bueno amigos, papita pal loro, si no les funciona, es que tal vez primero deben pasar por las nociones basicas de programación en Visual Basic, no lo puedo explicar más facil.

Salu2




No hay comentarios: