如何绘制.wav文件的波形

时间:2013-05-20 23:53:07

标签: vb.net waveform directsound wav

我有一个非常具体的问题。我想知道如何为.wav文件绘制波形。更具体地说,我需要帮助从wav文件中获取波形x和y坐标,绘制这些点的过程不是这个问题的主题。我没有相关的代码可以发布,因为到目前为止我的所有尝试都是基于其他人的工作,我无法让他们工作。

感谢。

我已经开始使用下面第一个链接中的代码了。原始代码会出现一些错误,因为事情没有定义,尽管这相对容易修复。

Private Sub cmdDefault_Click(……) Handles cmdDefault.Click
Try
SoundDevice = New Microsoft.DirectX.DirectSound.Device
SoundDevice.SetCooperativeLevel(Me.Handle_
, Microsoft.DirectX.DirectSound.CooperativeLevel.Normal)
SbufferOriginal = New _ Microsoft.DirectX.DirectSound._
SecondaryBuffer(SoundFile, SoundDevice)
SbufferOriginal.Play(0,_
Microsoft.DirectX.DirectSound.BufferPlayFlags.Looping)
Catch ex As Exception
End Try
End Sub

我基本上为每个未定义的变量添加了一个'Dim x as y'。唯一不明确的类型变量是“SoundFile”,我发现它应该是“Microsoft.DirectX.DirectSound.BufferDescription”类型。所以上面变成了:

 Private Sub cmdDefault_Click(……) Handles cmdDefault.Click
        Try
            Dim SoundDevice = New Microsoft.DirectX.DirectSound.Device
            SoundDevice.SetCooperativeLevel(Me.Handle, Microsoft.DirectX.DirectSound.CooperativeLevel.Normal)
            Dim SbufferOriginal = New Microsoft.DirectX.DirectSound.SecondaryBuffer(Microsoft.DirectX.DirectSound.BufferDescription, SoundDevice)
            SbufferOriginal.Play(0, Microsoft.DirectX.DirectSound.BufferPlayFlags.Looping)
        Catch ex As Exception
        End Try
    End Sub

问题是我失去了从这里开始的地方。这是我的问题。

2 个答案:

答案 0 :(得分:1)

此处SoundFile 可以成为BufferDescription,但从上下文我猜它最有可能是Stream(可能是FileStream, MemoryStream等)或string作为.wav文件的文件路径。请参阅SecondaryBuffer的各种constructor overloads

关于您发布的代码的唯一其他不完整的事情是它为了简洁起见废弃了Sub参数(它是Click处理程序,因此它需要标准参数)。为了完成这项工作,你只需要做这样的事情:

Private Sub PlaySound(ByVal SoundFilePath as String)
  Try
    SoundDevice = New Microsoft.DirectX.DirectSound.Device
    SoundDevice.SetCooperativeLevel(Me.Handle, _
       Microsoft.DirectX.DirectSound.CooperativeLevel.Normal)

    SbufferOriginal = New _ Microsoft.DirectX.DirectSound._
       SecondaryBuffer(SoundFilePath, SoundDevice)
    SbufferOriginal.Play(0, _
        Microsoft.DirectX.DirectSound.BufferPlayFlags.Looping)
  Catch ex As Exception
     'do something for exception
  End Try
End Sub

你可以称之为

PlaySound("C:\MySounds\Foo.wav")

这应该可以让你开始。如果你继续完成你最初发布的教程(这段代码来自哪里),并在你遇到问题时回到这里,你应该能够找到你可以获得可视化的点。您需要的大部分内容都在该教程中。

答案 1 :(得分:0)

是的,我现在已经完成了上面的代码了。我转到了这段代码:

   Sub New(ByVal SoundFilePathName As String)
       mWAVFileName = SoundFilePathName
       mOpen = OpenWAVStream(mWAVFileName)
       '******************* MAIN WORK HERE ******************
       'Parse the WAV file and read the
       If mOpen Then
              'Read the Header Data in THIS ORDER
              'Each Read results in the File Pointer Moving
              mChunkID = ReadChunkID(mWAVStream)
              mChunkSize = ReadChunkSize(mWAVStream)
              mFormatID = ReadFormatID(mWAVStream)
              mSubChunkID = ReadSubChunkID(mWAVStream)
              mSubChunkSize = ReadSubChunkSize(mWAVStream)
              mAudioFormat = ReadAudioFormat(mWAVStream)
              mNumChannels = ReadNumChannels(mWAVStream)
              mSampleRate = ReadSampleRate(mWAVStream)
              mByteRate = ReadByteRate(mWAVStream)
              mBlockAlign = ReadBlockAlign(mWAVStream)
              mBitsPerSample = ReadBitsPerSample(mWAVStream)
              mSubChunkIDTwo = ReadSubChunkIDTwo(mWAVStream)
              mSubChunkSizeTwo = ReadSubChunkSizeTwo(mWAVStream)
              mWaveSoundData = ReadWAVSampleData(mWAVStream)
              mWAVStream.Close()
       End If
   End Sub

我听到的问题是知道每个变量的类型(mOpen,mChunkID,mChunkSize,mFormatID等)。我猜测mWAVFileName是一个字符串,因为它是WAV文件的文件名。 OpenWAVEStream也没有定义,但我假设它是一个我必须写的函数来打开文件(或者可能检查文件是否可以打开)。这意味着mOpen是文件中的数据或表示文件是否可以打开的布尔值。 ReadChunkID,ReadFormatID等...是第一个(ReadChunkID)编写和共享的一些函数所以我想如果我可以得到变量的类型,我可能能够解决其他函数。所以我在追求什么是变量的类型,或者有关如何找到它们的一些建议。

由于