从数组对象vb.net播放wav文件时,波头已损坏错误

从数组对象vb.net播放wav文件时,波头已损坏错误,vb.net,file,audio,resources,playback,Vb.net,File,Audio,Resources,Playback,我正在尝试构建一个显示数字的应用程序,例如123-->“一、二、三”来自wav声音。 我可以使用以下命令多次播放相同的wav文件,没有任何问题: My.Computer.Audio.Play(My.Resources.xxx,AudioPlayMode.WaitToComplete) 但是当我把对象放入这样的数组中 wav_files()作为对象= {0, My.Resources.xxx, My.Resources.yyy, My.Resources.zzz, } 然后我尝试调用数组中的同

我正在尝试构建一个显示数字的应用程序,例如123-->“一、二、三”来自wav声音。 我可以使用以下命令多次播放相同的wav文件,没有任何问题:

My.Computer.Audio.Play(My.Resources.xxx,AudioPlayMode.WaitToComplete)
但是当我把对象放入这样的数组中

wav_files()作为对象=
{0,
My.Resources.xxx,
My.Resources.yyy,
My.Resources.zzz,
}
然后我尝试调用数组中的同一索引两次:

My.Computer.Audio.Play(wav_文件(2),AudioPlayMode.WaitToComplete)
My.Computer.Audio.Play(wav_文件(2),AudioPlayMode.WaitToComplete)
不断地出现错误:

波头已损坏

我需要将这些wav文件编入索引,以便在转换函数编号-->声音时调用它们

我做得对吗?是否有任何其他想法可以让我的资源排序索引文件。

编辑:

好的,以下是有效的方法:

Dim wavs As New List(Of Byte())

wavs.Add(System.IO.File.ReadAllBytes(<PATH_TO_YOUR_SOUND_FILE_1>))
wavs.Add(System.IO.File.ReadAllBytes(<PATH_TO_YOUR_SOUND_FILE_2>))
wavs.Add(System.IO.File.ReadAllBytes(<PATH_TO_YOUR_SOUND_FILE_3>))

My.Computer.Audio.Play(wavs(0), AudioPlayMode.WaitToComplete)
My.Computer.Audio.Play(wavs(0), AudioPlayMode.WaitToComplete)
My.Computer.Audio.Play(wavs(0), AudioPlayMode.WaitToComplete)
Dim wavs作为新列表(字节())
添加(System.IO.File.ReadAllBytes())
添加(System.IO.File.ReadAllBytes())
添加(System.IO.File.ReadAllBytes())
My.Computer.Audio.Play(wavs(0)、AudioPlayMode.WaitToComplete)
My.Computer.Audio.Play(wavs(0)、AudioPlayMode.WaitToComplete)
My.Computer.Audio.Play(wavs(0)、AudioPlayMode.WaitToComplete)
或使用资源:

Using stream As System.IO.Stream = My.Resources.ResourceManager.GetStream(<STRING NAME OF RESOURCE WITHOUT EXTENSION>)
    Dim buffer(stream.Length) As Byte
    stream.Read(buffer, 0, stream.Length - 1)
    wavs.Add(buffer)
End Using

My.Computer.Audio.Play(wavs(0), AudioPlayMode.WaitToComplete)
My.Computer.Audio.Play(wavs(0), AudioPlayMode.WaitToComplete)
My.Computer.Audio.Play(wavs(0), AudioPlayMode.WaitToComplete)
使用流作为System.IO.stream=My.Resources.ResourceManager.GetStream()
Dim缓冲区(流长度)作为字节
stream.Read(缓冲区,0,stream.Length-1)
添加(缓冲区)
终端使用
My.Computer.Audio.Play(wavs(0)、AudioPlayMode.WaitToComplete)
My.Computer.Audio.Play(wavs(0)、AudioPlayMode.WaitToComplete)
My.Computer.Audio.Play(wavs(0)、AudioPlayMode.WaitToComplete)

这确实如我所料,即流位置需要重置。我刚试过这个,效果如预期:

Imports System.IO

Public Class Form1

    Private sounds As UnmanagedMemoryStream() = {Nothing,
                                                 My.Resources.First,
                                                 My.Resources.Second,
                                                 My.Resources.Third}

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        My.Computer.Audio.Play(sounds(1), AudioPlayMode.WaitToComplete)
        sounds(1).Seek(0L, SeekOrigin.Begin)
        My.Computer.Audio.Play(sounds(1), AudioPlayMode.WaitToComplete)
    End Sub

End Class
考虑到您的意图是按数组索引播放声音,我可能会选择这种方式:

Imports System.IO

Public Class Form1

    Private sounds As UnmanagedMemoryStream() = {Nothing,
                                                 My.Resources.First,
                                                 My.Resources.Second,
                                                 My.Resources.Third}

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        PlaySound(1)
        PlaySound(1)
        PlaySound(1)
        PlaySound(2)
        PlaySound(2)
        PlaySound(2)
        PlaySound(3)
        PlaySound(3)
        PlaySound(3)
    End Sub

    Private Sub PlaySound(index As Integer)
        Dim sound = sounds(index)

        My.Computer.Audio.Play(sound, AudioPlayMode.WaitToComplete)
        sound.Seek(0L, SeekOrigin.Begin)
    End Sub

End Class

这对我来说是可行的。

不要将数组声明为类型
对象。将其声明为这些资源属性的实际类型。这可能是
字节
数组或某种类型的
。如果在开始时需要一个“空”元素,则将其设置为
Nothing
,问题是在您第一次还是第二次播放声音时出现的?@jmcilhinney如果我两次调用声音,仍然会出现相同的错误:“Microsoft.VisualBasic.dll中的System.InvalidOperationException”Microsoft.VisualBasic.dll中出现了“System.InvalidOperationException”类型的未经处理的异常。波头已损坏。这不是问题回答我的问题。请读单词。当您执行问题中的第三个代码段时,异常是在第一行还是在第二行抛出的?噢,很抱歉读得不好,错误是在第二行抛出的,仅当我调用相同的索引时,但如果我调用索引(1)索引(2)索引(3)。一切都很好。。感谢您的及时回复..您按顺序播放不同的文件,我要做的是按如下方式多次播放同一文件:My.Computer.Audio.play(wavFiles(0),AudioPlayMode.WaitToComplete)My.Computer.Audio.play(wavFiles(0),AudioPlayMode.WaitToComplete)My.Computer.Audio.play(wavFiles(0),AudioPlayMode.WaitToComplete)还是有同样的错误…哦,对不起。没有看到。嗨,这很有趣,是声音文件的目录吗?或者参考我的资源?声音文件的完整路径(包括文件名)。但是,如果您不介意这种类型的部署,那么通过这种方式,您必须将实际文件包含到安装中,而不是作为资源。