none
Como Fazer Um Gravador de Som Simples? RRS feed

  • Pergunta

  • Olá pessoal! Preciso fazer um gravador de som simples, que utiliza o dispositivo de microfone padrão do Windows como fonte. Procurei em vários sites, porém achei somente um, e não funcionou, não sei por que. Se quiserem ver o projeto, aqui está o link: http://howar.url.ph/VB.NET%20SoundCard%20Recorder.rar

    Abaixo segue o código:

    Option Strict Off
    Option Explicit On
    Imports VB = Microsoft.VisualBasic
    Imports System.Data
    Imports System.IO
    Friend Class frmMain
    	Inherits System.Windows.Forms.Form
       
        Public Function RecordSound(ByRef FileName As String) As Boolean
            'sound aliased by recsound
            cmdRecord.Enabled = False
            Dim Result As Integer
            Dim errormsg As Short
            Dim ReturnString As New VB6.FixedLengthString(1024)
            Dim ErrorString As New VB6.FixedLengthString(1024)
            Dim mssg As New VB6.FixedLengthString(255)
    
            Result = mciSendString("open new Type waveaudio Alias recsound", ReturnString.Value, Len(ReturnString.Value), 0)
            If Not Result = 0 Then
                errormsg = mciGetErrorString(Result, ErrorString.Value, 1024)
                MsgBox(ErrorString.Value, 0, "Error")
            End If
            Result = mciSendString("set recsound time format ms bitspersample " & CShort(sBits) & " channels 2 bytespersec 22500  samplespersec " & sSample, ReturnString.Value, 1024, 0)
            If Not Result = 0 Then
                errormsg = mciGetErrorString(Result, ErrorString.Value, 1024)
                MsgBox(ErrorString.Value, 0, "Error")
            End If
            Result = mciSendString("record  recsound", ReturnString.Value, Len(ReturnString.Value), 0)
            If Not Result = 0 Then
                errormsg = mciGetErrorString(Result, ErrorString.Value, 1024)
                MsgBox(ErrorString.Value, 0, "Error")
            End If
            RecdTime = True
            start = VB.Timer()
            Do Until Not RecdTime
                WaveStatus()
                System.Windows.Forms.Application.DoEvents()
            Loop
    
            Result = mciSendString("save recsound """ & FileName & """", ReturnString.Value, Len(ReturnString.Value), 0)
            If Not Result = 0 Then
                errormsg = mciGetErrorString(Result, ErrorString.Value, 1024)
                MsgBox(ErrorString.Value, 0, "Error")
            End If
            Result = mciSendString("close recsound", ReturnString.Value, 1024, 0)
            If Not Result = 0 Then
                errormsg = mciGetErrorString(Result, ErrorString.Value, 1024)
                MsgBox(ErrorString.Value, 0, "Error")
            End If
    
        End Function
        Private Sub cmdClose_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs)
            Me.Close()
        End Sub
        Private Sub Command1_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Command1.Click
            cdg1Save.ShowDialog()
            txtFileName.Text = cdg1Save.FileName
        End Sub
        Private Sub frmMain_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
            cmdStop.Enabled = False
    
            tspDate.Text = Now
            tspSize.Text = "Tamanho: "
            tspTime.Text = "Tempo Gravado: "
    
            txtFileName.Text = My.Application.Info.DirectoryPath & "\Recorded.wav"
        End Sub
        Private Sub WaveStatus()
    
            Dim mssg As New VB6.FixedLengthString(255)
            Dim i As Integer
            Dim elapsed As Integer
            Dim intSec As Short
            Dim sngMin As Single
            Dim TotalTime As String
    
            elapsed = VB.Timer() - start
    
            If elapsed < 60 Then
                TotalTime = "00:" & VB6.Format(elapsed, "00")
            Else
                intSec = elapsed Mod 60
                sngMin = elapsed \ 60
                TotalTime = VB6.Format(sngMin, "00") & ":" & VB6.Format(intSec, "00")
            End If
    
            tspTime.Text = "Time Recording: " & TotalTime
    
            i = mciSendString("set recsound time format bytes", CStr(0), 0, 0)
            If i <> 0 Then RecdTime = False
    
            i = mciSendString("status recsound length", mssg.Value, 255, 0)
            If i <> 0 Then RecdTime = False
    
            mssg.Value = CStr(CInt(mssg.Value) / 1024)
            tspSize.Text = "File Size: " & VB6.Format(Str(CDbl(mssg.Value)), "######.00") & " kb"
    
        End Sub
        Private Sub cmdStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
            If cmdRecord.Enabled = False Then
                RecdTime = False
            End If
            cmdRecord.Enabled = True
            cmdStop.Enabled = False
        End Sub
        Private Sub cmdRecord_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
            If txtFileName.Text <> "" Then
                'UPGRADE_WARNING: Dir has a new behavior. Click for more: 'ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?keyword="9B7D5ADD-D8FE-4819-A36C-6DEDAF088CC7"'
                If Dir(txtFileName.Text) <> "" Then
                    Kill((txtFileName.Text))
                End If
                cmdStop.Enabled = True
                lSeconds = 1
                Call RecordSound(txtFileName.Text)
            End If
        End Sub
    End Class


    • Editado Free4k segunda-feira, 20 de janeiro de 2014 00:40
    segunda-feira, 20 de janeiro de 2014 00:11

Respostas

  • Para Gravar, usa o exemplo abaixo em uma classe separada e com o arquivo já gravado, faz as outras operações que quer como pegar o tamanho;

    Imports System.Runtime.InteropServices
    Imports System.Text
    
    Public Class GravarMicrofone
    
      <DllImport("winmm.dll")> _
      Private Shared Function mciSendString(ByVal command As String, ByVal buffer As StringBuilder, ByVal bufferSize As Integer, ByVal hwndCallback As IntPtr) As Integer
      End Function
    
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
          Dim i As Integer
          i = mciSendString("open new type waveaudio alias capture", Nothing, 0, 0)
          Console.WriteLine(i)
    
          i = mciSendString("record capture", Nothing, 0, 0)
          Console.WriteLine(i)
          Me.Label1.Text = "Recording"
        Catch ex As Exception
          Console.WriteLine(ex.Message)
        End Try
      End Sub
    
      Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Try
          Dim i As Integer
          i = mciSendString("save capture " & "d:\xvw.wav", Nothing, 0, 0)
          i = mciSendString("close capture", Nothing, 0, 0)
          Me.Label1.Text = "Idle"
        Catch ex As Exception
          Console.WriteLine(ex.Message)
        End Try
      End Sub
    
    End Class


    Bruno Ferreira de Souza
    MVP - Microsoft Valuable Professional
    MCTS .NET Framework - Windows Applications
    MCPD .NET Framework - Windows Applications
    www.maestrodotnet.com.br
    @BrunoMaestro

    • Sugerido como Resposta Herbert Lausmann quarta-feira, 29 de janeiro de 2014 10:30
    • Marcado como Resposta Free4k quarta-feira, 29 de janeiro de 2014 18:28
    quarta-feira, 29 de janeiro de 2014 06:59

Todas as Respostas

  • Boa tarde Howar,

    Tem como postar o link do tutorial que você seguiu?

    E qual é o problema que está acontecendo no seu código?

    Att,


    Giovani Cruzara – Microsoft Contingent Staff

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    Msdn Community Support

    Por favor, lembre-se de “Marcar como Resposta” as respostas que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    terça-feira, 28 de janeiro de 2014 18:07
  • Para Gravar, usa o exemplo abaixo em uma classe separada e com o arquivo já gravado, faz as outras operações que quer como pegar o tamanho;

    Imports System.Runtime.InteropServices
    Imports System.Text
    
    Public Class GravarMicrofone
    
      <DllImport("winmm.dll")> _
      Private Shared Function mciSendString(ByVal command As String, ByVal buffer As StringBuilder, ByVal bufferSize As Integer, ByVal hwndCallback As IntPtr) As Integer
      End Function
    
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
          Dim i As Integer
          i = mciSendString("open new type waveaudio alias capture", Nothing, 0, 0)
          Console.WriteLine(i)
    
          i = mciSendString("record capture", Nothing, 0, 0)
          Console.WriteLine(i)
          Me.Label1.Text = "Recording"
        Catch ex As Exception
          Console.WriteLine(ex.Message)
        End Try
      End Sub
    
      Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Try
          Dim i As Integer
          i = mciSendString("save capture " & "d:\xvw.wav", Nothing, 0, 0)
          i = mciSendString("close capture", Nothing, 0, 0)
          Me.Label1.Text = "Idle"
        Catch ex As Exception
          Console.WriteLine(ex.Message)
        End Try
      End Sub
    
    End Class


    Bruno Ferreira de Souza
    MVP - Microsoft Valuable Professional
    MCTS .NET Framework - Windows Applications
    MCPD .NET Framework - Windows Applications
    www.maestrodotnet.com.br
    @BrunoMaestro

    • Sugerido como Resposta Herbert Lausmann quarta-feira, 29 de janeiro de 2014 10:30
    • Marcado como Resposta Free4k quarta-feira, 29 de janeiro de 2014 18:28
    quarta-feira, 29 de janeiro de 2014 06:59
  • Olá! Testei e adicionei um SaveFileDialog, ficou bom, só achei estranho uma coisa: a gravação ficou com chiu. O que será que é?
    quarta-feira, 29 de janeiro de 2014 12:34
  • Provavelmente configuração do seu microfone ou da sensibilidade. Aqui funcionou normal. Favor marcar a resposta que te ajudou.


    Bruno Ferreira de Souza
    MVP - Microsoft Valuable Professional
    MCTS .NET Framework - Windows Applications
    MCPD .NET Framework - Windows Applications
    www.maestrodotnet.com.br
    @BrunoMaestro

    quarta-feira, 29 de janeiro de 2014 17:06
  • Ok, mas testei com o gravador de som do Windows, e ficou em alta qualidade, tenho uma placa de som especializada para isso. E será que tem como eu colocar um ProgressBar como bateria de frequências?
    • Editado Free4k quarta-feira, 29 de janeiro de 2014 17:54
    quarta-feira, 29 de janeiro de 2014 17:53
  • Você fala na entrada do áudio ou na saída? Isso é complicado de fazer, você tem que estudar sobre bibliotecas de áudio e drawing. De qualquer forma, se a dúvida do post foi respondida finaliza ela e abre outra com o outro tema.


    Bruno Ferreira de Souza
    MVP - Microsoft Valuable Professional
    MCTS .NET Framework - Windows Applications
    MCPD .NET Framework - Windows Applications
    www.maestrodotnet.com.br
    @BrunoMaestro


    • Editado Bruno Maestro quarta-feira, 29 de janeiro de 2014 18:16
    quarta-feira, 29 de janeiro de 2014 18:15
  • + ou -, mas obrigado!
    • Editado Free4k quarta-feira, 29 de janeiro de 2014 18:29
    quarta-feira, 29 de janeiro de 2014 18:28