日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

android下音频采集功能,音频采集:Android基于AudioRecord的实现

發(fā)布時(shí)間:2025/4/16 Android 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android下音频采集功能,音频采集:Android基于AudioRecord的实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

這篇文章簡(jiǎn)單詳情下手機(jī)端Android系統(tǒng)下利使用AudioRecord進(jìn)行音頻采集方法。

開(kāi)始前先提供一份源碼 AudioRecordLib 。

AudioRecord采集的核心實(shí)現(xiàn)在于 AudioRecordCore.java 這個(gè)文件。

權(quán)限申請(qǐng)

想要用AudioRecord這個(gè)API,需要在AndroidManifest.xml的配置文件里面添加錄音權(quán)限:

初始化

AudioRecord的初始化需要先創(chuàng)立一個(gè)AudioRecord實(shí)例。

構(gòu)造函數(shù)原型如下:public AudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat,int bufferSizeInBytes)

具體參數(shù)說(shuō)明:audioSource 這個(gè)參數(shù)指的是音頻采集的輸入源,接受的值定義在MediaRecorder.AudioSource里面,一般來(lái)說(shuō)用DEFAULT或者者M(jìn)IC就可。

sampleRateInHz 指定采集音頻的采樣頻率,比較通使用的是44100(44.1kHz),這個(gè)值是科學(xué)家們通過(guò)奈葵斯特采樣定理得出的一個(gè)人能接受最佳的采樣頻率值。

channelConfig 指定AudioRecord采集幾個(gè)聲道的聲音,預(yù)設(shè)值定義在AudioFormat中,常使用值有 CHANNEL_CONFIGURATION_MONO(單聲道) 和 CHANNEL_CONFIGURATION_STEREO(雙聲道)。

audioFormat 指定采樣PCM數(shù)據(jù)的采樣格式,預(yù)設(shè)值定義在也AudioFormat中,常使用值有 ENCODING_PCM_8BIT、ENCODING_PCM_16BIT和ENCODING_PCM_FLOAT,值得強(qiáng)調(diào)的是ENCODING_PCM_16BIT可以保證兼容大部分Andorid手機(jī)。

bufferSizeInBytes 配置AudioRecord內(nèi)部的音頻數(shù)據(jù)緩沖區(qū),一般來(lái)說(shuō)緩存區(qū)越小,產(chǎn)生的音頻推遲也越小;值得注意的是,我們可以利使用AudioRecord.getMinBufferSize()這個(gè)方法幫我們算出最小的緩存區(qū)大小,這個(gè)數(shù)值最好不要自己計(jì)算,畢竟不同廠商可能有不同的緩存區(qū)采集實(shí)現(xiàn)。

檢測(cè)AudioRecord當(dāng)前狀態(tài)

因?yàn)榭赡艽嬖跈?quán)限問(wèn)題導(dǎo)致配置AudioRecord失敗,所以我們需要在開(kāi)始采集前檢查一下AudioRecord的狀態(tài):if (mAudioRecord.getState() == AudioRecord.STATE_INITIALIZED) { //todo start}

假如getState()不等于AudioRecord.STATE_INITIALIZED說(shuō)明創(chuàng)立AudioRecord失敗,這時(shí)候應(yīng)該給使用戶(hù)反饋信息。

完整代碼如下://獲取最低AudioRecord內(nèi)部音視頻緩沖區(qū)大小,此大小依賴(lài)于各產(chǎn)商實(shí)現(xiàn),最好不要自己計(jì)算mRecordBufSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat);//初始化AudioRecord實(shí)例mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, channelConfig, audioFormat, mRecordBufSize);//檢測(cè)AudioRecord初始化能否成功if (mAudioRecord.getState() != AudioRecord.STATE_INITIALIZED) { mAudioRecord = null; mRecordBufSize = 0; return false;}else { //創(chuàng)立一個(gè)位置使用于存放后續(xù)的PCM數(shù)據(jù) mPcmData = new byte[mRecordBufSize]; mState = INIT; return true;}

開(kāi)始采集

創(chuàng)立好了AudioRecord實(shí)例,調(diào)使用如下的方法就可開(kāi)始麥克風(fēng)采集:mAudioRecord.startRecording();

提取數(shù)據(jù)

調(diào)使用了開(kāi)始采集后,我們需要另起一條線程進(jìn)行PCM數(shù)據(jù)提取。

我們需要循環(huán)不斷從AudioRecord的緩沖區(qū)里面將數(shù)據(jù)讀取出來(lái),值得注意的是這個(gè)過(guò)程肯定要及時(shí),不然會(huì)出現(xiàn)“overrun”的錯(cuò)誤,也就是沒(méi)有及時(shí)取走音頻數(shù)據(jù)導(dǎo)致音頻緩存區(qū)溢出了。private Thread mReadDataThread = new Thread() { @Override public void run() { int read; while (mState == RECORDING) { //讀取mRecordBufSize長(zhǎng)度的音頻數(shù)據(jù)存入mPcmData中 read = mAudioRecord.read(mPcmData, 0, mRecordBufSize); //假如讀取音頻數(shù)據(jù)沒(méi)有出現(xiàn)錯(cuò)誤 ===> read 大于0 if (read >= AudioRecord.SUCCESS) { synchronized (AudioRecordRecord.class){ if (mCallback != null) mCallback.onPCMDataAvailable(mPcmData, read); } } } }};

中止采集,釋放資源

中止錄音我們可以調(diào)使用AudioRecord的stop方法來(lái)實(shí)現(xiàn)。mAudioRecord.stop();

但是我們存在采集(音頻提取)線程,所以我們需要更改一個(gè)狀態(tài)變量讓線程結(jié)束mState = INIT;

使得 while (mState == RECORDING) 退出循環(huán)邏輯。

接著我們需要釋放錄制器的資源,以便設(shè)施的其余應(yīng)使用可以正常用錄音器,我們可以調(diào)使用AudioRecord的release方法。mAudioRecord.release();

這樣就完整的結(jié)束了AudioRecord的采集業(yè)務(wù)。

播放PCM文件

Audacity這個(gè)工具可以導(dǎo)入pcm原始文件,并且提供了波形圖查看和播放功能。

操作流程是:

文件 => 導(dǎo)入 => 原始數(shù)據(jù) => 設(shè)置PCM數(shù)據(jù)格式 => 導(dǎo)入

具體效果圖如下:

p1.png

結(jié)語(yǔ)

下一篇博客會(huì)詳情一下Android利使用OpenSL ES進(jìn)行錄音導(dǎo)出PCM數(shù)據(jù)。

本文同步發(fā)布于簡(jiǎn)書(shū)、CSDN。

End!

總結(jié)

以上是生活随笔為你收集整理的android下音频采集功能,音频采集:Android基于AudioRecord的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。