Imports System.IO
Imports NAudio.Wave
Public Class Form1
Private waveFileReader As WaveFileReader
Private waveOutDevice As WaveOut
Private Sub OpenToolStripMenuItem_Click(ByVal sender As Object, ByVal e As EventArgs) Handles OpenToolStripMenuItem.Click
Dim openFileDialog As New OpenFileDialog()
openFileDialog.Filter = "Wave Files (*.wav)|*.wav"
If openFileDialog.ShowDialog() = DialogResult.OK Then
Try
waveFileReader = New WaveFileReader(openFileDialog.FileName)
Catch ex As Exception
MessageBox.Show("Error opening file: " & ex.Message)
Return
End Try
End If
End Sub
Private Sub PlayToolStripMenuItem_Click(ByVal sender As Object, ByVal e As EventArgs) Handles PlayToolStripMenuItem.Click
If waveFileReader IsNot Nothing Then
waveOutDevice = New WaveOut()
waveOutDevice.Init(waveFileReader)
waveOutDevice.Play()
Else
MessageBox.Show("No file opened")
End If
End Sub
Private Sub StopToolStripMenuItem_Click(ByVal sender As Object, ByVal e As EventArgs) Handles StopToolStripMenuItem.Click
If waveOutDevice IsNot Nothing AndAlso waveOutDevice.PlaybackState = PlaybackState.Playing Then
waveOutDevice.Stop()
End If
End Sub
Private Sub SaveToolStripMenuItem_Click(ByVal sender As Object, ByVal e As EventArgs) Handles SaveToolStripMenuItem.Click
If waveFileReader IsNot Nothing Then
Dim saveFileDialog As New SaveFileDialog()
saveFileDialog.Filter = "Wave Files (*.wav)|*.wav|MP3 Files (*.mp3)|*.mp3|WMA Files (*.wma)|*.wma" '持多种音频格式
If saveFileDialog.ShowDialog() = DialogResult.OK Then
Try
Using newWriter As New WaveFileWriter(saveFileDialog.FileName, waveFileReader.WaveFormat)
waveFileReader.Position = 0
Dim buffer As Byte() = New Byte(waveFileReader.Length - 1) {}
waveFileReader.Read(buffer, 0, buffer.Length)
newWriter.Write(buffer, 0, buffer.Length)
End Using
Catch ex As Exception
MessageBox.Show("Error saving file: " & ex.Message)
End Try
End If
Else
MessageBox.Show("No file opened")
End If
End Sub
Private Sub CloseToolStripMenuItem_Click(ByVal sender As Object, ByVal e As EventArgs) Handles CloseToolStripMenuItem.Click
If waveFileReader IsNot Nothing Then
waveFileReader.Dispose()
waveFileReader = Nothing
End If
If waveOutDevice IsNot Nothing Then
MsgBox("已经关闭!")
waveOutDevice.Dispose()
waveOutDevice = Nothing
End If
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
End
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If waveFileReader IsNot Nothing Then
Dim startSeconds As Double = CDbl(InputBox("请输入裁剪开始时间(秒)"))
Dim durationSeconds As Double = CDbl(InputBox("请输入裁剪持续时间(秒)"))
Dim startPosition As Integer = CInt(startSeconds * waveFileReader.WaveFormat.AverageBytesPerSecond)
Dim length As Integer = CInt(durationSeconds * waveFileReader.WaveFormat.AverageBytesPerSecond)
Dim croppedFile As Byte() = New Byte(length - 1) {}
waveFileReader.Position = startPosition
waveFileReader.Read(croppedFile, 0, length)
Dim saveFileDialog As New SaveFileDialog()
saveFileDialog.Filter = "Wave Files (*.wav)|*.wav|MP3 Files (*.mp3)|*.mp3|WMA Files (*.wma)|*.wma" '持多种音频格式
If saveFileDialog.ShowDialog() = DialogResult.OK Then
Try
Using newWriter As New WaveFileWriter(saveFileDialog.FileName, waveFileReader.WaveFormat)
newWriter.Write(croppedFile, 0, length)
End Using
Catch ex As Exception
MessageBox.Show("Error saving cropped file: " & ex.Message)
End Try
End If
Else
MessageBox.Show("No file opened")
End If
End Sub
Private Sub Button4_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button4.Click
'开文件对话框,选择单个音频文件
Dim ofd As New OpenFileDialog() With {
.Multiselect = False} '改为只能选择单个文件
ofd.Filter = "Audio Files|*.mp3;*.wav;*.wma"
If ofd.ShowDialog() = DialogResult.OK Then
'选中的单个文件添加到列表框
ListBoxFiles.Items.Add(ofd.FileName)
End If
End Sub
Private Sub Button3_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button3.Click
' 检查列表框中是否有文件
If ListBoxFiles.Items.Count = 0 Then
MessageBox.Show("请先打开一些音频文件。")
Return
End If
' 创建一个WaveFileWriter来保存合并后的音频
Dim saveFileDialog As New SaveFileDialog() With {
.Filter = "WAV Files|*.wav"
}
If saveFileDialog.ShowDialog() = DialogResult.OK Then
Using writer As New WaveFileWriter(saveFileDialog.FileName, New WaveFormat(44100, 16, 2))
' 逐个读取并合并音频文件
For Each file As String In ListBoxFiles.Items
Using reader As New WaveFileReader(file)
' 将音频数据复制到WaveFileWriter
reader.CopyTo(writer)
End Using
Next
End Using
MessageBox.Show("音频文件合并完成!")
End If
End Sub
End Class