【一天一个小知识10/20】Unity安卓获取麦克风并录音保存。

2021-10-20

10:42:16

#region 模块信息
// **********************************************************************
// Copyright (C) 2019 jiamiantech
// Please contact me if you have any questions
// File Name:             Recording
// Author:                romantic
// WeChat||QQ:            at853394528 || 853394528 
// **********************************************************************
#endregion
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class Recording : MonoBehaviour
{
    public Text ShowTimeHint;//剩余时间的文字提示
    public Button voiceBtn;
    float tirecordingTimemer = 0;//录音时长限制
    private string[] devices;
    public  AudioSource aud;
    // Use this for initialization
    void Start()
    {
        devices = Microphone.devices;
        if (devices.Length != 0)
        {
            ShowTimeHint.text = "设备有麦克风:" + devices[0];
        }
        else
        {
            ShowTimeHint.text = "设备没有麦克风";
        }
        AddTriggersListener(voiceBtn.gameObject, EventTriggerType.PointerDown, (t) =>
        {
            Debug.Log("开始说话");
            StartCoroutine("KeepTime");
            //参数一:设备名字,null为默认设备;参数二:是否循环录制;参数三:录制时间(秒);参数四:音频率
            aud.clip = Microphone.Start(devices[0], false, 15, 6000);

        });
        AddTriggersListener(voiceBtn.gameObject, EventTriggerType.PointerUp, (t) =>
        {
            Debug.Log("结束说话");
            StopCoroutine("KeepTime");
            Microphone.End(devices[0]);
            //直接播放
            aud.Play();
            string byteStr = AudioToByte(aud);
            Debug.Log(byteStr);
            //传输给服务器
            //GameManager.GetInstance.tcpClient.SendMeToServer(ProtoType.T_S_Voice, byteStr);
        });
    }
    //把录好的音段转化为base64的string。测试过不转base64直接用byte[]也是可以的
    public string AudioToByte(AudioSource audio)
    {
        float[] floatData = new float[audio.clip.samples * audio.clip.channels];
        audio.clip.GetData(floatData, 0);
        byte[] outData = new byte[floatData.Length];
        Buffer.BlockCopy(floatData, 0, outData, 0, outData.Length);
        return Convert.ToBase64String(outData);
    }


    //把base64的string转化为audioSource
    public void ByteToAudio(AudioSource audioSource, string str)
    {
        byte[] bytes = Convert.FromBase64String(str);
        float[] samples = new float[bytes.Length];
        Buffer.BlockCopy(bytes, 0, samples, 0, bytes.Length);
        audioSource.clip = AudioClip.Create("RecordClip", samples.Length, 1, 6000, false);
        audioSource.clip.SetData(samples, 0);
        audioSource.Play();
    }

    IEnumerator KeepTime()
    {
        for (tirecordingTimemer = 15; tirecordingTimemer >= 0; tirecordingTimemer -= Time.deltaTime)
        {
            if (tirecordingTimemer <= 15)
            {
                ShowTimeHint.text = "你还可以录 " + (int)tirecordingTimemer + " 秒";
                if (tirecordingTimemer < 1)
                {
                    ShowTimeHint.text = "时间到";
                    Microphone.End(devices[0]);
                }
            }
            yield return 0;
        }
    }

    //添加按钮监听类型
    private void AddTriggersListener(GameObject obj, EventTriggerType eventID, UnityAction<BaseEventData> action)
    {
        EventTrigger trigger = obj.GetComponent<EventTrigger>();
        if (trigger == null)
        {
            trigger = obj.AddComponent<EventTrigger>();
        }

        if (trigger.triggers.Count == 0)
        {
            trigger.triggers = new List<EventTrigger.Entry>();
        }

        UnityAction<BaseEventData> callback = new UnityAction<BaseEventData>(action);
        EventTrigger.Entry entry = new EventTrigger.Entry();
        entry.eventID = eventID;
        entry.callback.AddListener(callback);
        trigger.triggers.Add(entry);
    }
}

  

posted on 2021-10-20 10:47  不要停下来啊!  阅读(515)  评论(0)    收藏  举报

导航