**

Android录音并进行本地转码

**
通过安卓手机进行录音,
录音后,使用lame进行转码操作

开发中需要使用这个功能,只是一个简单的进行转码的工具,具体的代码信息如下
项目的基本结构图

1、下载工具包
下载lame工具包
使用的最新版本
安装NDK环境

2、lame内容复制
首先在 src/main/目录下新建一个 cpp文件夹,Lame源码中 libmp3lame拷贝到 cpp文件夹下,可以重命名,例如我命名为 lamemp3
将Lame源码中的 include文件夹下的 lame.h复制到 lamemp3文件夹中
剔除 lamemp3中不必要的文件和目录,.rc/am/in文件都可以删除,Android这里用不到,只保留 .c和 .h文件
修改 util.h的源码。在570行找到 ieee754_float32_t数据类型,将其修改为 float类型,因为 ieee754_float32_t是Linux或者是Unix下支持的数据类型,在Android下并不支持。
set_get.h中24行将 include<lame.h>改为 include"lame.h"
在 id3tag.c和 machine.h两个文件里,將 HAVE_STRCHR和 HAVE_MEMCPY的ifdef结构体注释掉,不然编译会报错。

3、build.gradle配置
因为Androidstudio已经更新到最新

defaultConfig {applicationId "com.example.gz.testmp3"minSdkVersion 23targetSdkVersion 27versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"externalNativeBuild{cmake{cppFlags "-frtti -fexceptions" //设置cpp配置参数,c文件请使用CFlagsabiFilters 'armeabi-v7a', "armeabi"}}ndk{abiFilters 'armeabi-v7a',"armeabi"}}sourceSets{main{jniLibs.srcDirs = ['libs']}}

如果下载的是最新的NDK与cmake,报出了一下的错误,

abis [mips64, armeabi, mips] are not supported for platform. supported
abis are [armeabi-v7a, arm64-v8a, x86, x86_64].

解决办法将gradle中cmake abiFilters配置改为:abiFilters ‘x86’, ‘x86_64’,’arm64-v8a’, ‘armeabi-v7a’
Google NDK r18解释: Support for ARMv5 (armeabi), MIPS, and MIPS64 has been removed. Attempting to build any of these ABIs will result in an error
我这里的abiFilters 只写了两个

4、编写Java native方法 MP3Converter

public class MP3Converter {static {System.loadLibrary("lame-mp3-utils");//这里一定要写对名称}//测试lame环境是否安装成功public static native String getLameVersion();/*** init lame* @param inSampleRate*              input sample rate in Hz* @param channel*              number of channels* @param mode*              0 = CBR, 1 = VBR, 2 = ABR.  default = 0* @param outSampleRate*              output sample rate in Hz* @param outBitRate*              rate compression ratio in KHz* @param quality*              quality=0..9. 0=best (very slow). 9=worst.<br />*              recommended:<br />*              2 near-best quality, not too slow<br />*              5 good quality, fast<br />*              7 ok quality, really fast*/public native static void init(int inSampleRate, int channel, int mode,int outSampleRate, int outBitRate, int quality);/*** file convert to mp3* it may cost a lot of time and better put it in a thread* @param inputPath*          file path to be converted* @param mp3Path*          mp3 output file path*/public native  static void convertMp3(String inputPath, String mp3Path);/*** get converted bytes in inputBuffer* @return*          converted bytes in inputBuffer*          to ignore the deviation of the file size,when return to -1 represents convert complete*/public native static long getConvertBytes();
}

5、编写调用C/C++的cpp
这个直接使用的是百度上的,仅限于能看懂,对于c++不懂

extern "C"
JNIEXPORT void JNICALL
Java_jaygoo_library_converter_MP3Converter_convertMp3(JNIEnv * env, jobject obj, jstring jInputPath, jstring jMp3Path) {const char* cInput = env->GetStringUTFChars(jInputPath, 0);const char* cMp3 = env->GetStringUTFChars(jMp3Path, 0);//open input file and output fileFILE* fInput = fopen(cInput,"rb");FILE* fMp3 = fopen(cMp3,"wb");short int inputBuffer[BUFFER_SIZE * 2];unsigned char mp3Buffer[BUFFER_SIZE];//You must specified at least 7200int read = 0; // number of bytes in inputBuffer, if in the end return 0int write = 0;// number of bytes output in mp3buffer.  can be 0long total = 0; // the bytes of reading input filenowConvertBytes = 0;//if you don't init lame, it will init lame use the default valueif(lame == NULL){lameInit(44100, 2, 0, 44100, 96, 7);}//convert to mp3do{read = static_cast<int>(fread(inputBuffer, sizeof(short int) * 2, BUFFER_SIZE, fInput));total +=  read * sizeof(short int)*2;nowConvertBytes = total;if(read != 0){write = lame_encode_buffer_interleaved(lame, inputBuffer, read, mp3Buffer, BUFFER_SIZE);//write the converted buffer to the filefwrite(mp3Buffer, sizeof(unsigned char), static_cast<size_t>(write), fMp3);}//if in the end flushif(read == 0){lame_encode_flush(lame,mp3Buffer, BUFFER_SIZE);}}while(read != 0);//release resourcesresetLame();fclose(fInput);fclose(fMp3);env->ReleaseStringUTFChars(jInputPath, cInput);env->ReleaseStringUTFChars(jMp3Path, cMp3);nowConvertBytes = -1;
}

6、剩下就是调用了

/*** 开始录音* @param mFlag*/public void recode(int mFlag){if(mState != -1){Log.e(mState+"1", "mState: "+mState );Message msg = new Message();Bundle b = new Bundle();// 存放数据b.putInt("cmd",CMD_RECORDFAIL);b.putInt("msg", ErrorCode.E_STATE_RECODING);msg.setData(b);uiHandler.sendMessage(msg); // 向Handler发送消息,更新UIreturn;}int mResult = -1;AudioRecorderWav mRecord_1 = AudioRecorderWav.getInstance();mResult = mRecord_1.startRecordAndFile(MainActivity.this);if(mResult == ErrorCode.SUCCESS){mState = mFlag;uiThread = new UIThread();new Thread(uiThread).start();}else{Message msg = new Message();Bundle b = new Bundle();// 存放数据b.putInt("cmd",CMD_RECORDFAIL);b.putInt("msg", mResult);msg.setData(b);uiHandler.sendMessage(msg); // 向Handler发送消息,更新UI}}

可能遇到的问题:

rg.gradle.api.internal.tasks.compile.CompilationFailedException:
Compilation failed

Compilation failed; see the compiler error output for details.

解决过程
terminal 输入
gradlew compileDebugSources
查看错误信息

代码下载地址
TestMp3

参考文章:
教你如何使用Android NDK实现一个MP3转码库
Android NDK开发(六)——使用开源LAME转码mp3

应用界面如下



Android录音并进行本地转码为MP3相关推荐

  1. android 录音相关资料

    http://www.eoeandroid.com/thread-171763-1-1.html 一.实例教程:Android设备功能之录音教程篇: 1.Android中的录音效果 (火) http: ...

  2. Android录音下————AudioRecord源码分析

    Android录音下----AudioRecord源码分析 文章目录 Android录音下----AudioRecord源码分析 一.概述 1.主要分析点 2.储备知识 二.getMinBufferS ...

  3. android实现监听打电话并录音保存到本地

    监听电话app 一.功能简介:     本demo基于android 6.0实现对麦克风的录音,将录音保存到本地.利用广播监听开机启动,并开启监听服务.如果有兴趣,可以添加网络权限和上传功能到指定邮箱 ...

  4. android主流型号手机本地录音路径

    android主流型号手机本地录音路径 第一次写博客,记录最近做的一个项目,需要获取android手机本地的录音文件.由于android手机型号太多,只能整理出主流手机录音文件位置.做一下记录. pu ...

  5. Android园区部队人脸识别源码门禁项目讲解

    Android园区部队人脸识别源码门禁项目讲解 这边搞人脸识别相关项目有一段时间,今天抽时间讲述一个经典的人脸识别项目:部队人脸识别门禁系统. 大家都知道部队对人员管理安全要求是相当高的,很多保密的技 ...

  6. android类中定义颜色,自定义实现简单的Android颜色选择器(附带源码)

    在写Android App过程中需要一个简单的颜色选择器,Android自带的ColorPicker和网上的一些ColorPicker都太高端了,都实现了颜色渐变功能,我要的不需要那么复杂,只想提供几 ...

  7. android 自定义相机源码,Android 自定义相机及分析源码

    Android 自定义相机及分析源码 使用Android 系统相机的方法: 要想让应用有相机的action,咱们就必须在清单文件中做一些声明,好让系统知道,如下 action的作用就是声明action ...

  8. Android服务函数远程调用源码分析

    在Android服务查询完整过程源码分析中介绍了客户进程向ServiceManager进程查询服务的完整过程,ServiceManager进程根据服务名称在自身维护的服务链表中查找ServiceMan ...

  9. Android服务查询完整过程源码分析

    Android服务注册完整过程源码分析中从上到下详细分析了Android系统的服务注册过程,本文同样针对AudioService服务来介绍Android服务的查询过程. 客户端进程数据发送过程 pri ...

最新文章

  1. python删除指定位置的字符串_python去除区域 python删除字符串中指定位置字符
  2. kafka python框架_为什么选择R而不是Python做ETL
  3. html5 中 video 标签,H5页面中 video 标签的坑
  4. linux下mysql5.7修改密码
  5. 登录自动填密码php,192 实现自动登录无限路由器后台管理网页,可以记住自己输入的密码 WEB(ASP,PHP,...) 238万源代码下载- www.pudn.com...
  6. base64 pdf解码无法打开_微信小程序使用echarts导出PDF
  7. qscoj:喵哈哈村的烧烤店(阶梯博弈)
  8. [转].net中的认证(authentication)与授权(authorization)
  9. ]物体受力分析的方法
  10. 基于cpolar内网穿透工具ssh远程访问linux服务器
  11. pr如何处理音效_PR剪辑如何让视频声音更好听
  12. 个人微信小程序快速赚攻略
  13. 如何在安卓手机上编辑Excel表格?
  14. PID tuning guide
  15. 我们分析了 10000 条视频,终于知道了今日头条推荐系统的秘密
  16. 常见神经系统疾病的临床诊断及处理原则题库【1】
  17. 消除Word文档被加密、限制编辑的解决方法
  18. java看不起c语言,为什么我感觉Java比C语言难呢?总觉得逻辑上没有C语言好理解。比如各种继承介面。包之间的关系。...
  19. 基于c语言图像灰度拉伸算法实现,c语言实现图像灰度均衡化
  20. 达梦数据库修改pagesize

热门文章

  1. 光时域反射仪 OTDR 光纤测试仪TFN FM150 高性能高精度 触摸屏大动态
  2. 华为最新提出的时序预测Mixers,取代Transformer实现效果速度双提升
  3. 基于SPRINGBOOT尚筹网-创意产品众筹平台
  4. 实现SheetJS读取excel表格数据并将表头中文转英文
  5. 国语-台大陈蕴侬-应用深度学习-2021
  6. 电子计算机按数字错乱,Win7系统键盘数字错乱如何恢复
  7. 对于网站优化要提供的一些建议
  8. Android开发工程师面试题
  9. 首次创业者必须知道哪些基本常识?
  10. 阿里云centos7自带mysql_阿里云CentOS7部署MySql8.0