Join 在VB6中拆分Wav文件
我需要帮助,以修复附加的VB6代码,这是应该采取的音频文件,并将其分为5个相等的部分 这是该代码的工作方式: 第一部分从Track.wav文件的开头开始。 第二部分从第一部分结束的地方开始。 第三部分从第二部分结束的地方开始。 第四部分从第三部分结束的地方开始。 第五部分从第四部分结束的地方开始 基本上,每个文件部分都是文件拆分前一部分的延续。分割后我有1.wav,2.wav,3.wav。4.wav和5.wav都来自Track.wav文件。附加的代码已经将文件分成五个相等的部分,但问题是所有音频部分都与第一部分相同,而不是一个连续部分 我需要帮助,使这个固定的工作,因为它应该在VB6(不是.NET)。我非常感谢你在这方面的帮助Join 在VB6中拆分Wav文件,join,split,vb6,mp3,wav,Join,Split,Vb6,Mp3,Wav,我需要帮助,以修复附加的VB6代码,这是应该采取的音频文件,并将其分为5个相等的部分 这是该代码的工作方式: 第一部分从Track.wav文件的开头开始。 第二部分从第一部分结束的地方开始。 第三部分从第二部分结束的地方开始。 第四部分从第三部分结束的地方开始。 第五部分从第四部分结束的地方开始 基本上,每个文件部分都是文件拆分前一部分的延续。分割后我有1.wav,2.wav,3.wav。4.wav和5.wav都来自Track.wav文件。附加的代码已经将文件分成五个相等的部分,但问题是所有音频
Dim Wavlength As Integer
Private Sub Command1_Click()
On Error Resume Next
DoFirstWav
Me.SetFocus
End Sub
Private Sub DoFirstWav()
On Error Resume Next
Dim ByteData() As Byte
Dim FirstWav As Integer
FirstWav = Wavlength / 5
ByteData = ReadFile(App.Path & "\Track.wav", 1, FirstWav & "0000")
Call WriteFile(App.Path & "\Segments\1.wav", ByteData)
DoSecondWav
End Sub
Private Sub DoSecondWav()
On Error Resume Next
Dim ByteData() As Byte
Dim SecondWav As Integer
SecondWav = Wavlength / 5
ByteData = ReadFile(App.Path & "\Track.wav", 1, SecondWav & "0000")
Call WriteFile(App.Path & "\Segments\2.wav", ByteData)
DoThirdWav
End Sub
Private Sub DoThirdWav()
On Error Resume Next
Dim ByteData() As Byte
Dim ThirdWav As Integer
ThirdWav = Wavlength / 5
ByteData = ReadFile(App.Path & "\Track.wav", 1, ThirdWav & "0000")
Call WriteFile(App.Path & "\Segments\3.wav", ByteData)
DoFourthWav
End Sub
Private Sub DoFourthWav()
On Error Resume Next
Dim ByteData() As Byte
Dim FourthWav As Integer
FourthWav = Wavlength / 5
ByteData = ReadFile(App.Path & "\Track.wav", 1, FourthWav & "0000")
Call WriteFile(App.Path & "\Segments\4.wav", ByteData)
DoFifthWav
End Sub
Private Sub DoFifthWav()
On Error Resume Next
Dim ByteData() As Byte
Dim FifthWav As Integer
FifthWav = Wavlength / 5
ByteData = ReadFile(App.Path & "\Track.wav", 1, FifthWav & "0000")
Call WriteFile(App.Path & "\Segments\5.wav", ByteData)
MsgBox "Wav Split Successfully", vbInformation
End
End Sub
Private Function ReadFile(ByVal strFileName As String, Optional ByVal lngStartPos As Long = 1, Optional ByVal lngFileSize As Long = -1) As Byte()
On Error Resume Next
Dim FilNum As Integer
FilNum = FreeFile
Open strFileName For Binary As #FilNum
If lngFileSize = -1 Then
ReDim ReadFile(LOF(FilNum) - lngStartPos)
Else
ReDim ReadFile(lngFileSize - 1)
End If
Get #FilNum, lngStartPos, ReadFile
Close #FilNum
End Function
Private Function WriteFile(ByVal strFileName As String, ByteData() As Byte, Optional ByVal lngStartPos As Long = -1, Optional ByVal OverWrite As Boolean = True)
On Error Resume Next
Dim FilNum As Integer
FilNum = FreeFile
If OverWrite = True And Dir(strFileName) <> "" Then
Kill strFileName
End If
Open strFileName For Binary As #FilNum
If lngStartPos = -1 Then
Put #FilNum, LOF(FilNum) + 1, ByteData
Else
Put #FilNum, l, ByteData
End If
Close #FilNum
End Function
Private Sub Form_Load()
On Error Resume Next
Dim MyInt As Integer
Dim MyByte As Byte
Dim MyStr As String * 4
Dim MyLong As Long
Dim SampleRate, BytesPerSample, FileSize As Long
Open App.Path & "\Track.wav" For Binary Access Read Lock Read As #1
Get #1, , MyStr: Debug.Print "Riff = "; MyStr
Get #1, , MyLong: Debug.Print "File size = "; MyLong
FileSize = MyLong
Get #1, , MyStr: Debug.Print "Wave = "; MyStr
Get #1, , MyStr: Debug.Print "Format = "; MyStr
Get #1, , MyLong: Debug.Print "Any = "; MyLong
Get #1, , MyInt: Debug.Print "formatTag = "; MyInt
Get #1, , MyInt: Debug.Print "Channels = "; MyInt
Get #1, , MyLong: Debug.Print "Samples per Sec = "; MyLong
SampleRate = MyLong
Get #1, , MyInt: Debug.Print "Bytes per Sec = "; MyInt
Get #1, , MyInt: Debug.Print "BlockAlign = "; MyInt
Get #1, , MyInt: Debug.Print "Bytes per Sample = "; MyInt
BytesPerSample = MyInt
Close #1
Wavlength = FileSize / (SampleRate * BytesPerSample)
End Sub
Dim wavelength作为整数
专用子命令1_Click()
出错时继续下一步
多瓦夫
我,设定焦点
端接头
私有子DoFirstWav()
出错时继续下一步
Dim ByteData()作为字节
将FirstWav设置为整数
FirstWav=wavelength/5
ByteData=ReadFile(App.Path&“\Track.wav”,1,FirstWav&“0000”)
调用WriteFile(App.Path&“\Segments\1.wav”,ByteData)
多斯康德瓦夫
端接头
私有子DoSecondWav()
出错时继续下一步
Dim ByteData()作为字节
Dim SecondWav作为整数
SecondWav=wavelength/5
ByteData=ReadFile(App.Path&“\Track.wav”,1,SecondWav&“0000”)
调用WriteFile(App.Path&“\Segments\2.wav”,ByteData)
多瑟德瓦夫
端接头
私人分公司DoThirdWav()
出错时继续下一步
Dim ByteData()作为字节
Dim ThirdWav作为整数
ThirdWav=波浪长度/5
ByteData=ReadFile(App.Path&“\Track.wav”,1,ThirdWav&“0000”)
调用WriteFile(App.Path&“\Segments\3.wav”,ByteData)
多福思瓦夫
端接头
私人分公司DoFourthWav()
出错时继续下一步
Dim ByteData()作为字节
作为整数的Dim FourthWav
FourthWav=波浪长度/5
ByteData=ReadFile(App.Path&“\Track.wav”,1,FourthWav&“0000”)
调用WriteFile(App.Path&“\Segments\4.wav”,ByteData)
多菲夫特瓦夫
端接头
私人分公司DoFifthWav()
出错时继续下一步
Dim ByteData()作为字节
作为整数的Dim FifthWav
FifthWav=波长/5
ByteData=ReadFile(App.Path&“\Track.wav”,1,FifthWav&“0000”)
调用WriteFile(App.Path&“\Segments\5.wav”,ByteData)
MsgBox“Wav拆分成功”,vbInformation
终点
端接头
私有函数ReadFile(ByVal strFileName作为字符串,可选ByVal lngStartPos作为Long=1,可选ByVal lngFileSize作为Long=-1)作为Byte()
出错时继续下一步
Dim FilNum作为整数
FilNum=FreeFile
打开二进制文件的strFileName作为#FilNum
如果lngFileSize=-1,则
ReDim读取文件(LOF(FilNum)-lngStartPos)
其他的
ReDim ReadFile(lngFileSize-1)
如果结束
获取#FilNum、lngStartPos、ReadFile
关闭#FilNum
端函数
私有函数WriteFile(ByVal strFileName作为字符串,ByteData()作为字节,可选ByVal lngStartPos作为Long=-1,可选ByVal OverWrite作为Boolean=True)
出错时继续下一步
Dim FilNum作为整数
FilNum=FreeFile
如果OverWrite=True且Dir(strFileName)“,则
杀死strFileName
如果结束
打开二进制文件的strFileName作为#FilNum
如果lngStartPos=-1,则
Put#FilNum,LOF(FilNum)+1,ByteData
其他的
放#FilNum,l,ByteData
如果结束
关闭#FilNum
端函数
专用子表单_加载()
出错时继续下一步
作为整数的Dim MyInt
将MyByte设置为字节
将MyStr设置为字符串*4
暗淡如长
Dim SampleRate,BytesPerSample,文件大小为
打开App.Path&“\Track.wav”进行二进制访问读锁读为#1
获取1,MyStr:Debug.Print“Riff=”;迈斯特
获取#1,MyLong:Debug.Print“File size=”;MyLong
FileSize=MyLong
获取#1,MyStr:Debug.Print“Wave=”;迈斯特
获取#1,MyStr:Debug.Print“Format=”;迈斯特
获取#1,MyLong:Debug.Print“Any=”;MyLong
获取#1,MyInt:Debug.Print“formatTag=”;MyInt
获取#1,MyInt:Debug.Print“Channels=”;MyInt
获取#1,MyLong:Debug.Print“Samples per Sec=”;MyLong
取样器=MyLong
获取#1,MyInt:Debug.Print“Bytes per Sec=”;MyInt
获取#1,MyInt:Debug.Print“BlockAlign=”;MyInt
获取#1,MyInt:Debug.Print“Bytes per Sample=”;MyInt
BytesPerSample=MyInt
关闭#1
wavelength=FileSize/(SampleRate*BytesPerSample)
端接头
这个问题相当复杂,尤其是当每个部分都需要可玩时。原因是您创建的每个文件都需要有一个有效的头记录。更复杂的是,标题记录可能是44字节、46字节甚至其他大小
我根据您的帖子编写了一些基本代码,这些代码似乎适用于我测试的wav文件:
Option Explicit
Private Const HEADER_SIZE As Long = 46
Private Const CHUNK_COUNT As Long = 5
Private HeaderData(HEADER_SIZE) As Byte
Private ChunkSize As Long
Private Sub Form_Load()
Dim MyInt As Integer
Dim MyByte As Byte
Dim MyStr As String * 4
Dim MyLong As Long
Dim FileSize As Long
Open App.Path & "\Track.wav" For Binary Access Read Lock Read As #1
Get #1, , MyStr: Debug.Print "Riff = "; MyStr
Get #1, , MyLong: Debug.Print "File size = "; MyLong
Get #1, , MyStr: Debug.Print "Wave = "; MyStr
Get #1, , MyStr: Debug.Print "Format = "; MyStr
Get #1, , MyLong: Debug.Print "Any = "; MyLong
Get #1, , MyInt: Debug.Print "formatTag = "; MyInt
Get #1, , MyInt: Debug.Print "Channels = "; MyInt
Get #1, , MyLong: Debug.Print "Samples per Sec = "; MyLong
Get #1, , MyInt: Debug.Print "Bytes per Sec = "; MyInt
Get #1, , MyInt: Debug.Print "BlockAlign = "; MyInt
Get #1, , MyInt: Debug.Print "Bytes per Sample = "; MyInt
Get #1, , MyInt: Debug.Print "Something = "; MyInt 'for my wave file, I needed 2 extra bytes
Get #1, , MyStr: Debug.Print "SubchunkID = "; MyStr
Get #1, , FileSize: Debug.Print "SubchunkSize = "; FileSize
Get #1, 1, HeaderData 'the size changes depending upon the file
Close #1
ChunkSize = CLng(FileSize / CHUNK_COUNT) 'you might loose some data here
End Sub
Private Sub Command1_Click()
Dim i As Integer
Dim ByteData() As Byte
Dim StartPos As Long
For i = 1 To CHUNK_COUNT
StartPos = HEADER_SIZE + ((i - 1) * ChunkSize)
ByteData = ReadFile(App.Path & "\Track.wav", StartPos, ChunkSize)
Call WriteFile(App.Path & "\Segments\" & i & ".wav", HeaderData, ByteData)
Next
MsgBox "Wav Split Successfully", vbInformation
End
End Sub
Private Function ReadFile(ByVal strFileName As String, ByVal lngStartPos As Long, ByVal lngFileSize As Long) As Byte()
On Error Resume Next
Dim FilNum As Integer
FilNum = FreeFile
ReDim ReadFile(lngFileSize - 1)
Open strFileName For Binary As #FilNum
Get #FilNum, lngStartPos, ReadFile
Close #FilNum
End Function
Private Function WriteFile(ByVal strFileName As String, HeaderData() As Byte, ByteData() As Byte, Optional ByVal OverWrite As Boolean = True)
On Error Resume Next
Dim FilNum As Integer
FilNum = FreeFile
If OverWrite = True And Dir(strFileName) <> "" Then
Kill strFileName
End If
Open strFileName For Binary As #FilNum
Put #FilNum, LOF(FilNum) + 1, HeaderData
Put #FilNum, HEADER_SIZE, ByteData
Close #FilNum
End Function
选项显式
专用常量头大小(长度=46)
私有常量块\长为5的计数
专用头数据(头大小)作为字节
私有块大小与长度相同
专用子表单_加载()
作为整数的Dim MyInt
将MyByte设置为字节
将MyStr设置为字符串*4
暗淡如长
使文件大小变长
打开App.Path&“\Track.wav”进行二进制访问读锁读为#1
获取1,MyStr:Debug.Print“Riff=”;迈斯特
获取#1,MyLong:Debug.Print“File size=”;MyLong
获取#1,MyStr:Debug.Print“Wave=”;迈斯特
获取#1,MyStr:Debug.Print“Format=”;迈斯特
获取#1,MyLong:Debug.Print“Any=”;MyLong
获取#1,MyInt:Debug.Print“formatTag=”;MyInt
获取#1,MyInt:Debug.Print“Channels=”;MyInt
获取#1,MyLong:Debug.Print“Samples per Sec=”;MyLong
获取#1,MyInt:Debug.Print“Bytes per Sec=”;MyInt
获取#1,MyInt:Debug.Print“BlockAlign=”;MyInt
获取#1,MyInt:Debug.Print“Bytes per Sample=”;MyInt
获取#1,MyInt:Debug.Print“Something=”;MyInt’对于我的wave文件,我需要额外的2个字节
获取#1,MyStr:Debug.Print“SubchunkID=”;迈斯特
获取#1,文件大小:Debug.Print
Dim Wavlength As Long
Dim PartLength As Integer
Dim WavHeader() As Byte
Private Sub Command1_Click()
On Error Resume Next
WavHeader = ReadFile(App.Path & "\Track.wav", 1, 320)
PartLength = Wavlength / 6 - 2
DoFirstWav
End Sub
Private Sub DoFirstWav()
On Error Resume Next
Dim ByteData() As Byte
Dim FirstWav As Integer
ByteData = ReadFile(App.Path & "\Track.wav", 1, PartLength & "0000")
Call WriteFile(App.Path & "\Segments\1.wav", ByteData)
DoSecondWav
End Sub
Private Sub DoSecondWav()
On Error Resume Next
Dim ByteData() As Byte
Dim ByteRead() As Byte
Dim SecondWav As Integer
SecondWav = PartLength
ByteRead = ReadFile(App.Path & "\Track.wav", SecondWav & "0000", PartLength & "0000")
ReDim ByteData(UBound(WavHeader) + UBound(ByteRead)) As Byte
For i = 0 To UBound(WavHeader)
ByteData(i) = WavHeader(i)
Next i
For i = 0 To UBound(ByteRead)
ByteData(UBound(WavHeader) + i) = ByteRead(i)
Next i
Call WriteFile(App.Path & "\Segments\2.wav", ByteData)
DoThirdWav
End Sub
Private Sub DoThirdWav()
On Error Resume Next
Dim ByteData() As Byte
Dim ByteRead() As Byte
Dim ThirdWav As Integer
ThirdWav = PartLength * 2 + 1
ByteRead = ReadFile(App.Path & "\Track.wav", ThirdWav & "0000", PartLength & "0000")
ReDim ByteData(UBound(WavHeader) + UBound(ByteRead)) As Byte
For i = 0 To UBound(WavHeader)
ByteData(i) = WavHeader(i)
Next i
For i = 0 To UBound(ByteRead)
ByteData(UBound(WavHeader) + i) = ByteRead(i)
Next i
Call WriteFile(App.Path & "\Segments\3.wav", ByteData)
DoFourthWav
End Sub
Private Sub DoFourthWav()
On Error Resume Next
Dim ByteData() As Byte
Dim ByteRead() As Byte
Dim FourthWav As Integer
FourthWav = PartLength * 3 + 1
ByteRead = ReadFile(App.Path & "\Track.wav", FourthWav & "0000", PartLength & "0000")
ReDim ByteData(UBound(WavHeader) + UBound(ByteRead)) As Byte
For i = 0 To UBound(WavHeader)
ByteData(i) = WavHeader(i)
Next i
For i = 0 To UBound(ByteRead)
ByteData(UBound(WavHeader) + i) = ByteRead(i)
Next i
Call WriteFile(App.Path & "\Segments\4.wav", ByteData)
DoFifthWav
End Sub
Private Sub DoFifthWav()
On Error Resume Next
Dim ByteData() As Byte
Dim ByteRead() As Byte
Dim FifthWav As Integer
FifthWav = PartLength * 4 + 1
ByteRead = ReadFile(App.Path & "\Track.wav", FifthWav & "0000", PartLength & "0000")
ReDim ByteData(UBound(WavHeader) + UBound(ByteRead)) As Byte
For i = 0 To UBound(WavHeader)
ByteData(i) = WavHeader(i)
Next i
For i = 0 To UBound(ByteRead)
ByteData(UBound(WavHeader) + i) = ByteRead(i)
Next i
Call WriteFile(App.Path & "\Segments\5.wav", ByteData)
End Sub
Private Function ReadFile(ByVal strFileName As String, Optional ByVal lngStartPos As Long = 1, Optional ByVal lngFileSize As Long = -1) As Byte()
On Error Resume Next
Dim FilNum As Integer
FilNum = FreeFile
Open strFileName For Binary As #FilNum
If lngFileSize = -1 Then
ReDim ReadFile(LOF(FilNum) - lngStartPos)
Else
ReDim ReadFile(lngFileSize - 1)
End If
Get #FilNum, lngStartPos, ReadFile
Close #FilNum
End Function
Private Function WriteFile(ByVal strFileName As String, ByteData() As Byte, Optional ByVal lngStartPos As Long = -1, Optional ByVal OverWrite As Boolean = True)
On Error Resume Next
Dim FilNum As Integer
FilNum = FreeFile
If OverWrite = True And Dir(strFileName) <> "" Then
Kill strFileName
End If
Open strFileName For Binary As #FilNum
If lngStartPos = -1 Then
Put #FilNum, LOF(FilNum) + 1, ByteData
Else
Put #FilNum, l, ByteData
End If
Close #FilNum
End Function
Private Sub Form_Load()
On Error Resume Next
Dim MyInt As Integer
Dim MyByte As Byte
Dim MyStr As String * 4
Dim MyLong As Long
Dim SampleRate, BytesPerSample, FileSize As Long
Open App.Path & "\Track.wav" For Binary Access Read Lock Read As #1
Get #1, , MyStr: Debug.Print "Riff = "; MyStr
Get #1, , MyLong: Debug.Print "File size = "; MyLong
FileSize = MyLong
Get #1, , MyStr: Debug.Print "Wave = "; MyStr
Get #1, , MyStr: Debug.Print "Format = "; MyStr
Get #1, , MyLong: Debug.Print "Any = "; MyLong
Get #1, , MyInt: Debug.Print "formatTag = "; MyInt
Get #1, , MyInt: Debug.Print "Channels = "; MyInt
Get #1, , MyLong: Debug.Print "Samples per Sec = "; MyLong
SampleRate = MyLong
Get #1, , MyInt: Debug.Print "Bytes per Sec = "; MyInt
Get #1, , MyInt: Debug.Print "BlockAlign = "; MyInt
Get #1, , MyInt: Debug.Print "Bytes per Sample = "; MyInt
BytesPerSample = MyInt
Close #1
Wavlength = FileSize \ (SampleRate * BytesPerSample)
Debug.Print "Wavlength"; Wavlength
End Sub