Android 音訊採集(原始音訊)

2021-07-22 23:40:25 字數 4140 閱讀 4267

android 音訊簡介

常見的音訊編譯碼的型別:aac  opus ***  amr  ogg  pcm  

aac: 高階音訊編碼  對應  .m4a(audio/m4a)或者.3pg(audio/3gpp)檔案   heaac:高階aac,使用的比較多。

opus:有損聲音編碼的格式,由網際網路工程任務組

(ietf)進來開發,適用於網路上的實時聲音傳輸,如:語音通話

***: 使用的最廣泛的音訊編解碼器  對應 .***(audio/***) 各種****一般用這種。

amr:自適應多速率音訊編解碼器,一般用於語音呼叫程式。

ogg:開發的無專利的音訊編解碼器,其質量可與商業的和手專利保護的***以及aac編譯碼相媲美。

pcm :原始音訊,在android平台上由audio record直接錄用下來的,未經過編碼的。

android音訊採集(捕獲)

android平台上的音訊採集一般就三種:1.利用android內建的應用程式   2.使用mediarecorder進行音訊捕獲   3.使用audiorecord進行音訊捕獲。此3種方式的靈活性逐漸增大,相應的所需要做的工作也逐漸增多。

一、android 內建的應用程式。

intent intent=new intent(mediastore.audio.media.record_sound_action);

startactivityforresult(intent,0); //通過startactivityforresult獲取音訊錄製的結果的路徑

這種方式靈活度最差,一般就是做著演示下,開發中基本不用這種方案。

二、使用mediarecorder進行音訊的捕獲。

使用步驟:

建立mediarecorder物件,呼叫如下方法(ps:呼叫順序順序對結果的影響是非常的大。)

mediarecorder recorder=new mediarecorder();//建立mediarecoder物件

1.recorder.setaudiosource(mediarecorder.audiosource.mic); //呼叫setaudiosource方法 (呼叫的第乙個方法) 

mediarecorder.audiosource.camcorder和mediarecorder.audiosource.voice_recognition當裝置具有。>=2個麥克風的時候就可以使用它們。

<?xml version="1.0" encoding="utf-8"?>

public class mainactivity extends activity implements onclicklistener

//初始化

public void init()

//設定***

public void initlistener()

//錄音

public void recod()

try

audiofile.createnewfile();//建立檔案

} catch (exception e)

recorder.setoutputfile(audiofile.getabsolutepath()); //設定輸出檔案

try catch (illegalstateexception e) catch (ioexception e)

isrecoding=true;

recorder.start(); }

public void onclick(view v)

//停止錄音

case r.id.stoprecording:

break;

}default:

break;

} }}

mediarecoder的其他api方法:

//設定錄製允許的最大時長 單位是毫秒。必須在setoutformat方法之後,prepare方法之前使用。

setmaxduration(int);

//設定檔案錄製的存放檔案的最大值,單位是位元組 。必須在setoutformat方法之後,prepare方法之前使用。 

setmaxfilesize(long)

//允許錄製的音訊通道數,通常是乙個通道(單聲道,2個通道雙聲道,立體聲)。必須在呼叫prepare方法之前呼叫。

setaudiochannels(int)

//允許制定捕獲和編碼音訊的取樣率。硬體和使用的編碼器將會決定合適的取樣率。必須在呼叫prepare方法之前呼叫。

setaudiosamplingrate(int)

//允許指定當壓縮音訊時編碼器所使用的每秒位數(位/秒)。必須在呼叫prepare方法之前呼叫。

setaudioencodingbitrate在(int)

三、使用audiorecord 進行音訊捕獲。

這種方法是3種之中最為靈活的,能讓開發者最大限度的處理採集的音訊,同時它捕獲到的音訊是原始音訊pcm格式的!像做變聲處理的需要就必須要用它收集音訊。在實際開發中,它也是最常用來採集音訊的手段。也是本文介紹的重點。

//指定音訊源 這個和mediarecorder是相同的 

int audiosource=mediarecorder.audiosource.mic;

//指定取樣率 (mediarecoder 的取樣率通常是8000hz cd的通常是44100hz 不同的android手機硬體將能夠以不同的取樣率進行取樣。其中11025是乙個常見的取樣率)

int samplerateinhz=11025 ;

//指定捕獲音訊的通道數目。在audioformat類中指定用於此的常量  

int channelconfig=audioformat.channel_configuration_mono;

//指定音訊量化位數 ,在audioformaat類中指定了以下各種可能的常量。通常我們選擇encoding_pcm_16bit和encoding_pcm_8bit pcm代表的是脈衝編碼調製,它實際上是原始音訊樣本。

//因此可以設定每個樣本的解析度為16位或者8位,16位將占用更多的空間和處理能力,表示的音訊也更加接近真實。

int audioformat=audioformat.encoding_pcm_16bit;

指定緩衝區大小。呼叫audiorecord類的getminbuffersize方法可以獲得。

audiorecord record=new audiorecord(audiosource,samplerateinhz,channelconfig,audioformat,buffersizeinbytes);

布局xml檔案和mediarecorder demo中一樣,2個按鈕而已!就不貼了,下面貼出audiorecord的demo的源**.

public class mainactivity extends activity implements onclicklistener 

//初始化

public void init()

//初始化***

public void initlistener()

public void onclick(view v)

//停止錄音

case r.id.stoprecordingbutton:}}

//開始錄音

public void record()

try

catch (ioexception e)

try

r++;

}audiorecord.stop();//停止錄音

dos.close();

} catch (throwable t)

}}).start();

}

//停止錄音

public void stoprecording()

}

注意這幾個demo都要新增以下許可權:

四、備註:

mediarecorder採集音訊的demo原始碼

audiorecord採集音訊的demo原始碼

音訊如何採集

1 在例項化 audiorecord 時需要指定採集源 2 設定為麥克風 3 然後指定取樣率 4 我們公司採用相容性非常強的 44100hz 也就是每秒採集 44100 次,5 接著是配置音訊通道 6 我們團隊採用了 audioformat.channel in mono 代表單通道,當然也是支援雙...

語音傳輸 音訊採集

我想做語音傳輸方面的設計,駐極式咪頭採集語音頻號經lm358放大,用的mcu是stm32,請問該電路輸出是否會超過ad的參考電壓3.3v?謝謝!lm358可以用3.3v吧,它的單電源電壓範圍3 32v 是想著打算c2輸出就接mcu的adc引腳,有什麼問題嗎?1.lm358給3.3v供電下,輸入輸出的...

Android音訊焦點

ad 獲取音訊焦點 可以通過呼叫 requestaudiofocus 來實現,如果請求成功,返回 audiofocus request granted 您必須指定流型別 使用的是哪乙個流 和音訊焦點的型別 短暫的或是持久的 下面的 片斷演示了請求 音訊流的永久音訊焦點。abandon audio f...