導航:首頁 > 操作系統 > android音頻通道

android音頻通道

發布時間:2022-08-11 06:22:19

android 開發 如何實現高質量的錄音

在移動APP開發中,每逢APP應用設計到多媒體開發的時候,都會讓很多的程序員頭疼不已,而且項目的開發進度會放慢、項目
的難度也會加大蠻多,同時APP的測試也會增加。Android中的多媒體開發,有音頻的播放、音頻的錄制、視頻的播放、視頻的錄制
等,雖然Android的SDK中提供了一些基礎的開發API類,如音頻的錄制就提供了兩種方式:AudioRecord錄制音頻和MediaRecorder錄
制音頻。AudioRecord類相對於MediaRecorder來說,更加接近底層,為我們封裝的方法也更少。然而實現一個AudioRecord的音頻錄
製程序也很簡單。
一、AudioRecord實現錄制音頻:
package com.hb56.MyAndroidUtil;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.hardware.Camera.AutoFocusCallback;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

/**
* 該實例中,我們使用AudioRecord類來完成我們的音頻錄製程序
* AudioRecord類,我們可以使用三種不同的read方法來完成錄制工作,
* 每種方法都有其實用的場合
* 一、實例化一個AudioRecord類我們需要傳入幾種參數
* 1、AudioSource:這里可以是MediaRecorder.AudioSource.MIC
* 2、SampleRateInHz:錄制頻率,可以為8000hz或者11025hz等,不同的硬體設備這個值不同
* 3、ChannelConfig:錄制通道,可以為AudioFormat.CHANNEL_CONFIGURATION_MONO和AudioFormat.CHANNEL_CONFIGURATION_STEREO
* 4、AudioFormat:錄制編碼格式,可以為AudioFormat.ENCODING_16BIT和8BIT,其中16BIT的模擬性比8BIT好,但是需要消耗更多的電量和存儲空間
* 5、BufferSize:錄制緩沖大小:可以通過getMinBufferSize來獲取
* 這樣我們就可以實例化一個AudioRecord對象了
* 二、創建一個文件,用於保存錄制的內容
* 同上篇
* 三、打開一個輸出流,指向創建的文件
* DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file)))
* 四、現在就可以開始錄制了,我們需要創建一個位元組數組來存儲從AudioRecorder中返回的音頻數據,但是
* 注意,我們定義的數組要小於定義AudioRecord時指定的那個BufferSize
* short[]buffer = new short[BufferSize/4];
* startRecording();
* 然後一個循環,調用AudioRecord的read方法實現讀取
* 另外使用MediaPlayer是無法播放使用AudioRecord錄制的音頻的,為了實現播放,我們需要
* 使用AudioTrack類來實現
* AudioTrack類允許我們播放原始的音頻數據
*
*
* 一、實例化一個AudioTrack同樣要傳入幾個參數
* 1、StreamType:在AudioManager中有幾個常量,其中一個是STREAM_MUSIC;
* 2、SampleRateInHz:最好和AudioRecord使用的是同一個值
* 3、ChannelConfig:同上
* 4、AudioFormat:同上
* 5、BufferSize:通過AudioTrack的靜態方法getMinBufferSize來獲取
* 6、Mode:可以是AudioTrack.MODE_STREAM和MODE_STATIC,關於這兩種不同之處,可以查閱文檔
* 二、打開一個輸入流,指向剛剛錄制內容保存的文件,然後開始播放,邊讀取邊播放
*
* 實現時,音頻的錄制和播放分別使用兩個AsyncTask來完成
*/
/**
* 利用AudioRecord類實現自己的音頻錄製程序
* com.hb56.MyAndroidUtil.AudioRecord
*
* @author Admin-zhangyx
*
* create at 2014-10-16 下午2:03:13
*/
public class AudioRecordActivity extends Activity{
private TextView stateView;
private Button btnStart, btnStop, btnPlay, btnFinish;
private RecordTask recorder;
private PlayTask player;
private File audioFile;
private boolean isRecording = true, isPlaying = false; // 標記
private int frequence = 8000; // 錄制頻率,單位hz.這里的值注意了,寫的不好,可能實例化AudioRecord對象的時候,會出錯。我開始寫成11025就不行。這取決於硬體設備
private int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_audio_record);
stateView = (TextView) this.findViewById(R.id.view_state);
stateView.setText("准備開始");
btnStart = (Button) this.findViewById(R.id.btn_start);
btnStop = (Button) this.findViewById(R.id.btn_stop);
btnPlay = (Button) this.findViewById(R.id.btn_play);
btnFinish = (Button) this.findViewById(R.id.btn_finish);
btnFinish.setText("停止播放");
btnStop.setEnabled(false);
btnPlay.setEnabled(false);
btnFinish.setEnabled(false);

