Usuário com melhor resposta
Como Fazer Um Gravador de Som Simples?

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
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
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. -
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
-
-
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 -
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
-
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
-