亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android音頻可視化開發案例說明

2020-04-11 12:38:04
字體:
來源:轉載
供稿:網友
Android 調用自帶的錄制音頻程序
Android中有自帶的音頻錄制程序,我們可以通過指定一個Action MediaStore.Audio.Media.RECORD_SOUND_ACTION的Intent來
啟動它就可以了。然后在onActivityResult()方法中,獲取Intent的Data,就是錄制的音頻對應的URI。
java代碼:
復制代碼 代碼如下:

package eoe.demo;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Toast;
/**
* 被實例演示如何調用Android自帶的應用來完成Audio的錄入
* 其實很簡單,我們需要指定一個MediaStore.Audio.Media.RECORD_SOUND_ACTION的Action來啟動就可以
* 返回的Data數據就是我們錄制的音頻的URI了
*
* 通過上面這種方式,靈活性不夠高,我們可以利用MediaRecorder類來實現自己的音頻錄制程序
* MediaRecorder既可以用來錄制音頻,也可以用來錄制視頻
* 創建了一個MediaRecorder實例后,需要調用setAudioSource和setAudioEncoder來初始化
* 通常情況下,在準備錄制前,我們還需要調用setOutputFormat()方法來決定使用的音頻格式,同時調用
* setOutputFile()來指定存放錄制內容的文件
*
* 這幾個方法的調用順序是:setAudioSource,setOutputFormat,setAudioEncoder,setOutputFile
*
*
*
* @author Administrator
*
*/
public class AudioRecordDemo extends Activity {
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.audio_record);
}
public void onActivityResult(int requestCode, int resultCode, Intent data){
//super.onActivityResult(requestCode, resultCode, data);
//這里我們就可以獲取到剛剛錄制的音頻的Uri,可以進行播放等操作,這里顯示返回的Uri
if(resultCode == RESULT_OK){
Uri audioPath = data.getData();
Toast.makeText(this, audioPath.toString(), Toast.LENGTH_LONG).show();
}
}
public void onClick(View v){
int id = v.getId();
switch(id){
case R.id.btn1: //調用Android自帶的音頻錄制應用
Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
startActivityForResult(intent, 0);
break;
case R.id.btn2:
//通過MediaRecorder類來實現自己的音頻錄制程序
Intent intent2 = new Intent();
intent2.setClass(this, MyAudioRecord.class);
startActivityForResult(intent2, 1);
break;
case R.id.btn3:
//通過AudioRecord類實現自己的音頻錄制程序
Intent intent3 = new Intent();
intent3.setClass(this, MyAudioRecord2.class);
startActivityForResult(intent3, 2);
break;
}
}
}

Android 音頻的介紹
最近移植Android,當Android能夠在設備上面運行之后,首先想到的是讓音頻設備跑起來?!皼]有聲音,再好的戲也出不來”。本文簡單介紹一下Android音頻適配層。
這個世界音頻設備千變萬化,Android也不可能為每種設備都提供支持。Android定義了一個框架,這個框架來適配底層的音頻設備。該適配層的定義位于:
Java代碼:
復制代碼 代碼如下:

hardware/libhardware_legacy/include/hardware_legacy/AudioHardwareInterface.h

要想視頻底層的音頻設備必須要繼承該文件中定義的AudioStreamOut,AudioStreamIn,AudioHardwareInterface等類,并實現createAudioHardware函數。
下面我們看一下Android創建音頻設備的代碼,代碼位于:
Java代碼:
復制代碼 代碼如下:

frameworks/base/libs/audioflinger/AudioHardwareInterface.cpp

該文件有如下代碼:
Java代碼:
復制代碼 代碼如下:

AudioHardwareInterface* AudioHardwareInterface::create()
{
/*
* FIXME: This code needs to instantiate the correct audio device
* interface. For now - we use compile-time switches.
*/
AudioHardwareInterface* hw = 0;
char value[PROPERTY_VALUE_MAX];
#ifdef GENERIC_AUDIO
hw = new AudioHardwareGeneric();
#else
// 如果運行在仿真中――用這個模擬器
if (property_get("ro.kernel.qemu", value, 0)) {
LOGD("Running in emulation - using generic audio driver");
hw = new AudioHardwareGeneric();
}
else {
LOGV("Creating Vendor Specific AudioHardware");
hw = createAudioHardware();
}
#endif
if (hw->initCheck() != NO_ERROR) {
LOGW("Using stubbed audio hardware. No sound will be produced.");
delete hw;
hw = new AudioHardwareStub();
}
#ifdef WITH_A2DP
hw = new A2dpAudioInterface(hw);
#endif
#ifdef ENABLE_AUDIO_DUMP
recorded in the file.
LOGV("opening PCM dump interface");
hw = new AudioDumpInterface(hw); // replace interface
#endif
return hw;
}

