Android录音播放管理工具
发布时间 - 2026-01-10 22:45:04 点击率:次1、语音播放直接用系统工具就好了,这个就不多说了,根据传入的路径(网络路径或本地路径均可)播放音频文件
/**
* Created by zhb on 2017/1/16.
* 音乐在线播放
*/
public class PlayManager {
private Context mcontext;
public PlayManager(Context context){
this.mcontext = context;
}
public void play(String song){
MediaPlayer mp = new MediaPlayer();
try {
// 存储在SD卡或其他文件路径下的媒体文件
// 例如:mp.setDataSource("/sdcard/test.mp3");
// 网络上的媒体文件
// 例如:mp.setDataSource("http://www...../music/test.mp3");
mp.setDataSource(song);
mp.prepare();
mp.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.录制amr格式音频文件(微信语音便用的这种格式,至于音频文件格式之间的比较请自行百度)
/**
* Created by zhb on 2017/1/16.
* 本地录音
*/
public class RecordManager {
//录制成amr格式............................................................
private Context mcontext;
MediaRecorder mediaRecorder ;
public RecordManager(Context context){
this.mcontext = context;
//TODO 初始化安装路径,录音流程
}
/**开始录制*/
public void start_amr(){
mediaRecorder = new MediaRecorder();
/**
* mediaRecorder.setAudioSource设置声音来源。
* MediaRecorder.AudioSource这个内部类详细的介绍了声音来源。
* 该类中有许多音频来源,不过最主要使用的还是手机上的麦克风,MediaRecorder.AudioSource.MIC
*/
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
/**
* mediaRecorder.setOutputFormat代表输出文件的格式。该语句必须在setAudioSource之后,在prepare之前。
* OutputFormat内部类,定义了音频输出的格式,主要包含MPEG_4、THREE_GPP、RAW_AMR……等。
*/
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
/**
* mediaRecorder.setAddioEncoder()方法可以设置音频的编码
* AudioEncoder内部类详细定义了两种编码:AudioEncoder.DEFAULT、AudioEncoder.AMR_NB
*/
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
/**
* 设置录音之后,保存音频文件的位置,一般是SD卡的位置
*/
mediaRecorder.setOutputFile(String.valueOf(PathManger.getVoicePath()));
/**
* 调用start开始录音之前,一定要调用prepare方法。
*/
try {
mediaRecorder.prepare();
mediaRecorder.start();
}
catch (IllegalStateException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
/**停止录音*/
public void stop_amr(){
mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder = null;
}
/**重置录音*/
public void reset_amr(){
mediaRecorder.reset();
}
}
3、配置转换工具包(这个比较简单,配置以下文件即可)
添加flame.jar,并在armeabi和armeabi-v7a文件夹添加libmp3lame.so
资源文件:http://xiazai./201701/yuanma/androidlibmp3lame().rar
4、录制MP3格式音频文件(个人觉得这种格式能比较好的统一Android端和iOS端的音频文件,虽然方法相对比较繁杂一些)
/**
* Created by zhb on 2017/1/16.
* 本地录音
*/
public class RecordManager {
//录制成MP3格式..............................................
/**构造时候需要的Activity,主要用于获取文件夹的路径*/
private Activity activity;
/**文件代号*/
public static final int RAW = 0X00000001;
public static final int MP3 = 0X00000002;
/**文件路径*/
private String rawPath = null;
private String mp3Path = null;
/**采样频率*/
private static final int SAMPLE_RATE = 11025;
/**录音需要的一些变量*/
private short[] mBuffer;
private AudioRecord mRecorder;
/**录音状态*/
private boolean isRecording = false;
/**是否转换ok*/
private boolean convertOk = false;
public RecordManager(Activity activity, String rawPath, String mp3Path) {
this.activity = activity;
this.rawPath = rawPath;
this.mp3Path = mp3Path;
}
/**开始录音*/
public boolean start_mp3() {
// 如果正在录音,则返回
if (isRecording) {
return isRecording;
}
// 初始化
if (mRecorder == null) {
initRecorder();
}
getFilePath();
mRecorder.startRecording();
startBufferedWrite(new File(rawPath));
isRecording = true;
return isRecording;
}
/**停止录音,并且转换文件,这很可能是个耗时操作,建议在后台中做*/
public boolean stop_mp3() {
if (!isRecording) {
return isRecording;
}
// 停止
mRecorder.stop();
isRecording = false;
//TODO
// 开始转换
FLameUtils lameUtils = new FLameUtils(1, SAMPLE_RATE, 96);
convertOk = lameUtils.raw2mp3(rawPath, mp3Path);
return isRecording ^ convertOk;// convertOk==true,return true
}
/**获取文件的路径*/
public String getFilePath(int fileAlias) {
if (fileAlias == RAW) {
return rawPath;
} else if (fileAlias == MP3) {
return mp3Path;
} else
return null;
}
/**清理文件*/
public void cleanFile(int cleanFlag) {
File f = null;
try {
switch (cleanFlag) {
case MP3:
f = new File(mp3Path);
if (f.exists())
f.delete();
break;
case RAW:
f = new File(rawPath);
if (f.exists())
f.delete();
break;
case RAW | MP3:
f = new File(rawPath);
if (f.exists())
f.delete();
f = new File(mp3Path);
if (f.exists())
f.delete();
break;
}
f = null;
} catch (Exception e) {
e.printStackTrace();
}
}
/**关闭,可以先调用cleanFile来清理文件*/
public void close() {
if (mRecorder != null)
mRecorder.release();
activity = null;
}
/**初始化*/
private void initRecorder() {
int bufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE,
AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
mBuffer = new short[bufferSize];
mRecorder = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE,
AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,
bufferSize);
}
/**设置路径,第一个为raw文件,第二个为mp3文件*/
private void getFilePath() {
try {
String folder = "audio_recorder_2_mp3";
String fileName = String.valueOf(System.currentTimeMillis());
if (rawPath == null) {
File raw = new File(activity.getDir(folder,
activity.MODE_PRIVATE), fileName + ".raw");
raw.createNewFile();
rawPath = raw.getAbsolutePath();
raw = null;
}
if (mp3Path == null) {
File mp3 = new File(activity.getDir(folder,
activity.MODE_PRIVATE), fileName + ".mp3");
mp3.createNewFile();
mp3Path = mp3.getAbsolutePath();
mp3 = null;
}
Log.d("rawPath", rawPath);
Log.d("mp3Path", mp3Path);
runCommand("chmod 777 " + rawPath);
runCommand("chmod 777 " + mp3Path);
} catch (Exception e) {
e.printStackTrace();
}
}
/**执行cmd命令,并等待结果*/
private boolean runCommand(String command) {
boolean ret = false;
Process process = null;
try {
process = Runtime.getRuntime().exec(command);
process.waitFor();
ret = true;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
process.destroy();
} catch (Exception e) {
e.printStackTrace();
}
}
return ret;
}
/**写入到raw文件*/
private void startBufferedWrite(final File file) {
new Thread(new Runnable() {
@Override
public void run() {
DataOutputStream output = null;
try {
output = new DataOutputStream(new BufferedOutputStream(
new FileOutputStream(file)));
while (isRecording) {
int readSize = mRecorder.read(mBuffer, 0,
mBuffer.length);
for (int i = 0; i < readSize; i++) {
output.writeShort(mBuffer[i]);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (output != null) {
try {
output.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}).start();
}
}
5、最后在自己想调用的地方调用就好了,PathManger这个是我自己的路径管理工具,这里不贴了,反正自己直接放一个路径字符串进去就好了
/**初始化语音*/
private void initVoice() {
//录音
RecordManager = new RecordManager(
CallHelpActivity.this,
String.valueOf(PathManger.getVoicePathToRaw()),
String.valueOf(PathManger.getVoicePathToMp3()));
callHelp_Voice_longclick.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
RecordManager.start_mp3();
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
RecordManager.stop_mp3();
break;
}
return false;
}
});
//语音播放
final PlayManager PlayManager = new PlayManager(this);
callHelp_Voice_click.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
PlayManager.play(String.valueOf(PathManger.getVoicePathToMp3()));
}
});
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android录音播放管理
# Android录音播放工具
# Android录音播放
# Android一个类实现录音与播放实例
# 详解Android开发录音和播放音频的步骤(动态获取权限)
# Android实现语音播放与录音功能
# Android编程实现录音及保存播放功能的方法【附demo源码下载】
# android语音即时通讯之录音、播放功能实现代码
# Android 录音与播放功能的简单实例
# Android使用MediaRecorder实现录音及播放
# Android实现自制和播放录音程序
# Android编程开发录音和播放录音简单示例
# Android实现音频录音与播放
# 就好了
# 自己的
# 是个
# 第一个
# 说了
# 两种
# 不多
# 中有
# 并在
# 工具包
# 第二个
# 比较好
# 很可能
# 或其他
# 均可
# 最主要
# 主要用于
# 机上
# 贴了
# 大家多多
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
微信小程序 HTTPS报错整理常见问题及解决方案
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
linux写shell需要注意的问题(必看)
如何在Tomcat中配置并部署网站项目?
Python制作简易注册登录系统
JavaScript数据类型有哪些_如何准确判断一个变量的类型
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
EditPlus 正则表达式 实战(3)
phpredis提高消息队列的实时性方法(推荐)
如何在阿里云服务器自主搭建网站?
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
Linux系统运维自动化项目教程_Ansible批量管理实战
香港服务器租用每月最低只需15元?
用v-html解决Vue.js渲染中html标签不被解析的问题
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
如何为不同团队 ID 动态生成多个独立按钮
Laravel如何使用Blade组件和插槽?(Component代码示例)
,怎么在广州志愿者网站注册?
太平洋网站制作公司,网络用语太平洋是什么意思?
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
原生JS实现图片轮播切换效果
再谈Python中的字符串与字符编码(推荐)
Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】
Laravel如何实现模型的全局作用域?(Global Scope示例)
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
微信小程序 canvas开发实例及注意事项
西安专业网站制作公司有哪些,陕西省建行官方网站?
Python并发异常传播_错误处理解析【教程】
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
Laravel如何配置和使用缓存?(Redis代码示例)
佛山企业网站制作公司有哪些,沟通100网上服务官网?
如何在新浪SAE免费搭建个人博客?
如何快速搭建支持数据库操作的智能建站平台?
JavaScript常见的五种数组去重的方式
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
高性价比服务器租赁——企业级配置与24小时运维服务
如何快速搭建虚拟主机网站?新手必看指南
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
Laravel如何实现API资源集合?(Resource Collection教程)
nginx修改上传文件大小限制的方法
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
EditPlus中的正则表达式实战(6)
PHP 500报错的快速解决方法
linux top下的 minerd 木马清除方法
如何用花生壳三步快速搭建专属网站?

