Join 在VB6中拆分Wav文件

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文件。附加的代码已经将文件分成五个相等的部分,但问题是所有音频

我需要帮助,以修复附加的VB6代码,这是应该采取的音频文件,并将其分为5个相等的部分

这是该代码的工作方式:

第一部分从Track.wav文件的开头开始。 第二部分从第一部分结束的地方开始。 第三部分从第二部分结束的地方开始。 第四部分从第三部分结束的地方开始。 第五部分从第四部分结束的地方开始

基本上,每个文件部分都是文件拆分前一部分的延续。分割后我有1.wav,2.wav,3.wav。4.wav和5.wav都来自Track.wav文件。附加的代码已经将文件分成五个相等的部分,但问题是所有音频部分都与第一部分相同,而不是一个连续部分

我需要帮助,使这个固定的工作,因为它应该在VB6(不是.NET)。我非常感谢你在这方面的帮助

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