【一天一个小知识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);
}
}
【一天一个小知识10/20】Unity安卓获取麦克风并录音保存。的更多相关文章
- 【一天一个小知识10/20】Unity通过www获取json文本信息。
前提:领导要我在unity获取局域网服务器的文本信息.给了一个json的网络文本让我测试.我对于json以及服务器比较陌生.就直接去网上找相关的资料. 以下是自己测试的代码,没问题. 测试的网络jso ...
- HTML+CSS中的一些小知识
今天分享一些HTML.CSS的小知识,希望能够对大家有所帮助! 1.解决网页乱码的问题:最重要的是要保证各个环节的字符编码一致! (1)编辑器的编辑环境的字符集(默认字符集):Crtl+U 常见的编码 ...
- s性能优化方面的小知识
总结的js性能优化方面的小知识 前言 一直在学习javascript,也有看过<犀利开发Jquery内核详解与实践>,对这本书的评价只有两个字犀利,可能是对javascript理解的还不够 ...
- python小知识-__call__和类装饰器的结合使用,数据描述符__get__\__set__\__delete__(描述符类是Python中一种用于储存类属性值的对象)
class Decorator(): def __init__(self, f): print('run in init......') self.f = f def __call__(self, a ...
- DevExpress之GridControl控件小知识
DevExpress之GridControl控件小知识 一.当代码中的DataTable中有建数据关系时,DevExpress 的 GridControl 会自动增加一个子视图 .列名也就是子表的字段 ...
- 蓝牙Bluetooth技术小知识
蓝牙Bluetooth技术以及广泛的应用于各种设备,并将继续在物联网IoT领域担任重要角色.下面搜集整理了一些关于蓝牙技术的小知识,以备参考. 蓝牙Bluetooth技术始创于1994年,其名字来源于 ...
- javascript实用技巧,js小知识
一.js整数的操作 使用|0和~~可以将浮点转成整型且效率方面要比同类的parseInt,Math.round 要快,在处理像素及动画位移等效果的时候会很有用.性能比较见此. var foo = (1 ...
- (转自http://www.blogjava.net/moxie/archive/2006/10/20/76375.html)WebWork深入浅出
(转自http://www.blogjava.net/moxie/archive/2006/10/20/76375.html) WebWork深入浅出 本文发表于<开源大本营> 作者:钱安 ...
- 12个你未必知道的CSS小知识
虽然CSS并不是一种很复杂的技术,但就算你是一个使用CSS多年的高手,仍然会有很多CSS用法/属性/属性值你从来没使用过,甚至从来没听说过. 1.CSS的color属性并非只能用于文本显示 对于CSS ...
随机推荐
- 如何查看mysql的用户权限
查询语句:select * from mysql.user where user='root'\G;user是用户名 <privileges>是一个用逗号分隔的你想要赋予的MySQL用户权 ...
- linux 安装 Logtash 同步mysql数据到Elasticsearch
官网下载Logtash 离线安装包 下载地址 https://www.elastic.co/cn/downloads/logstash 需要注意版本与es 对应 新建配置文件 新建文件夹 mkdir ...
- 《剑指offer》面试题12. 矩阵中的路径
问题描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左.右.上.下移动一格.如果一条路径经过了矩阵的某一格,那么该 ...
- eclipse导入项目jdk版本不一样
一:eclipse导入项目jdk版本不一样解决方案 参考博文: https://www.cnblogs.com/chenmingjun/p/8472885.html 选中项目右键 --> Pro ...
- 【笔记】thanos ruler组件
阅读官网文档后的笔记:https://thanos.io/tip/components/rule.md/ 感受 官网第一个话就强调风险,看来坑很多,能不用尽量不用 recording rule &am ...
- 【发布开源代码】铁威马NAS存储上实现的视频文件浏览
具体介绍请看:https://github.com/ahfuzhang/tnas_video_web x86机器的windows/linux/mac机器应该都能使用 效果如下: 按月浏览视频 视频太多 ...
- gorm中的scope
作用域允许您重用常用逻辑,共享逻辑需要定义为类型 func(*gorm.DB) *gorm.DB 查询 func Scope1(db *gorm.DB) *gorm.DB { return db.Wh ...
- K8S探针和SVC,POD原理
(6)容器是否健康: spec.container.livenessProbe.若不健康,则Pod有可能被重启(可配置策略) (7)容器是否可用: spec.container.readiness ...
- 1.kafka
什么是Kafka 1.Apache Kafka是一个开源消息系统,由Scala写成. 2.Kafka是一个分布式消息队列.Kafka对消息保存时根据Topic进行归类,发送消息者称为Producer ...
- PyTorch 介绍 | AUTOMATIC DIFFERENTIATION WITH TORCH.AUTOGRAD
训练神经网络时,最常用的算法就是反向传播.在该算法中,参数(模型权重)会根据损失函数关于对应参数的梯度进行调整. 为了计算这些梯度,PyTorch内置了名为 torch.autograd 的微分引擎. ...