android多媒体部分学习笔记七------音频录制 mediaRecorder

本文主要是介绍android多媒体部分学习笔记七------音频录制 mediaRecorder,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/**
 * 自定义捕获音频
 * 
 * @time 下午12:58:03
 * @author retacn yue
 * @Email zhenhuayue@sina.com
 */
@SuppressWarnings("unused")
public class CustomRecorderActivity extends Activity implements OnCompletionListener, OnClickListener {
private Button btn_finish, btn_play, btn_start_record, btn_stop_record;
private TextView txt_status;


private MediaRecorder mediaRecorder;
private File audioFile;
private MediaPlayer player;


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.custom_recoder);
findView();
}


/**
* 实例化控件
*/
private void findView() {
btn_start_record = (Button) this.findViewById(R.id.btn_start_recording);
btn_stop_record = (Button) this.findViewById(R.id.btn_stop_recording);
btn_play = (Button) this.findViewById(R.id.btn_paly_record);
btn_finish = (Button) this.findViewById(R.id.btn_finish);
txt_status = (TextView) this.findViewById(R.id.txt_status);
txt_status.setText("Ready");


btn_start_record.setOnClickListener(this);
btn_stop_record.setOnClickListener(this);
btn_play.setOnClickListener(this);
btn_finish.setOnClickListener(this);


btn_play.setEnabled(false);
btn_stop_record.setEnabled(false);
}


@Override
public void onClick(View v) {
if (v == btn_start_record) {
mediaRecorder = new MediaRecorder();
// 设置输入信号源
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 设置输出格式
/**
* 常见格式:

* THREE_GPP

* MPEG_4

* RAW_AMR

*/


mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
// 设置解码格式
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
// 创建目录
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Andoroid/data/cn.yue.mrdemo.CustomRecorderActivity/files/");
file.mkdirs();


try {
audioFile = File.createTempFile("recording", ".3gp", file);
} catch (IOException e) {
e.printStackTrace();
}
// 设置输出文件的路径
mediaRecorder.setOutputFile(audioFile.getAbsolutePath());
try {
mediaRecorder.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
Log.i("tag", "error: " + e.toString());
} catch (IOException e) {
e.printStackTrace();
Log.i("tag", "error: " + e.toString());
}
mediaRecorder.start();


txt_status.setText("Recording");
btn_play.setEnabled(false);
btn_stop_record.setEnabled(true);
btn_start_record.setEnabled(false);


} else if (v == btn_stop_record) {
// 停止录音释放资源
mediaRecorder.stop();
mediaRecorder.release();


// 初始化播放器
player = new MediaPlayer();
player.setOnCompletionListener(this);
// 设置播放器数据源
try {
player.setDataSource(audioFile.getAbsolutePath());
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
player.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
txt_status.setText("Ready to play");
btn_play.setEnabled(true);
btn_stop_record.setEnabled(false);
btn_start_record.setEnabled(true);


} else if (v == btn_play) {
player.start();
txt_status.setText("Playing");
btn_play.setEnabled(false);
btn_start_record.setEnabled(false);
btn_stop_record.setEnabled(false);
} else if (v == btn_finish) {
// 退出程序
finish();
}


}


@Override
public void onCompletion(MediaPlayer mp) {


btn_start_record.setEnabled(true);
btn_stop_record.setEnabled(false);
btn_play.setEnabled(true);
txt_status.setText("Ready");


}


/**
* 其他常用方法

*/
private void otherMathod() {
// 最大录制文件的大小
mediaRecorder.setMaxFileSize(10);
// 录制最长时间
mediaRecorder.setMaxDuration(1);
}


/**
* 将音频插入mediaStore
*/


private void insertMediaStore() {
// 添加元数据
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.MediaColumns.TITLE, "this is not music");
contentValues.put(MediaStore.MediaColumns.DATE_ADDED, System.currentTimeMillis());
contentValues.put(MediaStore.MediaColumns.DATA, audioFile.getAbsolutePath());


Uri uri = getContentResolver().insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, contentValues);
}

这篇关于android多媒体部分学习笔记七------音频录制 mediaRecorder的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/2247

相关文章

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级