在桌面上统一创建文件夹,然后将WAV文件保存到它

时间:2018-06-06 01:07:52

标签: c# unity3d audio-player

我正在制作一个钢琴游戏,你按下一个键然后播放相应的音符。我想录制音符然后在游戏中播放并将其作为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();
}

}

1 个答案:

答案 0 :(得分:0)

桌面路径:

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

检查文件夹存在:

var dirPtah = path + "\wav"
if (!Directory.Exists (dirPtah)) 
{
    Directory.CreateDirectory (dirPtah);
}
相关问题