gpt4 book ai didi

.net - .net mcisendstring-使用资源而不是完整路径

转载 作者:行者123 更新时间:2023-12-03 00:59:54 28 4
gpt4 key购买 nike

好的,所以我使用mciSendString创建了一个SOUND类。我正在使用它来播放我制作的RPG风格游戏的音乐和其他声音文件。它有效,而且效果很好...但是。我的问题是,它需要声音文件的完整路径才能正常工作(不确定这是否正确)。

这是mcisendstring的一些怪癖:

  • mcisendstring讨厌空格,空格会导致崩溃(无法加载文件)-添加报价
  • 路径中的点可能导致加载失败(仅点应用于扩展)
  • 非常长的路径将导致加载失败(允许的最大字符数为255)
  • 相对路径将导致无法加载...(不能使用类似于chicken.mp3之类的东西。必须使用C:\ chicken.mp3)
  • 如果repeat = true ,则
  • .wav文件将无法加载

    我尝试将文件添加到资源中,并尝试设置资源的路径,但是它说:Value of type '1-dimensional array of Byte' cannot be converted to 'String'

    任何帮助是极大的赞赏 :)

    这是我的代码:
    Public Class SOUND

    Public Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" _
    (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Integer, ByVal hwndCallback As Integer) As Integer
    'Command String VERY IMPORTANT

    Private oName As String = Nothing

    Public Property Name As String
    Set(value As String)
    oName = value
    End Set
    Get
    Return oName
    End Get
    End Property

    Public Sub Play(ByVal id As Integer, ByVal repeat As Boolean, Optional volume As Integer = 1000)

    If repeat = True Then

    mciSendString("Open " & GetFile(id) & " alias " & oName, CStr(0), 0, 0) 'Open the file
    mciSendString("play " & oName & " repeat ", CStr(0), 0, 0) 'then play with repeating value

    Else

    mciSendString("Open " & GetFile(id) & " alias " & oName, CStr(0), 0, 0)
    mciSendString("play " & oName, CStr(0), 0, 0)

    End If

    'Optionally Set Volume
    mciSendString("setaudio " & oName & " volume to " & volume, CStr(0), 0, 0)

    End Sub

    Public Sub Kill(ByVal song As String)

    mciSendString("close " & song, CStr(0), 0, 0)
    oName = Nothing

    End Sub

    ' Media Library
    Private Function GetFile(ByVal id As Integer) As String

    Dim path As String = ""

    'mcisendstring Hates spaces, spaces will cause crash (failure to load file) - ADD QUOTES
    'Dots in path can cause failure to load (only dot should be for the extention)
    'Very Long Paths will cause failure to load (Max Characters allowed is 255)
    'Relative paths will cause failure to load...(cannot use something like chicken.mp3 ... must use ex:[C:\chicken.mp3])
    '.wav files will fail to load if repeat = true

    Select Case id

    Case 0 'Game Over

    path = "C:\FinalFantasy7-SendaDreamIntoTheUniverse.mp3"

    Case 1 'Battle Sequence

    path = "C:\FinalFantasyTactics-Garland_Magic.mp3"

    Case 2 'Battle Victory

    path = "C:\FinalFantasyLegend2-Victory.mp3"

    Case 3 'Mission Time

    path = "C:\FinalFantasyAdventure-Mission.mp3"

    End Select

    path = Chr(34) & path & Chr(34)
    'Chr(34) is quotes...cannot just use "" because it will think that it is part of the string/path itself.


    Return path
    End Function

    末级

    我需要的:
  • 我需要以某种方式获取.mp3文件作为可用于路径的资源,或者我需要一些其他方式来代替,这些文件不在根驱动器或其他完整的计算机路径中。

  • 我需要的例子

    更改
    Select Case id

    Case 0 'Game Over

    path = "C:\FinalFantasy7-SendaDreamIntoTheUniverse.mp3"
    End Select


    Select Case id

    Case 0 'Game Over

    path = My.Resources.FinalFantasyAdventure_Mission
    End Select

    我如何播放声音:

    (在另一份测试表格上)
    Dim intSound As Integer = 0
    Dim snd As New SOUND 'SOUND is the sound class with mcisendstring

    Private Sub PlaySoundBtn_Click(sender As System.Object, e As System.EventArgs) Handles PlaySoundBtn.Click

    intSound += 1

    With snd
    .Name = "SOUND" & intSound 'SOUND is the alias along with the number (this one is SOUND1)
    .Play(3, True, 500)
    '3 is the song ID, True is for the repeat, 500 is for the optional volume (Max = 1000)
    End With

    End Sub

    附言我在项目中使用XNA Graphics,也有NuGet的BizArk Core。因此,如果我可以使用其中任何一个,请告诉我如何使用其中任何一个来完成我需要做的事情。在此先感谢您的帮助。

    最佳答案

    如上所述,这是一个旧线程,但我想在Google上仍然会有人发现它(就像我今天所做的那样)。

    只是一个额外的建议,有时您的音频文件不会在输出目录中,或者可能希望分发独立​​的可执行文件。还存在可以从输出目录中删除文件的风险,并且很容易重新创建它。另外,将资源作为可执行文件的一部分并在输出目录中占用的空间要比仅将其作为可执行文件的一部分占用更多的空间,因此有时仅将文件临时存储在磁盘上(稍后再删除)是值得的在那里拥有永久副本,以便您可以访问它。

    在这些情况下,能够在运行时从资源中获取文件并将其保存到磁盘上可以访问的位置(如果要稍后删除它,可能是一个临时文件位置),这很有用。

    下面的非常简单的代码可以做到这一点:

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load

    SaveResourceObject("FinalFantasyAdventure_Mission", "C:\FinalFantasyAdventure_Mission.mp3")

    End Sub

    Sub SaveResourceObject(Resource as String, FileName as String)
    Dim myMemStream As New System.IO.MemoryStream
    My.Resources.ResourceManager.GetObject(Resource).CopyTo(myMemStream)
    Dim myBytes() As Byte = myMemStream.ToArray
    My.Computer.FileSystem.WriteAllBytes(FileName, myBytes, False)
    End Sub

    请注意,以上代码中的Resource变量实际上是资源的名称,而不是资源本身。因此,如果尝试执行以下操作,则会收到错误消息:
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    SaveResourceObject(My.Resources.FinalFantasyAdventure_Mission, "C:\FinalFantasyAdventure_Mission.mp3")
    End Sub

    如果愿意,您可以轻松地修改代码以接受实际资源作为参数。

    注意,在上面的示例中,我使用了“C:\”,但是我建议在应用程序数据文件夹中创建自己的文件夹,您可以使用以下命令找到该文件夹​​:
    Dim AppDataPath as String = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData)

    或者,如果您已导入System.Environment,则更简单:
    Dim AppDataPath as String = GetFolderPath(SpecialFolder.ApplicationData)

    关于.net - .net mcisendstring-使用资源而不是完整路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9705159/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com