项目有录音功能,本来是录制的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格式文件相关推荐

  1. android 录音的格式,Android录音mp3格式实例详解

    Android录音支持的格式有amr.aac,但这两种音频格式在跨平台上表现并不好. MP3显然才是跨平台的最佳选择. 项目地址 实现思路概述 在分析代码前,我们需要明确几个问题 1. 如何最终生成M ...

  2. android mp3数据格式,Android录制mp3格式文件

    前言 最近做一个即时通信类的项目,由于要保证pc端,iOS端和Android端的通用性,最终统一为MP3格式,一直担心MP3格式会不会很大,但是实测还是可以接受的.下面来看看具体步骤: 工具 MP3格 ...

  3. mp3格式怎么弄?制作mp3格式文件,教您2个有效的方法!

    案例:如何制作mp3格式的文件? [我想制作自己的mp3文件,但不知道如何开始.有没有小伙伴可以分享一下制作mp3格式的方法?] MP3是一种非常流行的音频格式,被广泛用于数字音频的存储和传输.制作m ...

  4. 文件流能转换格式吗_amr转换mp3格式文件

    MP3是非常标准的音频数字编码格式.区别于其他格式的优势在于,它可以在不降低音质的前提下,大幅的降低文件的大小.因此MP3格式应用范围极广,我们日常生活中用到的歌曲格式也多为MP3.今天要给大家说的是 ...

  5. kgtemp文件转换mp3_amr转换mp3格式文件

    MP3是非常标准的音频数字编码格式.区别于其他格式的优势在于,它可以在不降低音质的前提下,大幅的降低文件的大小.因此MP3格式应用范围极广,我们日常生活中用到的歌曲格式也多为MP3.今天要给大家说的是 ...

  6. Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件

    Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件 目录 利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件 1.先下载ff ...

  7. ncm格式文件转换为mp3格式文件

    我们经常会遇到ncm格式的文件,然而,有了一款小工具,我们可以轻松将ncm格式转换为常见的mp3格式,以便更方便地播放和共享音乐.本文将介绍这个小工具的实现方式,让我们一起来看看吧! 首先,让我们来看 ...

  8. Android获取mp3音频文件播放总时长

    Android获取mp3音频文件播放总时长 一般是需要文件的绝对路径,需要读取文件,转成媒体类解析,最好获取播放时长,然后关闭资源. /** * 获取音频文件的总时长大小 * * @param fil ...

  9. android 录音的格式转换,Android仿微信录音功能(录音后的raw文件转mp3文件)

    现在很多时候需要用到录音,然后如果我们的App是ios和android两端的话,就要考虑录音的文件在两端都能使用,这个时候就需要适配,两端的录音文件都要是mp3文件,这样才能保证两边都能播放. 针对这 ...

最新文章

  1. Web模板引擎—Mustache
  2. 汇编语言的程序设计方法(循环结构和分支结构)
  3. 关于如何安装less
  4. 传说中的window8 的种子
  5. iPhone比小米贵3000,贵在哪里?
  6. 前端学习(3328):闭包的形式3
  7. win7安装TensorFlow-gpu 2.3详细教程(CUDA10.1,cuDNN7)
  8. 解决 IntelliJ IDEA 读取不了 datasource.properties
  9. 软件工程学习进度第六周暨暑期学习进度之第六周汇总
  10. BZOJ2160 拉拉队排练【Manacher】
  11. Java拦截器的简单使用
  12. php 阻止ip代码,php – 如何阻止100,000个独立的IP地址
  13. FPGA实现实时运动目标检测verilog
  14. java编程导出pdf_java中根据模板生成pdf文件
  15. 关于连接数据库出现Connection failed: Access denied for user ‘root‘@‘localhost‘ (using password: YES)解决方案(最有用)
  16. elasticsearch查询关键字slop
  17. Cannt find target\m2e-wtp\web-resources\META-INF\MANIFEST.MF
  18. 阿里王坚受邀成为 TGO 鲲鹏会荣誉导师
  19. OpenCV C++开发 第一节:Win7开发环境搭建
  20. pta习题:退休日期推算

热门文章

  1. H3C router cmd
  2. 每日学术速递4.16
  3. 深入理解Java中的不可变对象
  4. (0)UOS第三方源支持(Debian源)
  5. PCI Express解析——系列文章【5】:PCIe原理分析之——PCI Express 配置解析(BDF、BAR)、 MEM Read举例
  6. 幸福生活离我们到底有多远
  7. jBuild一闪而过
  8. 古哥的 IT 职场历程
  9. 基于Django+Layui的组件化基础开发平台
  10. JPEG编解码基本技术回顾