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

公司主營(yíng)業(yè)務(wù):成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶(hù)真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶(hù)帶來(lái)驚喜。創(chuàng)新互聯(lián)推出明山免費(fèi)做網(wǎng)站回饋大家。
這里提供一個(gè)解決思路:
1、將microphone設(shè)置為循環(huán)錄制,即:
Microphone.Start(micName, true,2,16000);
2、每隔一定間隔讀取錄制好的數(shù)據(jù),并將它緩存起來(lái)。
這里值得一提的是,如果每隔2秒保存一下音頻數(shù)據(jù)(因?yàn)槲以O(shè)置的錄制時(shí)間是2秒),
因?yàn)榇a運(yùn)行也需要時(shí)間,會(huì)導(dǎo)致音頻數(shù)據(jù)損壞,聲音會(huì)出現(xiàn)明顯的斷層現(xiàn)象,所以這里將它分段保存就能解決這種問(wèn)題,
當(dāng)麥克風(fēng)錄制的位置大于音頻的一半的時(shí)候,保存上一段音頻,當(dāng)麥克風(fēng)錄制完時(shí),保存后一段音頻。
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é)束時(shí)的音頻
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、最后通過(guò)保存的數(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無(wú)限時(shí)長(zhǎng)錄制的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
網(wǎng)頁(yè)題目:如何解析Microphone無(wú)限時(shí)長(zhǎng)錄制
地址分享:http://www.chinadenli.net/article20/gidijo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷(xiāo)、全網(wǎng)營(yíng)銷(xiāo)推廣、企業(yè)網(wǎng)站制作、自適應(yīng)網(wǎng)站、搜索引擎優(yōu)化、App開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)