unity实现录音功能



using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class AudioTest : MonoBehaviour {
    private AudioSource _AudioSource;

    public AudioSource myAudioSource
    {
        get
        {
            if(myAudioSource ==null )
            {
                _AudioSource = gameObject.AddComponent<AudioSource>();
            }
            return _AudioSource;
        }
    }

    private int deviceCount;
    string sFrequency = "10000";
    string sLog = "";

    void Start()
    {
        string[] ms = Microphone.devices;
        deviceCount = ms.Length;
        if(deviceCount == 0)
        {
            print("没有发现耳机!");
        }
    }

    void OnGUI()
    {
        if (deviceCount > 0)
        {
            GUILayout.BeginHorizontal();
            if (!Microphone.IsRecording(null) && GUILayout.Button("Start", GUILayout.Height(Screen.height / 20), GUILayout.Width(Screen.width / 5)))
            {
                StartRecord();
            }
            if (Microphone.IsRecording(null) && GUILayout.Button("Stop", GUILayout.Height(Screen.height / 20), GUILayout.Width(Screen.width / 5)))
            {
                StopRecord();
            }
            if (!Microphone.IsRecording(null) && GUILayout.Button("Play", GUILayout.Height(Screen.height / 20), GUILayout.Width(Screen.width / 5)))
            {
                PlayRecord();
            }
            if (!Microphone.IsRecording(null) && GUILayout.Button("Print", GUILayout.Height(Screen.height / 20), GUILayout.Width(Screen.width / 5)))
            {
                PrintRecord();
            }
            sFrequency = GUILayout.TextField(sFrequency, GUILayout.Width(Screen.width / 5), GUILayout.Height(Screen.height / 20));
            GUILayout.EndHorizontal();
        }
        GUILayout.Label(sLog);
    }  

    private void StartRecord()
    {
        myAudioSource.Stop();
        myAudioSource.loop = false;
        myAudioSource.mute = true;
        myAudioSource.clip = Microphone.Start(null, false, 1, int.Parse(sFrequency));
        while (!(Microphone.GetPosition(null) > 0)) { }
        myAudioSource.Play();
        print("开始收音!");
    }

    private void StopRecord()
    {
        if(!Microphone .IsRecording (null ))
        {
            return;
        }
        Microphone.End(null);
        myAudioSource.Stop();
    }
	
    private void PlayRecord()
    {
        if (Microphone.IsRecording(null)) return;

        if (myAudioSource.clip == null) return;

        myAudioSource.mute = false;
        myAudioSource.loop = false;
        myAudioSource.Play();
    }

    private void PrintRecord()
    {
        if (Microphone.IsRecording(null)) return;

        byte[] data = GetClipData();
        string sLog = "total length  " + data.Length + " time " + myAudioSource.time;
    }

    public byte[] GetClipData()
    {
        if (myAudioSource.clip == null) return null;

        float[] samples = new float[myAudioSource.clip.samples];

        myAudioSource.clip.GetData(samples, 0);

        byte[] outData = new byte[samples.Length * 2];

        int rescaleFator = 32767;
        for (int i = 0; i < samples .Length ; i++)
        {
            short temshort = (short)(samples[i] * rescaleFator);

            byte[] tempData = System.BitConverter.GetBytes(temshort);

            outData[i * 2] = tempData[0];
            outData[i * 2 + 1] = tempData[1];
        }

        if(outData == null || outData.Length <= 0)
        {
            return null;
        }

        return outData;
    }
}



原文连接 :  点击打开链接

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值