欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何解析Microphone無限時長錄制

如何解析Microphone無限時長錄制,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

公司主營業(yè)務(wù):成都做網(wǎng)站、成都網(wǎng)站設(shè)計、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出明山免費做網(wǎng)站回饋大家。

Unity可以很方便的通過 Microphone.Start()方法來調(diào)用麥克風(fēng),但是有一個弊端是,必須傳入時長,這就很尷尬了,因為大多數(shù)時間,我們是不知道用戶需要何時關(guān)閉麥克風(fēng)的,

這里提供一個解決思路:

1、將microphone設(shè)置為循環(huán)錄制,即:

Microphone.Start(micName, true,2,16000);

2、每隔一定間隔讀取錄制好的數(shù)據(jù),并將它緩存起來。

這里值得一提的是,如果每隔2秒保存一下音頻數(shù)據(jù)(因為我設(shè)置的錄制時間是2秒),

因為代碼運行也需要時間,會導(dǎo)致音頻數(shù)據(jù)損壞,聲音會出現(xiàn)明顯的斷層現(xiàn)象,所以這里將它分段保存就能解決這種問題,

當(dāng)麥克風(fēng)錄制的位置大于音頻的一半的時候,保存上一段音頻,當(dāng)麥克風(fēng)錄制完時,保存后一段音頻。

bool isSaveFirstHalf = true;//將音頻從中間分生兩段,然后分段保存   int micPosition;   while (!isMicRecordFinished)   {       if (isSaveFirstHalf)       {           yield return new WaitUntil(() => { micPosition = Microphone.GetPosition(micName);return micPosition > length * 6 / 10 && micPosition < length; });//保存前半段           micDataTemp = new float[length / 2];           micClip.GetData(micDataTemp, 0);           micDataList.AddRange(micDataTemp);           isSaveFirstHalf = !isSaveFirstHalf;       }       else       {           yield return new WaitUntil(() => { micPosition = Microphone.GetPosition(micName); return micPosition > length / 10 && micPosition < length / 2; });//保存后半段           micDataTemp = new float[length/2];           micClip.GetData(micDataTemp, length / 2);           micDataList.AddRange(micDataTemp);           isSaveFirstHalf = !isSaveFirstHalf;       }    }

最后處理一下結(jié)束時的音頻

   micPosition = Microphone.GetPosition(micName);   if (micPosition <= length)//前半段   {       micDataTemp = new float[micPosition/2];       micClip.GetData(micDataTemp, 0);   }   else   {       micDataTemp = new float[micPosition - length/2];       micClip.GetData(micDataTemp, length/2);   }

3、最后通過保存的數(shù)據(jù)生成新的音頻,即:

AudioClip.Create("RecordClip", micDataList.Count, 1, 16000, false); newAudioClip.SetData(micDataList.ToArray(), 0);

 

完整代碼如下:

using System;using System.Collections;using System.Collections.Generic;using UnityEngine;
public class MicUnlimitedDuration : MonoBehaviour {    public delegate void AudioRecordHandle(AudioClip audioClip);    public AudioSource audioSource;
   AudioClip micClip;

   bool isMicRecordFinished= true;
   List<float> micDataList = new List<float>();    float[] micDataTemp;
   string micName;
   public void StartMicrophone() {        StopCoroutine(StartMicrophone(null, PlayAudioRecord));        StartCoroutine(StartMicrophone(null, PlayAudioRecord));    }

   IEnumerator StartMicrophone(string microphoneName,AudioRecordHandle  audioRecordFinishedEvent) {        Debug.Log("Start Mic");        micDataList = new List<float>();        micName = microphoneName;        micClip = Microphone.Start(micName, true,2,16000);        isMicRecordFinished = false;        int length = micClip.channels * micClip.samples;        bool isSaveFirstHalf = true;//將音頻從中間分生兩段,然后分段保存        int micPosition;        while (!isMicRecordFinished)        {            if (isSaveFirstHalf)            {                yield return new WaitUntil(() => { micPosition = Microphone.GetPosition(micName);return micPosition > length * 6 / 10 && micPosition < length; });//保存前半段                micDataTemp = new float[length / 2];                micClip.GetData(micDataTemp, 0);                micDataList.AddRange(micDataTemp);                isSaveFirstHalf = !isSaveFirstHalf;            }            else            {                yield return new WaitUntil(() => { micPosition = Microphone.GetPosition(micName); return micPosition > length / 10 && micPosition < length / 2; });//保存后半段                micDataTemp = new float[length/2];                micClip.GetData(micDataTemp, length / 2);                micDataList.AddRange(micDataTemp);                isSaveFirstHalf = !isSaveFirstHalf;            }
       }        micPosition = Microphone.GetPosition(micName);        if (micPosition <= length)//前半段        {            micDataTemp = new float[micPosition/2];            micClip.GetData(micDataTemp, 0);        }        else        {            micDataTemp = new float[micPosition - length/2];            micClip.GetData(micDataTemp, length/2);        }        micDataList.AddRange(micDataTemp);        Microphone.End(micName);        AudioClip newAudioClip = AudioClip.Create("RecordClip", micDataList.Count, 1, 16000, false);        newAudioClip.SetData(micDataList.ToArray(), 0);        audioRecordFinishedEvent(newAudioClip);        Debug.Log("RecordEnd");    }


   public void StopMicrophone()    {        Debug.Log("Stop mic");        isMicRecordFinished = true;    }
   void PlayAudioRecord(AudioClip newAudioClip)    {        audioSource.clip = newAudioClip;        audioSource.Play();    }}

看完上述內(nèi)容,你們掌握如何解析Microphone無限時長錄制的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

網(wǎng)頁題目:如何解析Microphone無限時長錄制
地址分享:http://chinadenli.net/article20/gidijo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、全網(wǎng)營銷推廣、企業(yè)網(wǎng)站制作、自適應(yīng)網(wǎng)站、搜索引擎優(yōu)化、App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)