国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 系統 > 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即可!!
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产毛片视频| 国产三区四区在线观看| 久久精品视频免费看| 国产激情二区| 国产黄色网页| 在线中文字幕资源| 精品一区二区三区免费站| 国产大学生粉嫩无套流白浆| 午夜在线小视频| 国产小视频在线高清播放| 热99re久久精品这里都是免费| 国产九色porn网址| 国产永久免费高清在线观看视频| av丝袜在线| 嫩草在线播放| 国产在线一二三| 免费国产在线视频| 国产三级在线| 精品国产高清a毛片无毒不卡| 亚洲欧美精选| 国产中文伊人| 精品美女视频在线观看免费软件| 中文在线视频观看| 国产在线观看av| 国产三区四区在线观看| 国产成人精品男人的天堂538| 国产成人精品综合网站| 国产黄色大片在线观看| av二区三区| 国产桃色电影在线播放| 日本在线观看| 精品无吗乱吗av国产爱色| 丁香婷婷激情| аⅴ成人天堂中文在线| 在线观看免费高清完整| 国产日韩精品在线看| 国产有码在线| 欧美高清视频| 97人人在线| 国产激情视频在线观看| 青青草视频免费在线观看| 尤物在线视频| 久久久久久久久亚洲精品| 在线a人片免费观看视频| 国产精品蜜臀| 毛片视频免费观看| 先锋影音av中文字幕| 国产精品国产三级国产试看| 综合图区亚洲白拍在线 | 另类专区欧美| 四虎国产精品永久地址998| 国产视频xxx| 国产日韩网站| 97影院理论午夜| 性网站在线播放| 国产99re66在线视频| 国产黄在线观看| 97视频免费| 四虎成人精品在永久在线观看| 一本大道久久精品| 日韩不卡高清| 天天操人人干| 国产黄色大片在线观看| av日韩国产| 久草网在线视频| 中文字幕第一页av| 国产精品人人爱一区二区白浆| 国产丝袜视频在线播放| 在线视频中文字幕第一页| 日本欧洲一区| 中文字幕免费中文| 伊人色综合网| 看成年女人免费午夜视频| 午夜视频免费在线观看| 992tv在线观看在线播放| 不卡av免费观看| 国产精品扒开做爽爽爽的视频| 国产福利小视频在线观看| 日本a级黄色| 国产精品毛片一区二区三区四区| av免费在线一区二区三区| 久久国产精品久久久久久小说| 国产性色视频| 国内自拍视频在线观看| 99re在线视频播放| 国产人成在线视频| 国产男女av| 先锋影音av中文字幕| 国产精品入口麻豆免费| 国产理论在线观看| eeuss影院在线观看| 中文字幕国产视频| 免费a级毛片在线播放| av在线二区| 99re6在线视频精品免费| 国产视频一二三区| 尤物视频在线观看| 久久精品最新免费国产成人| 99综合精品久久| 97在线免费| 中文资源在线网| av在线第一页| 黄色三级视频在线观看| 亚洲激情丁香| baoyu777.永久免费视频| 一本大道香蕉8中文在线视频| 国产欧美一区二区三区小说| 国产小视频福利在线| 中文字幕不卡免费视频| 国产三级视频| 伊人影院在线视频| а√最新版地址在线天堂| 日本在线免费中文字幕| 麻豆电影传媒二区| 高潮白浆视频| ·天天天天操| 亚洲v片在线观看| 国产在线视精品麻豆| 黄色在线视频观看网站| 国产亚av手机在线观看| 夜色资源网av在先锋网站观看| www.狠狠操| 自拍亚洲国产| 亚洲综合在线免费| 国产中文字幕在线观看| 2018狠狠干| 丁香综合在线| 国产视频2区| 欧美精品日韩少妇| 国产特黄在线| 日本电影在线观看| 国产中文在线视频| 97最新国自产拍视频在线完整在线看 | 在线观看的网站你懂的| 超碰在线人人| 国产叼嘿网站免费观看不用充会员| 国产变态拳头交视频一区二区| 日本高清中文字幕| 中文字幕乱在线伦视频乱在线伦视频| 2021天堂中文幕一二区在线观| yjizz视频网站在线播放| 国产精品蜜臀| 好男人免费精品视频| 在线观看免费观看在线91| av在线播放av| 在线免费观看黄色av| 中文字幕网在线| 麻豆精品免费视频入口| 中文一区在线观看| 国产精品麻豆一区二区三区| jlzzjlzz欧美大全| 亚洲а∨精品天堂在线| 精品一区二区三区免费站| 国内精品一区视频| 青青草原av在线| 中中文字幕av在线| 欧美日韩久久中文字幕| 在线视频三区| 黄网站在线观看高清免费| 免费影视观看网站入口| 亚洲成a人v欧美综合天堂麻豆| 国产精品蜜臀| 国产不卡精品一区二区三区| 国产69精品久久久久孕妇国产69久久| 永久免费av片在线观看全网站| 国产一二三在线观看| 1区2区3区在线| 国产网站麻豆精品视频| 国产一级电影网| 免费男女羞羞的视频网站中文字幕| 在线三级av| eeuss影院www在线播放| 免费三级毛片| 天天av天天爱| 国产私人影院| 在线观看电影av| www.超级碰| 国产麻豆视频免费观看| 国产天堂资源| 日本久久网站| 国产香蕉免费精品视频| 国产精品视频一区二区久久 | 亚洲最新永久观看在线| 亚洲第一页在线播放| 国产在线一区二区视频| 国产精品久久麻豆| 在线免费观看高清视频色| 超碰在线影院| 91精品国产91久久久久久青草| 国产黄大片在线观看画质优化| 在线观看av网站| 五月天丁香在线| 四虎精品成人a在线观看| 国产精品亚洲第五区在线| 国产福利在线| 久久精品国产麻豆| 99热免费在线观看| 九九热在线视频| 性网站在线观看| 国产精品二线|