android录音MP3格式文件
项目有录音功能,本来是录制的arm格式的文件,需求让改成MP3格式,折腾半天发现android本身做不到这一点,只能借助ndk来完成,下面是ndk的配置级MP3格式文件的录制
一、ndk介绍及下载:http://wear.techbrood.com/tools/sdk/ndk/index.html
二、接下来是android studio配置ndk
1、project structure里面配置NDK路径
2.src下的build.gradle里defaultConfig下添加
ndk {moduleName"mp3lame"ldLibs "log", "z", "m"abiFilters "armeabi", "armeabi-v7a"}
3. gradle.properties最后添加
android.useDeprecatedNdk=true
4.从https://github.com/talzeus/AndroidMp3Recorder中demo下载下来,jni文件夹拷贝到main下,audiorecoder文件夹拷贝到项目里,
libmp3lame下的.c和.h文件名及文件里面的一些地方要改成自己的包名
libs下的文件都拷贝到自己项目的libs下
5.build make project
此时build>intermediates>ndk>debug下lib和obj下应该都有相应的.so文件了
三、调用MP3recoder录制MP3格式的录音
点击按钮开始录音
mRecordBtn.setOnTouchListener(new VoiceTouchListen());
录音结果及录音完成回调
final Mp3Recorder recorder = new Mp3Recorder();class VoiceTouchListen implements View.OnTouchListener {@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:if (!FileUtils.checkSDcard()) {Toast.makeText(context, "发送语音需要sd卡支持!", Toast.LENGTH_SHORT).show();return false;}v.setPressed(true);handler.postDelayed(runnable, 1000);// 开始录音try {recorder.startRecording();} catch(IOException e) {Log.d("MainActivity", "Start error");}return true;case MotionEvent.ACTION_MOVE: {return true;}case MotionEvent.ACTION_UP:v.setPressed(false);try {
// if (event.getY() < 0) {// 放弃录音
// recordManager.cancelRecording();
// L.d("放弃发送语音");
// } else {handler.removeCallbacks(runnable);try {recorder.stopRecording();} catch(IOException e) {Log.d("MainActivity", "Stop error");}//int recordTime = recordManager.stopRecording();if (recLen > 1) {filePath = recorder.getRecordFilePath();//filePath = recordManager.getRecordFilePath(IConst.Cache.RECORD, SDApp.getUserId());mPlayBtn.setImageResource(R.drawable.shop_log_record_play);} else {// 录音时间过短,则提示录音过短的提示Toast.makeText(context, "录音时间过短!", Toast.LENGTH_SHORT).show();filePath = null;}
// }} catch (Exception e) {e.printStackTrace();}return true;default:return false;}}}
public static interface OnRecordFinishListener {public void onRecordFinish(String filePath);}
handler记录长度
private int recLen = 0;Handler handler = new Handler();Runnable runnable = new Runnable() {@Overridepublic void run() {recLen++;mState.setText("长度 : " + recLen + "秒");handler.postDelayed(this, 1000);}};
试听录音和停止试听
if (playManager.isPlaying()) {playManager.stopPlayback();} else {playManager.playRecording(filePath, true);}
在OnRecordFinishListener回调中上传文件
public AddRecordDialog(Context context, OnRecordFinishListener listener) {this.context = context;this.listener = listener;}
AddRecordDialog dialog = new AddRecordDialog(context, new AddRecordDialog.OnRecordFinishListener() {@Overridepublic void onRecordFinish(String filePath) {//上传文件}});dialog.show();
最后,查看录音
private void playLogVoice(View view, ShopLog log) {ImageView img = (ImageView) view.findViewById(R.id.voiceImg);final AnimationDrawable anim = (AnimationDrawable) img.getDrawable();//如果在播放其他音频 则关闭String dir = IConst.Cache.RECORD + Md5Encryption.getMD5(getUserId());String fileName = null;fileName = log.getFile_path().substring(log.getFile_path().lastIndexOf("/")+1);if(playManager==null){playManager = PlayManager.getInstance(context);}if(TextUtils.isEmpty(dir + File.separator + fileName)){return;}if (playManager.isPlaying() && !playManager.isPlaying(dir + File.separator + fileName)) {playManager.stopPlayback();L.d("停止播放其他");}//监听播放 更新动画playManager.setOnPlayChangeListener(new IOnPlayChangeListener() {@Overridepublic void onPlayStart() {L.d("start");anim.start();}@Overridepublic void onPlayStop() {L.d("stop");anim.stop();}});if (new File(dir).exists() && new File(dir + File.separator + fileName).exists()) {L.d("0000000000--0");if (playManager.isPlaying()) {L.d("0000000000--1");playManager.stopPlayback();} else {playManager.playRecording(dir + File.separator + fileName, true);}} else {L.d("11111111111--0");if(log.getFile_path()==null){return;}L.d("log.getFilePath()--"+log.getFile_path());L.d("log.getFileName()--"+fileName);
Request request = new Request.Builder().url(path).build();RequestTask<File> requestTask = new RequestTask<>(request, savePath, fileName,
new RequestCallBack<File>() {@Overridepublic void onSuccess(ResponseInfo<File> responseInfo) {L.d(responseInfo.result.getAbsolutePath());playManager.playRecording(responseInfo.result.getAbsolutePath(), true);}@Overridepublic void onFinish() {}@Overridepublic void onFailure(HttpException error) {showToast(error.errorMsg);}}
); requestTask.execute();
备注:如果MP3Recorder类中没有调用本地方法需加上(android调用本地方法)
static {System.loadLibrary("mp3lame");}
android录音MP3格式文件相关推荐
- android 录音的格式,Android录音mp3格式实例详解
Android录音支持的格式有amr.aac,但这两种音频格式在跨平台上表现并不好. MP3显然才是跨平台的最佳选择. 项目地址 实现思路概述 在分析代码前,我们需要明确几个问题 1. 如何最终生成M ...
- android mp3数据格式,Android录制mp3格式文件
前言 最近做一个即时通信类的项目,由于要保证pc端,iOS端和Android端的通用性,最终统一为MP3格式,一直担心MP3格式会不会很大,但是实测还是可以接受的.下面来看看具体步骤: 工具 MP3格 ...
- mp3格式怎么弄?制作mp3格式文件,教您2个有效的方法!
案例:如何制作mp3格式的文件? [我想制作自己的mp3文件,但不知道如何开始.有没有小伙伴可以分享一下制作mp3格式的方法?] MP3是一种非常流行的音频格式,被广泛用于数字音频的存储和传输.制作m ...
- 文件流能转换格式吗_amr转换mp3格式文件
MP3是非常标准的音频数字编码格式.区别于其他格式的优势在于,它可以在不降低音质的前提下,大幅的降低文件的大小.因此MP3格式应用范围极广,我们日常生活中用到的歌曲格式也多为MP3.今天要给大家说的是 ...
- kgtemp文件转换mp3_amr转换mp3格式文件
MP3是非常标准的音频数字编码格式.区别于其他格式的优势在于,它可以在不降低音质的前提下,大幅的降低文件的大小.因此MP3格式应用范围极广,我们日常生活中用到的歌曲格式也多为MP3.今天要给大家说的是 ...
- Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件
Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件 目录 利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件 1.先下载ff ...
- ncm格式文件转换为mp3格式文件
我们经常会遇到ncm格式的文件,然而,有了一款小工具,我们可以轻松将ncm格式转换为常见的mp3格式,以便更方便地播放和共享音乐.本文将介绍这个小工具的实现方式,让我们一起来看看吧! 首先,让我们来看 ...
- Android获取mp3音频文件播放总时长
Android获取mp3音频文件播放总时长 一般是需要文件的绝对路径,需要读取文件,转成媒体类解析,最好获取播放时长,然后关闭资源. /** * 获取音频文件的总时长大小 * * @param fil ...
- android 录音的格式转换,Android仿微信录音功能(录音后的raw文件转mp3文件)
现在很多时候需要用到录音,然后如果我们的App是ios和android两端的话,就要考虑录音的文件在两端都能使用,这个时候就需要适配,两端的录音文件都要是mp3文件,这样才能保证两边都能播放. 针对这 ...
最新文章
- Web模板引擎—Mustache
- 汇编语言的程序设计方法(循环结构和分支结构)
- 关于如何安装less
- 传说中的window8 的种子
- iPhone比小米贵3000,贵在哪里?
- 前端学习(3328):闭包的形式3
- win7安装TensorFlow-gpu 2.3详细教程(CUDA10.1,cuDNN7)
- 解决 IntelliJ IDEA 读取不了 datasource.properties
- 软件工程学习进度第六周暨暑期学习进度之第六周汇总
- BZOJ2160 拉拉队排练【Manacher】
- Java拦截器的简单使用
- php 阻止ip代码,php – 如何阻止100,000个独立的IP地址
- FPGA实现实时运动目标检测verilog
- java编程导出pdf_java中根据模板生成pdf文件
- 关于连接数据库出现Connection failed: Access denied for user ‘root‘@‘localhost‘ (using password: YES)解决方案(最有用)
- elasticsearch查询关键字slop
- Cannt find target\m2e-wtp\web-resources\META-INF\MANIFEST.MF
- 阿里王坚受邀成为 TGO 鲲鹏会荣誉导师
- OpenCV C++开发 第一节:Win7开发环境搭建
- pta习题:退休日期推算