從代碼中我們可以看出如果定義了GENERIC_AUDIO的宏,則會創建AudioHardwareGeneric,如果是模擬器的話,AudioHardwareGeneric會不能初始化,進而創建AudioHardwareStub。這兩個類都是Audio設備的適配層,是Android默認提供的。模擬器都是用AudioHardwareStub,不會有聲音輸出。設備都是用AudioHardwareGeneric,因為默認GENERIC_AUDIO是設置的。
一般我們只關心AudioHardwareGeneric實現,誰會去給模擬器去調試聲音呢,反正我沒這個閑心。首先說明一下這個音頻適配層是Android自帶的,可以保證你的音頻設備正常運行,但是不能發揮設備的最佳性能。通過后面的描述你將會了解。AudioHardwareGeneric的定義位于:
Java代碼:
復制代碼 代碼如下:

frameworks/base/libs/audioflinger/AudioHardwareGeneric.cpp

上面就是eoe給我們介紹音頻用途,如果有什么不明白的就多看看android的源碼,這樣有助與你對音頻的理解。
先看一下效果圖
 
復制代碼 代碼如下:

public class FFTActivity extends Activity implements OnClickListener{
private Button button;
private ImageView imageView;
private int frequency = 8000;
private int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
private RealDoubleFFT transformer;
private int blockSize = 256;
private boolean started = false;
private Canvas canvas;
private Paint paint;
private Bitmap bitmap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fft);
button = (Button) findViewById(R.id.fft_button);
button.setOnClickListener(this);
imageView = (ImageView) findViewById(R.id.fft_imageView);
transformer = new RealDoubleFFT(blockSize);
bitmap = Bitmap.createBitmap(256, 100, Bitmap.Config.ARGB_8888);
canvas = new Canvas(bitmap);
paint = new Paint();
paint.setColor(Color.GREEN);
imageView.setImageBitmap(bitmap);
}
private class RecordAudio extends AsyncTask<Void, double[], Void> {
@Override
protected Void doInBackground(Void... params) {
int bufferSize = AudioRecord.getMinBufferSize(frequency,
channelConfiguration, audioEncoding);
AudioRecord audioRecord = new AudioRecord(
MediaRecorder.AudioSource.MIC, frequency,
channelConfiguration, audioEncoding, bufferSize);
short[] buffer = new short[blockSize];
double[] toTransform = new double[blockSize];
audioRecord.startRecording();
while (started) {
//將record的數據 讀到buffer中,但是我認為叫做write可能會比較合適些。
int bufferResult = audioRecord.read(buffer, 0, blockSize);
for (int i = 0; i < bufferResult; i++) {
toTransform<i> = (double) buffer<i> / Short.MAX_VALUE;
}
transformer.ft(toTransform);
publishProgress(toTransform);
}
audioRecord.stop();
return null;
}
@Override
protected void onProgressUpdate(double[]... values) {
super.onProgressUpdate(values);
canvas.drawColor(Color.BLACK);
for (int i = 0; i < values[0].length; i++) {
int x=i;
int downy=(int)(100-(values[0]<i>)*10);
int upy=100;
canvas.drawLine(x, downy, x, upy, paint);
}
imageView.invalidate();
}
}
@Override
public void onClick(View v) {
started=true;
new RecordAudio().execute();
}
}

