如 1.wav和2.wav,最后合并为3.wav.
解决方案 »
- 求VB6.0企业版的,繁体语言文件。在线等,谢谢......
- activereport2.0装上后,编译时提示“内存不能为read”
- 高分求VB压缩和解压缩文件夹的源代码或者控件!!
- 关于Single数据类型的问题,请指教!
- 两个问题,一个简单,一个奇怪
- 讨论:VB做数据库开发(MS SQL) 怎么样
- 被注册表搞的还剩半口气,自己又没分,求达人可怜
- 如何把UDP包的内容(中文)转换成Unicode码 急急急急急急!!!
- 浮动工具栏你会做吗??????????????????????????????
- delphi 如何连接ms access 数据库
- crystal report4.6问题??
- 如何将自己画的图作为对象处理??
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=194338
http://tech.sina.com.cn/s/923.html
http://www.borg.com/~jglatt/tech/wave.htm
http://www.wotsit.org/search.asp?s=wav
'这些都不用注释吧,一看就明白。Private Sub cmdBrowse_Click(Index As Integer) '控件数组的妙用,绝吧!:-)
With TheComDlg
If Index < 2 Then
.DialogTitle = "打开 WAVE 文件"
.ShowOpen
Else
.DialogTitle = "选择要保存输出的 WAVE 文件名"
.ShowSave
End If
If .FileName <> "" Then
txtWaveFile(Index).Text = .FileName
.FileName = ""
End If
End With
End SubPrivate Sub cmdExit_Click()
Unload frmMain
End SubPrivate Sub cmdMix_Click()
If txtWaveFile(0).Text = "" Then
MsgBox "请选择第一个要混合的 WAVE 音频文件!", , "错误"
Exit Sub
End If
If txtWaveFile(1).Text = "" Then
MsgBox "请选择第二个要混合的 WAVE 音频文件!", , "错误"
Exit Sub
End If
If txtWaveFile(2).Text = "" Then
MsgBox "请选择要保存混合后的 WAVE 音频的文件!", , "错误"
Exit Sub
End If
If MixWaveFile(txtWaveFile(0).Text, txtWaveFile(1).Text, txtWaveFile(2).Text) Then
MsgBox "混合 WAVE 音频文件成功!", , "提示"
End If
TheProgBar.Value = 0
End SubPrivate Sub cmdUnite_Click()
If txtWaveFile(0).Text = "" Then
MsgBox "请选择第一个要合并的 WAVE 音频文件!", , "错误"
Exit Sub
End If
If txtWaveFile(1).Text = "" Then
MsgBox "请选择第二个要合并的 WAVE 音频文件!", , "错误"
Exit Sub
End If
If txtWaveFile(2).Text = "" Then
MsgBox "请选择要保存合并后的 WAVE 音频的文件!", , "错误"
Exit Sub
End If
If UniteWaveFile(txtWaveFile(0).Text, txtWaveFile(1).Text, txtWaveFile(2).Text) Then
MsgBox "合并 WAVE 音频文件成功!", , "提示"
End If
TheProgBar.Value = 0
End SubPrivate Sub Form_Unload(Cancel As Integer)
If MsgBox("您真的要退出这个程序吗?", vbOKCancel, "确认退出") = vbCancel Then
Cancel = -1
End If
End Sub
Option ExplicitPrivate Type WAVEFILEHDR 'WAVE 文件头的定义
strFileTag As String * 4 '“RIFF”标志
lngFileLen As Long '文件长度,不包括“RIFF”标志和它本身的长度
strFileType As String * 4 '“WAVE”标志
End TypePrivate Type DATABLOCKHDR '数据块头的定义
strBlockTag As String * 4 '数据块名
lngBlockLen As Long '数据块长度,不包括数据块名和它本身的长度
End TypePublic Type PCMWAVEFORMAT 'PCM 格式定义
wFormatTag As Integer '格式标志,PCM 为 1
nChannels As Integer '通道数
nSamplesPerSec As Long '采样率
nAvgBytesPerSec As Long '数据率
nBlockAlign As Integer '块对齐大小,即波形数据的最小单位
wBitsPerSample As Integer '采样大小
End Type'缓冲区最大长度
Public Const MAXBUFFERLEN As Long = 1024'新建一个 FileSystemObject 对象,以方便文件的操作
Public MyFSO As New FileSystemObject'WAVE 文件合并函数
'File1 为第一个要合并的文件
'File2 为第二个要合并的文件
'OutFile 为合并输出的文件
Public Function UniteWaveFile(File1 As String, File2 As String, OutFile As String) As Boolean
Dim FileName(1) As String
Dim FileHdr(1) As WAVEFILEHDR
Dim BlockHdr(1) As DATABLOCKHDR
Dim WaveFmt(1) As PCMWAVEFORMAT
Dim ReadedFormat(1) As Boolean
Dim Buffer() As Byte, I As Long
FileName(0) = File1
FileName(1) = File2
For I = 0 To 1
If Not MyFSO.FileExists(FileName(I)) Then
MsgBox "文件: “ " & FileName(I) & " ”不存在!请重新输入文件名或选择一个文件。", , "错误"
UniteWaveFile = False
Exit Function
End If
Open FileName(I) For Binary Access Read As #(I + 1)
Get #(I + 1), , FileHdr(I)
If FileHdr(I).strFileTag <> "RIFF" Or FileHdr(I).strFileType <> "WAVE" Then
MsgBox "文件: “ " & FileName(I) & " ”不是 WAVE 音频文件!", , "错误"
Close
UniteWaveFile = False
Exit Function
End If
If FileHdr(I).lngFileLen <> LOF(I + 1) - 8 Then
MsgBox "文件: “ " & FileName(I) & " ”已损坏!", , "错误"
Close
UniteWaveFile = False
Exit Function
End If
Do Until EOF(I + 1) '循环直到读出“格式”数据块和“波形数据”数据块头为止
Get #(I + 1), , BlockHdr(I)
With BlockHdr(I)
If LOF(I + 1) - Loc(I + 1) < .lngBlockLen Then
MsgBox "文件: “ " & FileName(I) & " ”已损坏!", , "错误"
Close
UniteWaveFile = False
Exit Function
End If
If .strBlockTag = "fmt " And Not ReadedFormat(I) Then
Get #(I + 1), , WaveFmt(I)
.lngBlockLen = .lngBlockLen - 16
ReadedFormat(I) = True
If WaveFmt(I).wFormatTag <> 1 Then
MsgBox "文件: “ " & FileName(I) & " ”不是 PCM 格式!" _
& vbCrLf & "不能进行合并!", , "错误"
Close
UniteWaveFile = False
Exit Function
End If
End If
If .strBlockTag = "data" And ReadedFormat(I) Then
Exit Do
End If
Seek #(I + 1), Seek(I + 1) + .lngBlockLen
End With
Loop
Next
If WaveFmt(0).nChannels <> WaveFmt(1).nChannels Then
MsgBox "两个 WAVE 文件的通道数不同,不能进行合并!", , "错误"
Close
UniteWaveFile = False
Exit Function
End If
If WaveFmt(0).wBitsPerSample <> WaveFmt(1).wBitsPerSample Then
MsgBox "两个 WAVE 文件的采样大小不同,不能进行合并!", , "错误"
Close
UniteWaveFile = False
Exit Function
End If
If WaveFmt(0).nSamplesPerSec <> WaveFmt(1).nSamplesPerSec Then
MsgBox "两个 WAVE 文件的采样率不同,不能进行合并!", , "错误"
Close
UniteWaveFile = False
Exit Function
End If
On Error GoTo ErrorLine
If MyFSO.FileExists(OutFile) Then
Kill OutFile
End If
Open OutFile For Binary Access Write As #3
Put #3, , "RIFF"
Put #3, , 0&
Put #3, , "WAVE"
Put #3, , "fmt "
Put #3, , 16&
Put #3, , WaveFmt(0)
Put #3, , "data"
Put #3, , BlockHdr(0).lngBlockLen + BlockHdr(1).lngBlockLen
frmMain.TheProgBar.Min = 0
frmMain.TheProgBar.Value = 0
frmMain.TheProgBar.Max = BlockHdr(0).lngBlockLen \ MAXBUFFERLEN + BlockHdr(1).lngBlockLen \ MAXBUFFERLEN + 2
For I = 0 To 1
ReDim Buffer(MAXBUFFERLEN - 1)
With BlockHdr(I)
While .lngBlockLen > 0
If .lngBlockLen > MAXBUFFERLEN Then
.lngBlockLen = .lngBlockLen - MAXBUFFERLEN
Else
ReDim Buffer(.lngBlockLen - 1)
.lngBlockLen = 0
End If
Get #(I + 1), , Buffer
Put #3, , Buffer
With frmMain.TheProgBar
If .Value < .Max Then
.Value = .Value + 1
End If
End With
Wend
End With
Next
Put #3, 5, LOF(3) - 8
Close
UniteWaveFile = True
Exit Function
ErrorLine:
If Err.Number > 0 Then
Close
MsgBox "打开文件:“ " & OutFile & " ”时错误,可能文件已被其它程序打开。" & _
vbCrLf & vbCrLf & "请关闭打开此文件的程序或关闭浏览器对此文件的预览。", , "错误"
UniteWaveFile = False
End If
End Function
Dim FileName(1) As String
Dim FileHdr(1) As WAVEFILEHDR
Dim BlockHdr(1) As DATABLOCKHDR
Dim WaveFmt(1) As PCMWAVEFORMAT
Dim ReadedFormat(1) As Boolean
Dim MaxLen As Long, MinLen As Long
Dim Buffer1B() As Byte, Buffer2B() As Byte
Dim Buffer1W() As Integer, Buffer2W() As Integer
Dim I As Long, J As Long
FileName(0) = File1
FileName(1) = File2
For I = 0 To 1
If Not MyFSO.FileExists(FileName(I)) Then
MsgBox "文件: “ " & FileName(I) & " ”不存在!请重新输入文件名或选择一个文件。", , "错误"
MixWaveFile = False
Exit Function
End If
Open FileName(I) For Binary Access Read As #(I + 1)
Get #(I + 1), , FileHdr(I)
If FileHdr(I).strFileTag <> "RIFF" Or FileHdr(I).strFileType <> "WAVE" Then
MsgBox "文件: “ " & FileName(I) & " ”不是 WAVE 音频文件!", , "错误"
Close
MixWaveFile = False
Exit Function
End If
If FileHdr(I).lngFileLen <> LOF(I + 1) - 8 Then
MsgBox "文件: “ " & FileName(I) & " ”已损坏!", , "错误"
Close
MixWaveFile = False
Exit Function
End If
Do Until EOF(I + 1)
Get #(I + 1), , BlockHdr(I)
With BlockHdr(I)
If LOF(I + 1) - Loc(I + 1) < .lngBlockLen Then
MsgBox "文件: “ " & FileName(I) & " ”已损坏!", , "错误"
Close
MixWaveFile = False
Exit Function
End If
If .strBlockTag = "fmt " And Not ReadedFormat(I) Then
Get #(I + 1), , WaveFmt(I)
.lngBlockLen = .lngBlockLen - 16
ReadedFormat(I) = True
If WaveFmt(I).wFormatTag <> 1 Then
MsgBox "文件: “ " & FileName(I) & " ”不是 PCM 格式!" _
& vbCrLf & "不能进行混音!", , "错误"
Close
MixWaveFile = False
Exit Function
End If
End If
If .strBlockTag = "data" And ReadedFormat(I) Then
Exit Do
End If
Seek #(I + 1), Seek(I + 1) + .lngBlockLen
End With
Loop
Next
If WaveFmt(0).nChannels <> WaveFmt(1).nChannels Then
MsgBox "两个 WAVE 文件的通道数不同,不能进行混音!", , "错误"
Close
MixWaveFile = False
Exit Function
End If
If WaveFmt(0).wBitsPerSample <> WaveFmt(1).wBitsPerSample Then
MsgBox "两个 WAVE 文件的采样大小不同,不能进行混音!", , "错误"
Close
MixWaveFile = False
Exit Function
End If
If WaveFmt(0).wBitsPerSample <> 8 And WaveFmt(0).wBitsPerSample <> 16 Then
MsgBox "两个 WAVE 文件的采样大小不规范,不能进行混音!", , "错误"
Close
MixWaveFile = False
Exit Function
End If
If WaveFmt(0).nSamplesPerSec <> WaveFmt(1).nSamplesPerSec Then
MsgBox "两个 WAVE 文件的采样率不同,不能进行混音!", , "错误"
Close
MixWaveFile = False
Exit Function
End If
On Error GoTo ErrorLine
If MyFSO.FileExists(OutFile) Then
Kill OutFile
End If
Open OutFile For Binary Access Write As #3
Put #3, , "RIFF"
Put #3, , 0&
Put #3, , "WAVE"
Put #3, , "fmt "
Put #3, , 16&
Put #3, , WaveFmt(0)
Put #3, , "data"
frmMain.TheProgBar.Min = 0
frmMain.TheProgBar.Value = 0
If BlockHdr(0).lngBlockLen >= BlockHdr(1).lngBlockLen Then
MaxLen = BlockHdr(0).lngBlockLen
MinLen = BlockHdr(1).lngBlockLen
Else
MaxLen = BlockHdr(1).lngBlockLen
MinLen = BlockHdr(0).lngBlockLen
End If
Put #3, , MaxLen
frmMain.TheProgBar.Max = MinLen \ MAXBUFFERLEN + (MaxLen - MinLen) \ MAXBUFFERLEN + 2
If WaveFmt(0).wBitsPerSample = 16 Then
ReDim Buffer1W(MAXBUFFERLEN \ 2 - 1), Buffer2W(MAXBUFFERLEN \ 2 - 1)
While BlockHdr(0).lngBlockLen > 0 And BlockHdr(1).lngBlockLen > 0
If MinLen > MAXBUFFERLEN Then
BlockHdr(0).lngBlockLen = BlockHdr(0).lngBlockLen - MAXBUFFERLEN
BlockHdr(1).lngBlockLen = BlockHdr(1).lngBlockLen - MAXBUFFERLEN
MinLen = MinLen - MAXBUFFERLEN
Else
ReDim Buffer1W(MinLen \ 2 - 1), Buffer2W(MinLen \ 2 - 1)
BlockHdr(0).lngBlockLen = BlockHdr(0).lngBlockLen - MinLen
BlockHdr(1).lngBlockLen = BlockHdr(1).lngBlockLen - MinLen
MinLen = 0
End If
Get #1, , Buffer1W
Get #2, , Buffer2W
For I = 0 To UBound(Buffer1W)
Buffer1W(I) = (Buffer1W(I) + 1) \ 2 + (Buffer2W(I) + 1) \ 2
Next
Put #3, , Buffer1W
With frmMain.TheProgBar
If .Value < .Max Then
.Value = .Value + 1
End If
End With
Wend
For I = 0 To 1
ReDim Buffer1W(MAXBUFFERLEN \ 2 - 1)
With BlockHdr(I)
While .lngBlockLen > 0
If .lngBlockLen > MAXBUFFERLEN Then
.lngBlockLen = .lngBlockLen - MAXBUFFERLEN
Else
ReDim Buffer1W(.lngBlockLen \ 2 - 1)
.lngBlockLen = 0
End If
Get #(I + 1), , Buffer1W
For J = 0 To UBound(Buffer1W)
Buffer1W(J) = Buffer1W(J) \ 2
Next
Put #3, , Buffer1W
With frmMain.TheProgBar
If .Value < .Max Then
.Value = .Value + 1
End If
End With
Wend
End With
Next
Erase Buffer1W, Buffer2W
End If
If WaveFmt(0).wBitsPerSample = 8 Then
ReDim Buffer1B(MAXBUFFERLEN - 1), Buffer2B(MAXBUFFERLEN - 1)
While BlockHdr(0).lngBlockLen > 0 And BlockHdr(1).lngBlockLen > 0
If MinLen > MAXBUFFERLEN Then
BlockHdr(0).lngBlockLen = BlockHdr(0).lngBlockLen - MAXBUFFERLEN
BlockHdr(1).lngBlockLen = BlockHdr(1).lngBlockLen - MAXBUFFERLEN
MinLen = MinLen - MAXBUFFERLEN
Else
ReDim Buffer1B(MinLen - 1), Buffer2B(MinLen - 1)
BlockHdr(0).lngBlockLen = BlockHdr(0).lngBlockLen - MinLen
BlockHdr(1).lngBlockLen = BlockHdr(1).lngBlockLen - MinLen
MinLen = 0
End If
Get #1, , Buffer1B
Get #2, , Buffer2B
For I = 0 To UBound(Buffer1B)
Buffer1B(I) = (Buffer1B(I) + 1) \ 2 + (Buffer2B(I) + 1) \ 2
Next
Put #3, , Buffer1B
With frmMain.TheProgBar
If .Value < .Max Then
.Value = .Value + 1
End If
End With
Wend
For I = 0 To 1
ReDim Buffer1B(MAXBUFFERLEN - 1)
With BlockHdr(I)
While .lngBlockLen > 0
If .lngBlockLen > MAXBUFFERLEN Then
.lngBlockLen = .lngBlockLen - MAXBUFFERLEN
Else
ReDim Buffer1B(.lngBlockLen - 1)
.lngBlockLen = 0
End If
Get #(I + 1), , Buffer1B
For J = 0 To UBound(Buffer1B)
Buffer1B(J) = Buffer1B(J) \ 2
Next
Put #3, , Buffer1B
With frmMain.TheProgBar
If .Value < .Max Then
.Value = .Value + 1
End If
End With
Wend
End With
Next
Erase Buffer1B, Buffer2B
End If
Put #3, 5, LOF(3) - 8
Close
MixWaveFile = True
Exit Function
ErrorLine:
If Err.Number > 0 Then
Close
MsgBox "打开文件:“ " & OutFile & " ”时错误,可能文件已被其它程序打开。" & _
vbCrLf & vbCrLf & "请关闭打开此文件的程序或关闭浏览器对此文件的预览。", , "错误"
MixWaveFile = False
End If
End Function