我正在使用名爲Visualizer Studio的軟件包(http://www.alteredr.com/visualizer-studio/)製作一個遊戲,讓對象對音樂做出反應。我的目標是讓用戶能夠在遊戲過程中隨時加載歌曲。這將是獨立/ PC,而不是WebPlayer。在Unity中通過音頻源播放NAudio.mp3
我的問題是Visualizer Studio從場景中的音頻源獲取音頻數據。因此,當我使用NAudio加載和流式傳輸MP3時,可視化工作室聽不到它們,而我的物體對音樂沒有反應。
我現在在我的代碼中使用IWavePlayer。我嘗試添加audio.clip = www.GetAudioClip和類似的功能,讓音頻剪輯加載正在播放的音樂,但無濟於事。
我從我的博客文章(源代碼在底部)中選擇和傳輸.mp3s的代碼:(http://denis-potapenko.blogspot.com/2013/04/task-6-loading-mp3-audio-via-www-class.html)。目前它沒有變化,因爲我沒有嘗試過。
要清楚,當我從文件瀏覽器中選擇它們時,.mp3s DO會播放。我只需要他們通過我的場景中的音頻源播放。請,必須有辦法做到這一點。我已經聯繫了可視化工作室支持,並在統一論壇上提出要求,但目前還沒有人能夠提供幫助。
請記住,我不是一個偉大的程序員,所以你可能不得不爲我愚蠢的回答。感謝您提前的耐心。直接當您使用WaveOut
比如,你正在玩的(相對)
using UnityEngine;
using System.Collections;
using System.IO;
using System.Runtime;
using System.Runtime.InteropServices;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using NAudio;
using NAudio.Wave;
public class AppRoot : MonoBehaviour
{
///////////////////////////////////////////////////////////////////////////
#region Variables
private static AppRoot mInstance = null;
private const string cLocalPath = "file://localhost/";
private IWavePlayer mWaveOutDevice;
private WaveStream mMainOutputStream;
private WaveChannel32 mVolumeStream;
#endregion
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
#region Interface
public AppRoot()
{
mInstance = this;
}
public void Start()
{
}
public void Update()
{
if(Input.GetKeyDown(KeyCode.F))
{
UnloadAudio();
LoadAudio();
}
}
public void OnGUI()
{
if (GUI.Button(new Rect(100, Screen.height - 200 + 100, Screen.width - 200, 35), "Load audio"))
{
UnloadAudio();
LoadAudio();
}
}
public void OnApplicationQuit()
{
UnloadAudio();
}
#endregion
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
#region Implementation
private void LoadAudio()
{
System.Windows.Forms.OpenFileDialog ofd = new System.Windows.Forms.OpenFileDialog();
ofd.Title = "Open audio file";
ofd.Filter = "MP3 audio (*.mp3) | *.mp3";
if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
WWW www = new WWW(cLocalPath + ofd.FileName);
Debug.Log("path = " + cLocalPath + ofd.FileName);
while (!www.isDone) { };
if (!string.IsNullOrEmpty(www.error))
{
System.Windows.Forms.MessageBox.Show("Error! Cannot open file: " + ofd.FileName + "; " + www.error);
return;
}
byte[] imageData = www.bytes;
if (!LoadAudioFromData(imageData))
{
System.Windows.Forms.MessageBox.Show("Cannot open mp3 file!");
return;
}
mWaveOutDevice.Play();
Resources.UnloadUnusedAssets();
}
}
private bool LoadAudioFromData(byte[] data)
{
try
{
MemoryStream tmpStr = new MemoryStream(data);
mMainOutputStream = new Mp3FileReader(tmpStr);
mVolumeStream = new WaveChannel32(mMainOutputStream);
mWaveOutDevice = new WaveOut();
mWaveOutDevice.Init(mVolumeStream);
return true;
}
catch (System.Exception ex)
{
Debug.LogWarning("Error! " + ex.Message);
}
return false;
}
private void UnloadAudio()
{
if (mWaveOutDevice != null)
{
mWaveOutDevice.Stop();
}
if (mMainOutputStream != null)
{
// this one really closes the file and ACM conversion
mVolumeStream.Close();
mVolumeStream = null;
// this one does the metering stream
mMainOutputStream.Close();
mMainOutputStream = null;
}
if (mWaveOutDevice != null)
{
mWaveOutDevice.Dispose();
mWaveOutDevice = null;
}
}
#endregion
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
#region Properties
private static AppRoot Instance
{
get
{
return mInstance;
}
}
#endregion
///////////////////////////////////////////////////////////////////////////
}
真誠, 喬納森
@Steven這當然是一個Unity相關的問題。你爲什麼刪除標籤? – Corey
@Corey:不,它不是。 [Unity](http://stackoverflow.com/tags/unity/info)是一個「.NET的依賴注入容器」,但你正在談論[Unity3d](http://stackoverflow.com/tags/unity3d/info)是「創造遊戲的商業開發平臺」。 – Steven
@Steve感謝您的更正,並將正確的標記添加回:) – Corey