android音頻可視化的原理是使用離散傅里葉變換,但是數學不好的同學不要擔心,有開源的java離散傅里葉變換的代碼??!直接到www.netlib.org/fftpack/jfftpack.tgz,直接將里面javasource目錄拖動到(ca目錄)src即可??!
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美国产va在线影院| 日本精品久久久久久久| 国产欧美日韩精品专区| 欧美性受xxxx白人性爽| 一本色道久久88亚洲综合88| 国产精品video| www.午夜精品| 中文字幕九色91在线| 国产69精品久久久久久| 91精品视频在线| 中文字幕国产亚洲2019| 国产一区二区在线免费视频| 亚洲精品久久久一区二区三区| 久久99久久99精品中文字幕| 富二代精品短视频| 秋霞av国产精品一区| 亚洲2020天天堂在线观看| 亚洲国产成人久久| 日韩精品中文字幕在线播放| 国产不卡精品视男人的天堂| 国产精品一区二区三区毛片淫片| 日韩美女视频免费在线观看| 亚洲情综合五月天| 国产日韩欧美中文在线播放| 精品成人乱色一区二区| 亚洲深夜福利在线| 亚洲毛片在线免费观看| 亚洲网站在线观看| 国产91精品视频在线观看| 国产一区红桃视频| 97免费视频在线| 91免费视频网站| 成人福利视频在线观看| 欧美—级a级欧美特级ar全黄| 国模精品视频一区二区| 中文字幕在线观看亚洲| 久久成人综合视频| 91精品一区二区| 亚洲国产高清高潮精品美女| 久久免费精品日本久久中文字幕| 欧美小视频在线| 欧美成aaa人片免费看| 日韩av成人在线观看| 成人免费观看49www在线观看| 亚洲无亚洲人成网站77777| 欧美人与性动交a欧美精品| 国产精品视频永久免费播放| 亚洲丁香婷深爱综合| 国产精品永久免费观看| 国产女人18毛片水18精品| 日韩在线视频播放| 国产脚交av在线一区二区| 国语自产偷拍精品视频偷| 亚洲自拍另类欧美丝袜| 热re99久久精品国产66热| 日韩成人中文字幕在线观看| 亚洲最大在线视频| 另类少妇人与禽zozz0性伦| 91亚洲va在线va天堂va国| 欧美成人午夜激情| 精品久久久久久亚洲精品| 亚洲美女中文字幕| 秋霞午夜一区二区| 成人天堂噜噜噜| 久久99热精品这里久久精品| 国产精品ⅴa在线观看h| 日韩欧美中文字幕在线观看| 亚洲精品资源在线| 97国产在线观看| 国产日韩一区在线| 国产人妖伪娘一区91| 中文字幕精品久久久久| 欧美成人精品一区二区三区| 国产亚洲人成网站在线观看| 亚洲国产精品小视频| 国产视频精品免费播放| 亚洲三级 欧美三级| 日韩欧美在线免费| 欧美日韩成人在线视频| 国产亚洲精品久久久久久| 亚洲欧美成人在线| 欧美午夜片欧美片在线观看| 亚洲国产精品99久久| 亚洲国产成人精品电影| 91欧美激情另类亚洲| 久久综合国产精品台湾中文娱乐网| 日韩欧美福利视频| 91久久久在线| 国产精品自产拍高潮在线观看| 欧美亚洲国产视频| 亚洲天堂2020| 欧美日韩综合视频网址| 青青草原一区二区| 亚洲国产美女久久久久| 国产精品电影在线观看| 26uuu亚洲国产精品| 91精品中国老女人| 自拍偷拍亚洲精品| 在线成人激情黄色| 美女av一区二区三区| 91超碰caoporn97人人| 2023亚洲男人天堂| 亚洲国产成人久久综合一区| 国产精品福利在线观看| 亚洲在线www| 欧美激情成人在线视频| 日韩精品一二三四区| 亚洲网站在线看| 国产精品美女主播在线观看纯欲| 91网站在线看| 亚洲国产另类 国产精品国产免费| 日韩欧美亚洲一二三区| 久久久久久亚洲| 国产精品免费一区| 日韩精品在线观看网站| 欧美第一黄网免费网站| 日韩电影在线观看永久视频免费网站| 日韩av综合网| 美日韩精品免费观看视频| 97精品免费视频| 亚洲一区二区三区视频播放| 中文字幕在线看视频国产欧美在线看完整| 精品亚洲男同gayvideo网站| 国产精品入口夜色视频大尺度| 国产成人拍精品视频午夜网站| 精品女同一区二区三区在线播放| 日韩欧美国产免费播放| 亚洲在线免费看| 91久久精品日日躁夜夜躁国产| 激情成人在线视频| 中文字幕亚洲第一| 秋霞成人午夜鲁丝一区二区三区| 在线日韩欧美视频| 国产91精品久久久久| 久久精品视频一| 欧美成人一区在线| 欧美精品九九久久| 一本大道亚洲视频| 欧美性极品少妇精品网站| 亚洲福利在线看| 亚洲 日韩 国产第一| 日韩精品在线视频美女| 91经典在线视频| 国产精品扒开腿做爽爽爽男男| 亚洲热线99精品视频| 亚洲一区二区久久久| 久久久精品久久久| 亚洲国产99精品国自产| 中文字幕亚洲无线码a| 亚洲va电影大全| 疯狂做受xxxx欧美肥白少妇| 日韩av在线免费播放| 欧美美女15p| 国产999精品久久久| 精品国产网站地址| 欧美孕妇孕交黑巨大网站| 亚洲欧美国产精品久久久久久久| 日本久久久久久久久久久| 欧美性生活大片免费观看网址| 中文字幕亚洲图片| 91精品久久久久久久久不口人| 91国自产精品中文字幕亚洲| 国产成人在线精品| 日韩av第一页|