unity在桌面上创建文件夹,然后将WAV文件保存到其中



我正在做一个钢琴游戏,你按下一个键,它会弹奏相应的音符。我想录制笔记,然后在游戏中播放,并将其作为WAV文件保存到文件夹中,使用OnAudioFilterRead进行录制。这一切都可以在编辑器中工作,但是当我构建游戏时,它仍然保存到Unity游戏文件夹中,我尝试了不同的东西,但它不起作用,所以我暂时将其保留在"./Assets/"。我想在桌面上创建一个文件夹,这样我就可以将 WAV 文件保存在该文件夹中。我不知道该怎么做,所以我不胜感激我的代码在下面的任何帮助

using System.IO; // for FileStream
using System; // for BitConverter and Byte Type
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;

public class Record : MonoBehaviour
{
private int bufferSize;
private int numBuffers;
private int outputRate = 44100;
private String fileName = "recTest.wav";
private int headerSize = 44; //default for uncompressed wav
public Button record, play;
public ArrayList notes;
public bool recordMode = false;
public bool playMode;
Animator anim;
private static string rec;
public AudioClip noteA;
public AudioClip noteB;
public AudioClip noteC;
public AudioClip noteD;
public AudioClip noteE;
public AudioClip noteF;
public AudioClip noteG;
private FileStream fileStream;
String Path;

void Start()
{
AudioSettings.GetDSPBufferSize(out bufferSize, out numBuffers);
anim = gameObject.GetComponent<Animator>();
AudioConfiguration config = AudioSettings.GetConfiguration();
config.sampleRate = outputRate;
// Button rec = record.GetComponent<Button>();
//Button pl = play.GetComponent<Button>();
}
void PlayNote (){
if (Input.GetKeyDown(KeyCode.A))
{
GameObject.Find("Circle_A").GetComponent<Animator>().SetTrigger("A");
GameObject.Find("Circle_A").GetComponent<AudioSource>().PlayOneShot(noteA);
}
if (Input.GetKeyDown(KeyCode.B))
{
GameObject.Find("Circle_B").GetComponent<Animator>().SetTrigger("B");
GameObject.Find("Circle_B").GetComponent<AudioSource>().PlayOneShot(noteB);
}
if (Input.GetKeyDown(KeyCode.C))
{
GameObject.Find("Circle_C").GetComponent<Animator>().SetTrigger("C");
GameObject.Find("Circle_C").GetComponent<AudioSource>().PlayOneShot(noteC);
}
if (Input.GetKeyDown(KeyCode.D))
{
GameObject.Find("Circle_D").GetComponent<Animator>().SetTrigger("D");
GameObject.Find("Circle_D").GetComponent<AudioSource>().PlayOneShot(noteD);
}
if (Input.GetKeyDown(KeyCode.E))
{
GameObject.Find("Circle_E").GetComponent<Animator>().SetTrigger("E");
GameObject.Find("Circle_E").GetComponent<AudioSource>().PlayOneShot(noteE);
}
if (Input.GetKeyDown(KeyCode.F))
{
GameObject.Find("Circle_F").GetComponent<Animator>().SetTrigger("F");
GameObject.Find("Circle_F").GetComponent<AudioSource>().PlayOneShot(noteF);
}
if (Input.GetKeyDown(KeyCode.G))
{
GameObject.Find("Circle_G").GetComponent<Animator>().SetTrigger("G");
GameObject.Find("Circle_G").GetComponent<AudioSource>().PlayOneShot(noteG);
}
}
void Playback()
{

WWW www = new WWW("file:///"+ Application.dataPath +"/" + fileName );
gameObject.GetComponent<AudioSource>().clip = www.GetAudioClip(false, true, AudioType.WAV);
gameObject.GetComponent<AudioSource>().Play();
//playMode = false;
}
public void ButtonPressed()
{
ColorBlock colors = record.colors;
if (!recordMode)
{
colors.normalColor = Color.white;
colors.highlightedColor = new Color32(255, 255, 255, 255);
record.colors = colors;
fileName = "Rec" + System.DateTime.Now.Second + ".wav";
StartWriting(fileName);
print("rec");
recordMode = true;
}
else
{
colors.normalColor = Color.red;
colors.highlightedColor = new Color32(225, 100, 100, 255);
record.colors = colors;
recordMode = false;
WriteHeader();
rec = fileName;
print("Rec stop");
}
}
public void PlayPressed()
{
ColorBlock colors = play.colors;
if (!playMode)
{
colors.normalColor = Color.white;
colors.highlightedColor = new Color32(255, 255, 255, 255);
play.colors = colors;
Playback();
playMode = true;
}
else
{
playMode = false;
colors.normalColor = Color.red;
colors.highlightedColor = new Color32(225, 100, 100, 255);
play.colors = colors;
}

}
void Update()
{
PlayNote();
}
void StartWriting(String name)
{
fileStream = new FileStream("./Assets/" + name, FileMode.Create);
byte emptyByte = new byte();
for (int i = 0; i < headerSize; i++) //preparing the header
{
fileStream.WriteByte(emptyByte);
}
}
void OnAudioFilterRead(float[] data, int channels)
{
if (recordMode)
{
ConvertAndWrite(data); //audio data is interlaced
}
}
void ConvertAndWrite(float[] dataSource)
{
Int16[] intData = new Int16[dataSource.Length];
//converting in 2 steps : float[] to Int16[], //then Int16[] to Byte[]
Byte[] bytesData = new Byte[dataSource.Length * 2];
//bytesData array is twice the size of
//dataSource array because a float converted in Int16 is 2 bytes.
int rescaleFactor = 32767; //to convert float to Int16
for (int i = 0; i < dataSource.Length; i++)
{
intData[i] = (Int16)(dataSource[i] * rescaleFactor);
Byte[] byteArr = new Byte[2];
byteArr = BitConverter.GetBytes(intData[i]);
byteArr.CopyTo(bytesData, i * 2);
}
fileStream.Write(bytesData, 0, bytesData.Length);
}

void WriteHeader()
{
fileStream.Seek(0, SeekOrigin.Begin);
Byte[] riff = System.Text.Encoding.UTF8.GetBytes("RIFF");
fileStream.Write(riff, 0, 4);
Byte[] chunkSize = BitConverter.GetBytes(fileStream.Length - 8);
fileStream.Write(chunkSize, 0, 4);
Byte[] wave = System.Text.Encoding.UTF8.GetBytes("WAVE");
fileStream.Write(wave, 0, 4);
Byte[] fmt = System.Text.Encoding.UTF8.GetBytes("fmt ");
fileStream.Write(fmt, 0, 4);
Byte[] subChunk1 = BitConverter.GetBytes(16);
fileStream.Write(subChunk1, 0, 4);
UInt16 two = 2;
UInt16 one = 1;
Byte[] audioFormat = BitConverter.GetBytes(one);
fileStream.Write(audioFormat, 0, 2);
Byte[] numChannels = BitConverter.GetBytes(two);
fileStream.Write(numChannels, 0, 2);
Byte[] sampleRate = BitConverter.GetBytes(outputRate);
fileStream.Write(sampleRate, 0, 4);
Byte[] byteRate = BitConverter.GetBytes(outputRate * 4);
// sampleRate * bytesPerSample*number of channels, here 44100*2*2
fileStream.Write(byteRate, 0, 4);
UInt16 four = 4;
Byte[] blockAlign = BitConverter.GetBytes(four);
fileStream.Write(blockAlign, 0, 2);
UInt16 sixteen = 16;
Byte[] bitsPerSample = BitConverter.GetBytes(sixteen);
fileStream.Write(bitsPerSample, 0, 2);
Byte[] dataString = System.Text.Encoding.UTF8.GetBytes("data");
fileStream.Write(dataString, 0, 4);
Byte[] subChunk2 = BitConverter.GetBytes(fileStream.Length - headerSize);
fileStream.Write(subChunk2, 0, 4);
fileStream.Close();
}

}

桌面路径:

path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

检查文件夹是否存在:

var dirPtah = path + "wav"
if (!Directory.Exists (dirPtah)) 
{
Directory.CreateDirectory (dirPtah);
}

相关内容

最新更新