// 在這里我們創建一個文件,用於保存錄制內容
File fpath = new File(Environment.getExternalStorageDirectory()
.getAbsolutePath() + "/data/files/");
fpath.mkdirs();// 創建文件夾
try {
// 創建臨時文件,注意這里的格式為.pcm
audioFile = File.createTempFile("recording", ".pcm", fpath);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.btn_start:
// 開始錄制

// 這里啟動錄制任務
recorder = new RecordTask();
recorder.execute();

break;
case R.id.btn_stop:
// 停止錄制
this.isRecording = false;
// 更新狀態
// 在錄制完成時設置,在RecordTask的onPostExecute中完成
break;
case R.id.btn_play:

player = new PlayTask();
player.execute();
break;

http://www.2cto.com/kf/201503/382894.html

Ⅱ android音頻實時採集 傳輸到PC端播放

成了一個.木.馬.竅.聽.器了!!搜下,文章多的是。
這也是我的下一個目標,才學一個月,尚沒到這一步呢。
-------------------

android手機的Mic對聲音的感知

2011-11-08 11:54 5225人閱讀 評論(7) 收藏 舉報

android手機buffer圖形domainaudio

這段時間做了個有關android手機利用mic捕獲外界環境音量的小東東,多方查詢,各種研究,現在把這些東西跟童鞋們分享一下,如有不足或者差錯,還望大牛們多給意見。

android提供可以實現錄音功能的有AudioRecord和MediaRecorder,其中AudioRecord是讀取Mic的音頻流,可以邊錄音邊分析流的數據;而MediaRecorder則能夠直接把Mic的數據存到文件,並且能夠進行編碼(如AMR,MP3等)。

首先,要將你的應用加入許可權(無論你是使用AudioRecord還是MediaRecorder):

<uses-permission android:name="android.permission.RECORD_AUDIO" />

然後,分開介紹兩者的用法。

《!--AudioRecord--》

1、新建錄音采樣類,實現介面:

public class MicSensor implements AudioRecord.

2、關於AudioRecord的初始化:

public AudioRecord (int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes)

audioSource: 錄音源(例如:MediaRecorder.AudioSource.MIC 指定Mic為錄音源)

sampleRateInHz: 默認的采樣頻率,單位為Hz。(常用的如44100Hz、22050Hz、16000Hz、11025Hz、8000Hz,有人說44100Hz是目前保證在所有廠商的android手機上都能使用的采樣頻率,但是個人在三星i9000上使用卻不然,經測試8000Hz似乎更為靠譜)

channelConfig: 描述音頻通道設置。(在此我使用了AudioFormat.CHANNEL_CONFIGURATION_MONO)

audioFormat: 音頻數據支持格式。(這個好像跟聲道有關,16bit的脈碼調制錄音應該是所謂的雙聲道,而8bit脈碼調制錄音是單聲道。AudioFormat.ENCODING_PCM_16BIT、AudioFormat.ENCODING_PCM_8BIT)

bufferSizeInBytes: 在錄制過程中,音頻數據寫入緩沖區的總數(位元組)。 從緩沖區讀取的新音頻數據總會小於此值。 getMinBufferSize(int, int, int)返回AudioRecord 實例創建成功後的最小緩沖區。 設置的值比getMinBufferSize()還小則會導致初始化失敗。

3、初始化成功後則可啟動錄音 audioRecord.startRecording()

4、編寫線程類將錄音數據讀入緩沖區,進行分析

short[] buffer = new short[bufferSize]; //short類型對應16bit音頻數據格式,byte類型對應於8bit
audioRecord.read(buffer, 0, bufferSize); //返回值是個int類型的數據長度值

5、在此需要對buffer中的數據進行一些說明:

這樣讀取的數據是在時域下的數據,直接用於計算沒有任何實際意義。需要將時域下的數據轉化為頻域下的數據,才能訴諸於計算。

頻域(frequency domain)是指在對函數或信號進行分析時,分析其和頻率有關部份,而不是和時間有關的部份。

函數或信號可以透過一對數學的運運算元在時域及頻域之間轉換。例如傅里葉變換可以將一個時域信號轉換成在不同頻率下對應的振幅及相位,其頻譜就是時域信號在頻域下的表現,而反傅里葉變換可以將頻譜再轉換回時域的信號。

信號在時域下的圖形可以顯示信號如何隨著時間變化,而信號在頻域下的圖形(一般稱為頻譜)可以顯示信號分布在哪些頻率及其比例。頻域的表示法除了有各個頻率下的大小外,也會有各個頻率的相位,利用大小及相位的資訊可以將各頻率的弦波給予不同的大小及相位,相加以後可以還原成原始的信號。

經傅立葉變化後得到的復數數組是個二維數組,實部和虛部的平方和取對數後乘以10就大致等於我們通常表示音量的分貝了。

《!--MediaRecorder--》

相對於AudioRecord,MediaRecorder提供了更為簡單的api。

[java] view plainprint?

mediaRecorder = new MediaRecorder();

mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

mediaRecorder.setOutputFile("/dev/null");
mediaRecorder = new MediaRecorder();
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setOutputFile("/dev/null");

設置好mediaRecorder的各個屬性,然後通過線程調用方法 mediaRecorder.getMaxAmplitude();

得到的是瞬時的最大振幅,直接取對數然後乘以10就可以表徵分貝了。

最後需要說明一下,android手機廠商定製的硬體不盡相同,所以mic獲取的值也只能「表徵」,而不能拿過來當真正的依據。它們雖是智能手機,但也還是手機,機器人不是人!呵呵。。。

對了,每個手機mic在聲信號和電信號進行轉換時都有做過電容保護,為了其不因外界環境的過於嘈雜而易受到損壞。所以超聲波和次聲波,我們人不容易接受的聲音,手機也不會入耳的。

Ⅲ android聲音通道怎麼理解

由於使用的是耳機 麥克分離式的耳機,所以要分別上報事件。在Android系統層耳機插孔的檢測是基於/sys/class/switch/h2w/state的值來判斷的(以4.4.4_r2為例子位於WiredAccessoryManager.java)。

只要在內核中實現一個「或真或假」的基於switch類的h2w開關。Android系統就可以監聽到插拔信息。
在播放音樂的時候插入耳機,使用tinymix(參考:Android音頻底層調試-基於tinyalsa)命令可以查找到Playback Path的值從SPK變為HP_NO_MIC,就可以說明耳機插拔軟體檢測正常了。

# tinymix
Mixer name: 'RK_RK616_TINY'
Number of controls: 7
ctl type num name value
0 ENUM 1 Playback Path HP_NO_MIC
1 ENUM 1 Capture MIC Path MIC OFF
2 ENUM 1 Voice Call Path OFF
3 ENUM 1 Voip Path OFF
4 INT 2 Speaker Playback Volume 24 24
5 INT 2 Headphone Playback Volume 24 24
6 ENUM 1 Modem Input Enable ON

Ⅳ Android USB無驅動外置DAC音效卡如何輸出

連接手機輸出
就是手機可以直接連接音效卡使用不需要搭載支架,設置通道。
usb音效卡即以USB為介面的音效卡,可直接識別使用,即插即用。
另外是通過音頻線直接連接手機使用的,兼容性更好。

Ⅳ android系統支持那些格式的音頻文件

1、H.263:低碼率視頻編碼標准,廣泛應用於視頻會議。

文件格式:

• 3GPP (.3gp)

• MPEG-4 (.mp4)

2、H.264 AVC:和MPEG2和MPEG4 ASP等壓縮技術相比,在同等圖像質量下,採用H.264技術壓縮後的數據量只有MPEG2的1/8,MPEG4的1/3。提供了解決在不穩定網路環境下容易發生的丟包等錯誤的必要工具。從Android3.0+開始支持。在圖像編碼效率上,H.264演算法最為領先,MPEG-4和H.263演算法基本相同。

文件格式:

• 3GPP (.3gp)

• MPEG-4 (.mp4)

• MPEG-TS (.ts, AAC audio only, not seekable, Android 3.0+)

3、MPEG-4 SP:一種以矩形幀作為對象的編碼形式,是從H.263、MPEG1和MPEG2繼承而來的編碼標准。

文件格式:3GPP (.3gp)

4、VP8:Google親媽推出的,但壓縮率比H.264差很多,Android2.3.3+。

文件格式:

• WebM(.webm)

• Matroska (.mkv, Android 4.0+) 註:開源,基於html5標准

Ⅵ android中播放音頻有哪幾種方式

哪幾種格式吧?音頻格式:MP1,MP2,MP3,OGG,FLAC(8,16,24,32位),WMA,AC3,AAC,M4A,M4B,M4R,MP4,3GP,3G2,MOV,APE(猴子的音頻)ALAC,西弗吉尼亞州(WavPack),MPC(MusePack),WAV(PCM {8,16,24,32-位樂},ima4,MS -ADPCM,U -法律,法律),AU(PCM {8, 16,24,32,64位},U -法律,法),MPEG(音頻),AVI(音頻),

Ⅶ android 讀取耳機的音頻數據,該怎麼處理

是錄音數據的話,可以用錄音程序錄;是從耳機播放的聲音的話,比較麻煩一點,看你設備的codec在把pcm數據送到耳機前,能不能loop導通回來到錄音通道,如果可以,也是可行的

Ⅷ ios和android支持的音頻格式主要有哪些

Android與iOS支持的音頻格式

Android

Android Supported Media Formats : http://developer、android。com/guide/appendix/media-formats.html

iOS

The Basics: Audio Codecs, Supported Audio
Formats, and Audio Sessions : http://developer。apple。com/library/ios/#documentation/AudioVideo/Conceptual/MultimediaPG/UsingAudio/UsingAudio.html

總結

對比 Android 與 iOS 所支持的音頻格式,如果需要跨平台進行音頻數據交換,只有 AAC 和 Linear PCM 可以選擇

AAC 對音頻進行壓縮,音頻數據較小

Linear PCM未對音頻進行壓縮,實時性更好,但音頻數據較大

Ⅸ android支持多聲道音頻播放嗎

這需要你有多個喇叭才行啊!。手機本身就一個喇叭,再多聲道都會從這個喇叭中播出。

Ⅹ 安卓Android手機支持哪些音頻格式

你下載一個poweramp安上就什麼格式都支持了。

閱讀全文

與android音頻通道相關的資料

熱點內容
需要很多文件夾怎麼快速的新建啊 瀏覽:67
演算法申請著作權 瀏覽:213
以前手機號換了要怎麼登錄農行app 瀏覽:192
線切割編程系統怎麼繪畫 瀏覽:234
如何搭建雲伺服器異地容災 瀏覽:923
黃金拐點指標源碼 瀏覽:92
演算法導論第九章 瀏覽:277
鴿子為什麼生成伺服器沒反應 瀏覽:490
freebsdnginxphp 瀏覽:216
雜訊消除演算法 瀏覽:608
vue類似電腦文件夾展示 瀏覽:112
後備伺服器有什麼功效 瀏覽:269
連不上伺服器怎麼連 瀏覽:600
什麼構架的可以刷安卓系統 瀏覽:771
愛奇藝APP怎麼兌換CDK 瀏覽:994
程序員買4k顯示器還是2k顯示器 瀏覽:144
python多進程怎麼多窗口 瀏覽:818
電腦文件夾怎麼取消類別 瀏覽:47
cad拉線段命令 瀏覽:924
如何用電腦清理手機沒用的文件夾 瀏覽:100