十万火急!!!各位大哥、大姐:帮我解决一下用API录音的问题
我在用API函数mcisendstring录音时,返回植是成功的,可就不能实现录音功能,请各位千万要帮忙!!! 问题点数:0、回复次数:4Top
1 楼JennyVenus()回复于 2003-04-01 01:41:11 得分 0
Public Sub RecordWave(TrackNum As Integer, Filename As String)
' Tracknum: track to record
' Filename: file to save wave as
On Local Error Resume Next
Dim i As Long, RS As String, cb As Long, t#
RS = Space$(128)
i = mciSendString("stop cdaudio", RS, 128, cb)
i = mciSendString("close cdaudio", RS, 128, cb)
Kill filename
RS = Space$(128)
i = mciSendString("status cdaudio position track " & TrackNum, RS, 128, cb)
i = mciSendString("open cdaudio", RS, 128, cb)
i = mciSendString("set cdaudio time format milliseconds", RS, 128, cb)
i = mciSendString("play cdaudio", RS, 128, cb)
i = mciSendString("open new type waveaudio alias capture", RS, 128, cb)
i = mciSendString("record capture", RS, 128, cb)
t# = Timer + 1: Do Until Timer > t#: DoEvents: Loop
i = mciSendString("save capture " & filename, RS, 128, cb)
i = mciSendString("stop cdaudio", RS, 128, cb)
i = mciSendString("close cdaudio", RS, 128, cb)
End Sub
Top
2 楼since1990(level)回复于 2003-08-08 22:24:36 得分 0
相关文章,但愿对你有帮助:
http://www.yesky.com/20011222/211169.shtml
http://expert.csdn.net/Expert/topic/1601/1601749.xml?temp=.7656366
http://expert.csdn.net/Expert/topic/1494/1494837.xml?temp=.2378046
http://expert.csdn.net/Expert/topic/1489/1489277.xml?temp=.8521845
http://expert.csdn.net/Expert/topic/1671/1671411.xml?temp=2.701968E-02
http://expert.csdn.net/Expert/topic/1821/1821309.xml?temp=.3198358
http://expert.csdn.net/Expert/topic/1683/1683789.xml?temp=.7732355
http://expert.csdn.net/Expert/topic/1681/1681224.xml?temp=.3458063
http://expert.csdn.net/Expert/topic/1671/1671417.xml?temp=.5001337
http://expert.csdn.net/Expert/topic/1690/1690679.xml?temp=.7765619
http://expert.csdn.net/Expert/topic/1844/1844862.xml?temp=2.582949E-02
http://expert.csdn.net/Expert/topic/1845/1845323.xml?temp=.1655084
http://expert.csdn.net/Expert/topic/1841/1841248.xml?temp=2.329654E-02
http://expert.csdn.net/Expert/topic/1835/1835231.xml?temp=.8389093
http://expert.csdn.net/Expert/topic/1906/1906002.xml?temp=.622265
http://expert.csdn.net/Expert/topic/1383/1383546.xml?temp=.2014582
http://expert.csdn.net/Expert/topic/1562/1562834.xml?temp=.5607111
http://expert.csdn.net/Expert/topic/1898/1898040.xml?temp=4.969424E-02
http://expert.csdn.net/Expert/topic/1688/1688520.xml?temp=.4859125
http://expert.csdn.net/Expert/topic/1987/1987118.xml?temp=.3315851
http://expert.csdn.net/Expert/topic/1984/1984984.xml?temp=.465008
http://expert.csdn.net/Expert/topic/1358/1358689.xml?temp=.1235468
http://expert.csdn.net/Expert/topic/1383/1383546.xml?temp=.2014582
一段示例代码:
Public Sub RecordWave(TrackNum As Integer, Filename As String)
' Tracknum: track to record
' Filename: file to save wave as
On Local Error Resume Next
Dim i As Long, RS As String, cb As Long, t#
RS = Space$(128)
i = mciSendString("stop cdaudio", RS, 128, cb)
i = mciSendString("close cdaudio", RS, 128, cb)
Kill filename
RS = Space$(128)
i = mciSendString("status cdaudio position track " & TrackNum, RS, 128, cb)
i = mciSendString("open cdaudio", RS, 128, cb)
i = mciSendString("set cdaudio time format milliseconds", RS, 128, cb)
i = mciSendString("play cdaudio", RS, 128, cb)
i = mciSendString("open new type waveaudio alias capture", RS, 128, cb)
i = mciSendString("record capture", RS, 128, cb)
t# = Timer + 1: Do Until Timer > t#: DoEvents: Loop
i = mciSendString("save capture " & filename, RS, 128, cb)
i = mciSendString("stop cdaudio", RS, 128, cb)
i = mciSendString("close cdaudio", RS, 128, cb)
End Sub
Top
3 楼since1990(level)回复于 2003-08-08 22:28:57 得分 0
这些问题解决的关键是:了解wav的文件格式,可参考:
Windows声音文件.WAV文件格式:
http://www.csdn.net/Dev/Format/sound/wave.htm
WAVE文件格式及压缩方法:
http://www.csdn.net/Dev/Format/windows/wavec.htm
转贴:
===================================
VB制作不受限制的录音机
郭东毅
说起录音机程序,大家都会想起Windows自带的那个,但是它有一个非常明显的缺点──有时间限制,录制最长时间不超过60秒,否则就会停下,必须自己按下“录音”键才可以继续录音。
其实,我们可以用VB来自己编一个不受时间限制的录音机,甚至连Windows API都可以不用就能够实现。下面笔者向大家介绍具体的实现方法:
1.首先新建一个标准的EXE工程。我们需要两个Label控件,一个MMContrl控件,一个CommonDialog控件,一个Slider控件。两个Label控件分别用来显示录音的总时间和当前的录音时间。MMContrl控件用来支持录音和播放,CommonDialog控件用来打开和保存声音文件,Slider控件是用来直观地显示录音机的状态。
注:MMContrl控件、CommonDialog控件和Slider控件都不是默认的内部控件,需要添加(在控件工具箱上用右键,选“部件”,在控件列中复选Microsoft Common Dialog Control 6.0(SP3)、Microsoft Multimedia Control 6.0 (SP3)、Microsoft Windows Common Controls 6.0)。
2.主表单命名为frmMain;把Label控件命名为lblNow和lblTotal,Caption命名为“现在时间”和“总共时间”;把MMContrl控件命名为mci,DeviceType设置为WAVEAudio,FileName设置为c:\windows\temp\~temp.wav(在Windows的临时文件夹中生成临时录音文件,该文件实际上并不存在);把CommonDialog控件命名为cdlg,Filter设置为 声音(波形)文件|*.wav;Slider控件命名为sld,Enable设置为False。
3.用菜单编辑器给主表单添加菜单,主菜单项只有一个“文件(mnuFile)”,次级菜单有“新建(mnuFileNew)”、“打开(mnuFileOpen)”、“另存为(mnuFileSaveAs)”,“退出(mnuFileExit)”。
4.一切准备就绪的话,就可以开始了,程序源代码如下:
Option Explicit
Dim blnDirty As Boolean
Dim intResult As Integer
Private Sub Form_Load()
mci.Command = "Open" '打开准备好的文件
mci.TimeFormat = 1 '时间格式设置为秒
blnDirty = False '预先把文件更改设置为否
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If blnDirty = True Then
intResult = MsgBox("需要保存吗?", vbYesNoCancel + vbQuestion, "已经有更改!")
Select Case intResult
Case vbYes
cdlg.CancelError= True ’把取消错误打开
On Error GoTo ccancel ’设置错误拦截
cdlg.ShowSave
mci.FileName=cdlg.FileName
mci.Command="Save"
frmMain.MousePointer=11
mci.Command="close"
blnDirty=False
Case vbNo
mci.Command="close"
blnDirty=False
Case vbCancel
ccancel:
Cancel=1
End Select
frmMain.mousepointer=0
End If
End Sub
Private Sub mci_RecordClick(Cancel As Integer)
blnDirty = True
End Sub
Private Sub mci_StatusUpdate()
lblNow.Caption = "现在时间: " & mci.Position / 1000 & " 秒" '现在时间显示
lblTotal.Caption = "总时间: " & mci.Length / 1000 & " 秒" '总共时间显示
sld.Value = mci.Position / 1000 '滑动条的位置显示
If mci.Mode = mciModeRecord Then
If sld.Value = sld.Max Then '自动加时间
sld.Max=sld.Max + 10
End If
End If
End Sub
Private Sub mci_StopClick(Cancel As Integer)
If mci.Mode = mciModeRecord Then
If sld.Value > 0 Then'期间如果按下了stop键,那么去掉Slider多余的部分
sld.Max = sld.Value
End If
End If
End Sub
Private Sub mnuFileExit_Click()
Unload Me
End Sub
Private Sub mnuFileNew_Click()
If blnDirty = True Then ’如果正在录音的话
intResult = MsgBox("需要保存吗?", vbYesNo + vbQuestion, "已经有了修改!")
Select Case intResult
Case vbYes
cdlg.CancelError = True
On Error GoTo ccancel
cdlg.ShowSave
mci.FileName = cdlg.FileName
mci.Command = "Save"
frmMain.MousePointer = 11
GoTo ExitFileNew
Case vbNo
GoTo ExitFileNew
End Select
ccancel:
Exit Sub
End If
ExitFileNew:
frmMain.MousePointer = 0
mci.Command = "close"
mci.Command = "open"
blnDirty = False
End Sub
Private Sub mnuFileOpen_Click()
cdlg.CancelError = True
On Error GoTo CancelOpen
cdlg.ShowOpen
mci.Command = "close" ’打开新的文件之前先要关闭已经打开的播放/录音
mci.FileName = cdlg.FileName
frmMain.MousePointer = 11
mci.Command = "open"
blnDirty = False
frmMain.MousePointer = 0
CancelOpen:
Exit Sub
End Sub
Private Sub mnuFileSaveAs_Click()
cdlg.Flags=cdlOFNOverwritePrompt+cdlOFNNoChangeDir+cdlOFNHideReadOnly’确认保存是否覆盖原来的文件以及保存的位置是打开的位置、不显示“只读”复选
cdlg.ShowSave
mci.FileName = cdlg.FileName
frmMain.MousePointer = 11
blnDirty = False
frmMain.MousePointer = 0
End Sub
这样,我们的录音机程序就编写完了。大家还可以在这个基础上按照自己的喜好来做进一步的修改,这个录音机程序不仅可以录音,也可以播放,它是没有录音时间限制的。至于它究竟可以录多久,笔者尝试用它录制了一个长达3个小时的文件,是完全没有问题的。
在你的程序里调用录音机
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Private Sub Form_Load()
ShellExecute Me.hwnd, "open", "C:\WINDOWS\system32\sndrec32.exe", vbNullString, vbNullString, SW_SHOW
End Sub
Top
4 楼since1990(level)回复于 2003-08-08 22:30:42 得分 0
编制自已的电话录音小程序
2001-12-22· · ··Yesky
1 2 下一页
或许你会认为用计算机进行电话录音需要昂贵的专用软件,其实只要懂得VB和Access的一些基本知识,我们也可以自己制作一个具备电话录音、录音数据保存、查询功能的小系统。大概只需1500元左右,其费用主要用于增添所需的声卡、音箱及具有语音功能的Modem(当然还有你的脑力劳动),比起两三万元的专用录音软件,可以说是物美价廉了。
首先介绍该系统的工作原理:利用VB5.0的OLE容器控件,在运行时创建嵌入对象的方法,激活在WIN95注册过的录音软件,将输入到声卡的电话语音信号录制为WAV文件,嵌入OLE容器控件中。由于把OLE容器控件与某个数据库绑定,在声音文件嵌入OLE容器控件的同时也存入了数据库。以下将详细地介绍小系统的实现过程,主要有设备的连接、数据库的建立、简单的VB编程。
一、设备的连接
设备的连接主要指Modem与电话线、电话机,Modem与声卡之间的连接方式。先将墙上的电话进线插到Modem的接口上,再用另一根电话线接在Modem与电话机之间,把Modem与电话机串联起来。Modem与电话机之间的顺序必须被考虑到。如果电话进线先进入电话机,当提起电话听筒时,信号将先被电话机截取,而不能进入Modem。接下来用双向音频输入输出线把Modem的SPK端口和声卡的LINE INC端口连起来;将Modem的声音信号输入到声卡。好了,完成设备的连接后,我们就可以开始进行软件方面的制作了。
二、用Access建立一个收藏录音数据的数据库
首先建立一个存放声音数据的数据库,数据库可以是存储在Microsoft Jet数据库引擎中的Microsoft
Access、dBASE、Microsoft Foxpro、Excel等。由于需保存的数据并不复杂,我选用了小型而易用的Microsoft Access97,建立一个名为Recorder的数据库来管理录音数据。在Recordeer数据库中生成表Recording,该表包含四个字段:ID、录音文件、Day、Time。结构如下:
字段名称 数据类型 字段属性
ID 自动编号 递增
录音齐件 OLE对象
Day 日期/时间 默认值=Date();格式=长日期
Time 日期/时间 默认值=Time();格式=长时间
把数据库Recorder保存在C:\下,以待后用。数据库方面的工作暂时到此为止,接着将要用VB来编写一个小程序,实现录音、自动将数据存入数据库的功能。
编制自已的电话录音小程序
2001-12-22· · ··Yesky
上一页 1 2
三、用VB5.0 建立录音小程序
在VB5.0下新建一“标准EXE”工程,打开工程中的空白窗体Form1。在Form1上添加各种控件。
1.在Form1上添加Data控件
将Data控件添加到窗体上,Data控件属性设置如下:
(名称) Data1
Connect Access
DatabaseName C:\RECORDER.mdb
Recordsource recording
以上属性设置把Data控件绑定到刚才建立的Access数据库Recorder的recording表。
2.在Form1上添加Text Box控件
在Form1上添加三个Text Box控件,并在适当位置增添相应的标签。文本框属性设置如下:
Text Box控件1 Text Box控件2 Text Box控件3
(名称) Text1 Text2 Text3
Data Field ID Day Time
Datasource Data1 Data1 Data1
以上属性设置使三个Text Box绑定到Data控件,用于从与Data控件连接的数据库中分别显示字段ID、Day、Time。
3.在Form1上添加OLE容器控件
在Form1上添加OLE容器控件,属性设置如下:
(名称) OLE1
Data Field 录音文件
Datasource Data1
Autoactivate 2-Doubleclick
通过属性设置把它与Data控件绑定,从Recorder数据库中显示字段“声音文件”。当OLE容器中的录音数据被更新时,被更新或新增的声音对象将自动被写回数据库。当双击OLE容器中的数据时,将自动播放声音文件。
4.在Form1上添加Command Button控件
添加两个Command Button控件到Form1上,其中一个命令按钮用于调用录音机以录制通话数据,并将录音的声音数据嵌入到OLE容器中。该按钮属性设置如下:
(名称) Command1
Caption 开始录音
双击Command1,在Private Sub Command1_Click()中输入以下代码:
Data1.DatabaseName="C:\recorder.mdb"
Data1.Recordsource="Recording"
Data1.Refresh 创建一条新记录
Data1.Recordset.AddNew 创建一个嵌入声音对象
OLE1.CreateEmbed "","SOUNDREC" 激活WIN95附件下的录音机
OLE1.DoVerb 0
End Sub
另一个按钮用于关闭程序,属性设置如下:
(名称) Command2
Caption 退出
双击Command2,在Private Sub Command2_Click()中输入以下代码:
Unload Form1
End
End Sub
5.编写Form1的Activate过程
Form1的Activate过程代码,用于在Form1打开的同时打开通信软件SuperVoice2.2并激活Command1的功能。双击Form1,弹出编写代码窗口,在对象下拉列表中选择Form,在过程下拉列表中选择Activate,在Pri
vate Sub Form_Activate()中输入以下代码:
激活Command1的功能
Call Command1_Click
调用安装在d:\supervoc\program\中的通信程序SuperVoice2.2,来启动Modem的语音功能
dim tel
tel=shell("d:\supervoc\program\supervoc.exe",1)
appactivate tel
End Sub
四、程序运行结果
保存工程,并将其生成可执行程序“录音.EXE”,放在C:\下面。好了,大功告成。现在退出VB,试一试在WIN95下运行。
当双击“录音.EXE”时,程序自动打开通信软件SuperVoice2.2(一般购买Modem时都随机附送SuperVoice2.2),在SuperVoice2.2的系统设置中将语音输入设备设为电话听筒,及启动SuperVoice2.2时弹出仿真电话拨号盘(只需在第一次使用时设置)。设为电话听筒的好处是通话时不需要麦克风,直接使用电话机。接着出现窗体Form1,并自动启动附件下的录音机。进行通话录音时,单击仿真电话拔号盘上的免提键及录音机上的录制按钮,开始录音。录制的声音文件被嵌入OLE容器中,同时被写到与OLE容器连接的数据库Recorder.mdb中,并自动生成录音的日期时间。除了录音功能外,还可以通过点击Data控件上的箭头按钮选择记录查询,双击OLE容器(显示为喇叭图标);自动播放选择的通话录音。如果再给窗体Form1添上DBComboBox、DBGrid控件,将使其查询功能更为完善。
顺便提一下,刚写完这篇文章,我又找到一个可在Win95注册的录音软件,就是创新的SoundOLE,由于界面漂亮且没有限制录音长度(附件的录音机的录音长度只有一分钟),我将准备拿它来取代那土里上气的录音机,使得我的小程序更具专业性。
以上代码在VB5.0、Win95系统上调试通过。
Top




