在线等待,十万火急!!!高分求解关于用mci控件实现录音的问题!!!

djf1978 2003-04-21 10:39:01
我用api函数mcisendstring来实现录音时,在winxp,win2000 系统下顺利实现录音,但在win98 winme下却不能实现录音,加上必要的.dll仍不行,请大哥、大姐们指教。
用MCI控件实现也可以(在WIN98、WINME下运行)!!!在线等待!!!
...全文
87 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
since1990 2003-08-08
  • 打赏
  • 举报
回复





这些问题解决的关键是:了解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

since1990 2003-08-08
  • 打赏
  • 举报
回复
相关文章,但愿对你有帮助:

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


1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