- 浏览: 261271 次
- 性别:
- 来自: 济南
文章分类
- 全部博客 (303)
- c (31)
- c++ (16)
- java (18)
- c# (1)
- python (3)
- java web (6)
- oracle (7)
- sqlserver (2)
- mysql (2)
- android (24)
- android系统 (15)
- android多媒体部分 (15)
- android游戏 (12)
- linux (26)
- javaScript (1)
- ajax (1)
- node JS (2)
- html (5)
- apache (3)
- jboss (1)
- weblogic (0)
- 通信协议 (10)
- 云计算 (1)
- 分布式 (5)
- ejb (1)
- webservice (5)
- 设计模式 (16)
- JNI (6)
- swing (13)
- 版本控制 (1)
- UML (1)
- xml (4)
- spring (5)
- hibernate (5)
- struts1 (3)
- struts2 (4)
- ibatis (0)
- tomcat (2)
- 心得体会 (1)
- css (1)
- 嵌入式 (41)
- arm体系结构 (10)
/**
* 可视化频率
*
* @time 下午12:00:21
* @author retacn yue
* @Email zhenhuayue@sina.com
*/
public class AudioProcessingActivity extends Activity implements OnClickListener {
private Button btn_start_stop;
private ImageView img_frequency;
private Bitmap bitmap;
private Canvas canvas;
private Paint paint;
private AudioRecordTask recordTask;
private RealDoubleFFT trasformer;
int blockSize = 256;
int frequency = 8000;
int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
boolean started = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.audio_processing);
findView();
trasformer = new RealDoubleFFT(blockSize);
bitmap = Bitmap.createBitmap(256, 100, Bitmap.Config.ARGB_8888);
canvas = new Canvas(bitmap);
paint = new Paint();
paint.setColor(Color.RED);
img_frequency.setImageBitmap(bitmap);
}
@Override
public void onClick(View v) {
if (started) {
started = false;
btn_start_stop.setText("Start");
} else {
started = true;
btn_start_stop.setText("Stop");
recordTask = new AudioRecordTask();
recordTask.execute();
}
}
/**
* 实例化控件
*/
private void findView() {
btn_start_stop = (Button) this.findViewById(R.id.btn_start_stop);
btn_start_stop.setOnClickListener(this);
img_frequency = (ImageView) this.findViewById(R.id.img_frequency);
}
/*****************************************************************/
private static int[] mSampleRates = new int[] { 8000, 11025, 22050, 44100 };
public AudioRecord findAudioRecord() {
for (int rate : mSampleRates) {
for (short audioFormat : new short[] { AudioFormat.ENCODING_PCM_8BIT, AudioFormat.ENCODING_PCM_16BIT }) {
for (short channelConfig : new short[] { AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.CHANNEL_CONFIGURATION_STEREO }) {
try {
Log.d("tag", "Attempting rate " + rate + "Hz, bits: " + audioFormat + ", channel: " + channelConfig);
int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat);
if (bufferSize != AudioRecord.ERROR_BAD_VALUE) {
Log.e("tag", "++++++++");
AudioRecord recorder = new AudioRecord(AudioSource.MIC, rate, channelConfig, audioFormat, bufferSize);
if (recorder.getState() == AudioRecord.STATE_INITIALIZED)
Log.e("tag", "-----");
return recorder;
}
} catch (Exception e) {
Log.e("tag", rate + "Exception, keep trying.", e);
}
}
}
}
Log.e("tag", "===========");
return null;
}
/**
* 音频合成任务
*/
private class AudioRecordTask extends AsyncTask<Void, double[], Void> {
@Override
protected Void doInBackground(Void... params) {
try {
int bufferSize = AudioRecord.getMinBufferSize(frequency, //
channelConfiguration, //
audioEncoding);
AudioRecord audioRecord = findAudioRecord();
/*****************************************************************/
/*
* 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) {
int bufferReadResult = audioRecord.read(buffer, 0, blockSize);
for (int i = 0; i < blockSize && i < bufferReadResult; i++) {
toTransform[i] = (double) buffer[i] / 32768.0;
}
// TODO
trasformer.ft(toTransform);
publishProgress(toTransform);
}
audioRecord.stop();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
}
return null;
}
protected void onProgressUpdate(double[]... toTransform) {
canvas.drawColor(Color.BLACK);
for (int i = 0; i < toTransform[0].length; i++) {
int x = i;
int downy = (int) (100 - (toTransform[0][i] * 10));
int upy = 100;
canvas.drawLine(x, downy, x, upy, paint);
}
img_frequency.invalidate();
}
}
}
注:
1 该程序用ca.uol.aig.fftpack.RealDoubleFFT这个包
下载路径为:http://www.netlib.org/fftpack/index.html
将文件导入工即可
2 错误信息:java.lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord.
3 添加权限<uses-permission android:name="android.permission.RECORD_AUDIO" />
发表评论
-
android多媒体学习笔记一
2012-09-04 10:47 7271 使用内置的camera应用程序捕获图像 /*** ... -
android多媒体学习笔记二
2012-09-04 10:53 814实现SurfaceHolder.Callback ,P ... -
android多媒体学习笔记三___图像合成
2012-09-05 11:36 627/** * 图像合成 * * @time 下午06:21 ... -
android多媒体部分学习笔记四___ Matrix
2012-09-05 11:40 729/*** 图像的缩放和旋转 Matrix** 1 0 0 x= ... -
android多媒体部分学习笔记五----audio
2012-09-08 16:08 720/*** 打开内置音乐播放器*/private void ge ... -
android多媒体部分学习笔记六----音频录制 mediaRecorder
2012-09-08 16:12 686/** * * 使用意图捕获音频 * * @time ... -
android多媒体部分学习笔记七------音频录制 mediaRecorder
2012-09-08 16:13 764/** * 自定义捕获音频 * * @time 下午12 ... -
android多媒体部分学习笔记八------音频录制 mediaRecorder
2012-09-08 16:14 779/** * 原始音频的播放和录制 * * audio ... -
android 多媒体部分学习笔记九----数字音频合成
2012-09-09 12:43 874/** * 数字音频合成 * * @time 下午12: ... -
android 多媒体部分学习笔记十--简单视频播放
2012-09-10 17:53 773/** * 简单播放 * * @time 下午05:15 ... -
android 多媒体部分学习笔记十二----mediaplay自定义播放器
2012-09-10 22:31 1704/** * * 自定义播放器 * * @time 下午 ... -
android 多媒体部分学习笔记十三----mediaStore 检索视频
2012-09-12 00:12 1028/** * mediaStore检索视频 * * @ti ... -
android 多媒体部分学习十四---网络视频播放(http/rtsp)
2012-09-12 14:36 1847/** * 网络视频播放 * * openCore * ... -
android 多媒体部分学习笔记十五-----视频录制
2012-09-12 15:02 777/** * 调用系统视频录制 * * @time 下午0 ...
相关推荐
Android学习笔记(一)——创建第一个Android项目 Android学习笔记(二)android studio基本控件及布局(实现图片查看器) Android学习笔记(三)android studio中CheckBox自定义样式(更换复选框左侧的勾选图像) ...
"Android学习笔记" Android学习笔记是Android开发者的必读书籍,书中涵盖了Android系统架构、Activity、Intent、资源管理等多方面的知识。本笔记对应的学习资源《第一行代码》是Android开发者的入门必读书籍,书中...
### Android开发学习笔记 #### Button按钮的实现与交互 在Android开发中,`Button`控件是最常用的用户界面元素之一,用于触发特定的操作或事件。本文档将详细讲解如何创建并自定义一个简单的按钮,并设置点击事件...
新版Android开发笔记--可视化UI设计,有关DroidDraw的讲解,pdf版,高清淅版,内容主要是DroidDraw各个界面功能的使用,并结合这些知识介绍一些实例的编写,以此巩固DroidDraw原理知识的运用等。
### Android开发教程+笔记十一--可视化UI设计DroidDraw #### 知识点一:DroidDraw简介与功能 DroidDraw是一个基于Java Swing框架的Android界面设计器,能够用于生成复杂的Android界面布局XML文件。DroidDraw的设计...
Android开发学习笔记(整理),整理论坛android学习笔记,较完整的讲解了android的内容。包括:view、activity、service、intent、广播机制、http连接、数据sqllite存储、后台线程、各种layout、偏好、本地文件操作、...
这篇学习笔记将引导新手入门,通过创建第一个简单的案例来了解Android Studio的基本操作。 首先,让我们了解一下Android Studio的核心功能。它基于IntelliJ IDEA,具备代码自动补全、重构、调试等强大的开发特性。...
在这个"python数据可视化学习笔记"中,你将找到一系列关于如何利用Python进行数据可视化的关键知识点和实践指南。 1. **matplotlib库**: matplotlib是Python中最基础的数据可视化库,提供了丰富的图形绘制功能,...
本资源是由哈工大著名教师国林教授主讲的多媒体技术课程的学习笔记,对于那些希望深入理解和掌握多媒体技术基础知识的人来说,是一份非常宝贵的学习材料。 笔记中可能涵盖了以下几个关键知识点: 1. **多媒体基本...
Android部分chm笔记文档
- 笔记是作者在Android Studio 3.2版本上进行安卓开发学习时遇到的问题记录,涵盖三个多月的学习心得。 2. Android颜色设置 - 学习如何在Android应用中设置和使用颜色,颜色的定义和应用是Android UI设计的基本...
Android ROM 定制学习笔记 Android ROM 定制学习笔记是一份详细的学习笔记,旨在指导读者如何安装和配置 Android 的底层开发环境,并编译官方的 Android 源代码和 Linux 内核源代码。该笔记还将指导读者如何将编译...
在学习Android O的HIDL内容时,使用Xmind将内容梳理了一下,给大家分享一下
Android数字签名学习笔记.pdf
新版Android开发教程&笔记--...新版Android开发教程+笔记十一--可视化UI设计DroidDraw.pdf 新版Android开发教程+笔记十二--文件存取、数据库编程.pdf 新版Android开发教程+笔记十三(待续)--应用、permission、资源.pdf
新版Android开发笔记--可视化UI设计,有关DroidDraw的讲解,pdf版,高清淅版,内容主要是DroidDraw各个界面功能的使用,并结合这些知识介绍一些实例的编写,以此巩固DroidDraw原理知识的运用等。
【Android学习笔记详解】 在移动应用开发领域,Android操作系统占据着重要的地位,为开发者提供了丰富的平台和无限的可能性。"Android很好的学习笔记"是一份专为初学者设计的资源,旨在帮助那些想要踏入Android开发...