Android studio通过lame生成把pcm转成MP3的so库以及音频的录制和播放附源码

1.先新建C++项目在这里插入图片描述
2. 在cpp目录下创建目录map3lame(名字随便起) ,接下来要用到
3.下载lame 地址lame
最新版本是3.100,解压完成后如下图
目录lame-3.100
把libmp3lame目录中的所有.c和.h文件(注意其他类型的文件和目录不需要)都复制到项目中新建的map3lame目录中,并且把include目录中的lame.h也复制到项目的map3lame中,一共有43个文件如下图
目录mp3lame
对其中三个文件进行修改,否则会报错

  • fft.c中47行将vector/lame_intrin.h这个头文件注释了或者去掉
  • 修改set_get.h文件的24行的#include <lame.h>改为#include “lame.h”
  • 将util.h文件的574行的”extern ieee754_float32_t - – fast_log2(ieee754_float32_t x);” 替换为 “extern float fast_log2(float x);”因为android下不支持该类型。

这些文件中会有红线报错,先不用管,因为没有配置CMakeLists.txt文件

4.代码逻辑

  • 在mp3lame 目录下新建mp3-lame.cpp文件(名字仍然是随意起),当然也可不用新建,直接用项目中自带的native-lib.cpp也一样,我这里为了区分就新建了一个;
  • 配置CMakeLists.txt文件
    在add_library中配置生成so库的名字(随便起),以及编译需要引用资源的路径,就是map3lame目录下所有的 .c文件(一共20个),以及我们新建的mp3l-lame.cpp,如下图,其中native-lib.cpp我注释掉了,因为有新建的mp3l-lame.cpp了
cmake_minimum_required(VERSION 3.18.1)# Declares and names the project.project("mp3lametest")# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.add_library( # Sets the name of the library.设置生成so库的名字mp3lame# Sets the library as a shared library.SHARED# Provides a relative path to your source file(s).
#        native-lib.cppmp3-lame.cppmp3lame/bitstream.cmp3lame/encoder.cmp3lame/gain_analysis.cmp3lame/id3tag.cmp3lame/fft.cmp3lame/lame.cmp3lame/mpglib_interface.cmp3lame/newmdct.cmp3lame/presets.cmp3lame/psymodel.cmp3lame/quantize.cmp3lame/quantize_pvt.cmp3lame/reservoir.cmp3lame/set_get.cmp3lame/tables.cmp3lame/takehiro.cmp3lame/util.cmp3lame/vbrquantize.cmp3lame/VbrTag.cmp3lame/version.c)# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.find_library( # Sets the name of the path variable.log-lib# Specifies the name of the NDK library that# you want CMake to locate.log)# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.target_link_libraries( # Specifies the target library.mp3lame# Links the target library to the log library# included in the NDK.${log-lib})

在target_link_libraries中配置的so名字要和上面定义一样
在这里插入图片描述

  • 新建类定义native方法,根据提示在map3-lame.cpp文件中生成jni方法
    步骤1
    步骤2
    在mp3-lame.cpp中编写初始化,解析,回收逻辑
#include <jni.h>//#include <string>//#include "android/log.h"#include "mp3lame/lame.h"//#include "net_iaround_utils_Mp3Lame.h"可以在这个头文件里定义一些变量和方法,但是感觉没啥必要,因为逻辑比较简单,一个类就行//#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , "mp3-lame", __VA_ARGS__)extern "C" {
lame_t lame;
JNIEXPORT void JNICALL
Java_net_iaround_utils_Mp3Lame_initEncoder(JNIEnv *env, jclass clazz, jint num_channels,jint sample_rate, jint bit_rate, jint mode,jint quality) {lame = lame_init(); lame_set_num_channels(lame, num_channels); //设置声道,跟实例化AudioRecord的参数的channelConfig声道配置保持一致lame_set_in_samplerate(lame, sample_rate); //设置采样率lame_set_brate(lame, bit_rate); //设置比特率xxx kbpslame_set_mode(lame, MPEG_mode_e(mode));//设置模式。立体声或者单声道lame_set_quality(lame,quality);//设置质量影响压缩算法,值范围为0-9, 0质量最好速度最慢,9质量最差速度最快。源码建议:3 near-best quality, not too slow; 5 good quality, fast; 7 ok quality, really fast。根据场景选择。lame_init_params(lame);//初始化参数//    LOGD("init");
}JNIEXPORT void JNICALL
Java_net_iaround_utils_Mp3Lame_destroyEncoder(JNIEnv *env, jclass clazz) {
//    LOGD("destroy");lame_close(lame);//回收资源lame = NULL;
}JNIEXPORT jint JNICALL
Java_net_iaround_utils_Mp3Lame_encodeBuffer(JNIEnv *env, jclass clazz, jbyteArray input,jint len_input, jbyteArray output, jint len_output) {short* pcm = (short *)(*env).GetByteArrayElements(input,NULL);unsigned char *result = (unsigned char *) (*env).GetByteArrayElements(output, NULL);int buffer;//num_samples这个参数是每个通道的采样点数量,根据实例化AudioRecord的参数audioFormat以及初始化的声道数量来决定的//例如当AudioFormat为16bit的时候,单通道输入, 一个采样点大小为2byte, 则nsamples = input有效数据长度(byte) / 2,即len_input/2//AudioFormat为16bit,双通道输入的时候 input有效数据长度(byte) / 2(16bite为2byte) / 2(通道数为2),即即len_input/2/2 = len_input/4if (numChannel > 1){buffer = lame_encode_buffer_interleaved(lame,pcm,len_input/4,result, len_output);} else {buffer = lame_encode_buffer(lame,pcm,NULL,len_input/2,result, len_output);}
//    LOGD("encode");(*env).ReleaseByteArrayElements(input, (jbyte *) pcm, 0);(*env).ReleaseByteArrayElements(output, (jbyte *) result, 0);return buffer;
}}

切记,注意代码中的注释,一些参数的设置需要和实例化AudioRecord时的参数保持对应,源码路径:编译libmp3lame.so的代码
使用该库我写了个demo,里面我封装了 音频的录制和播放功能源码路径:音频转MP3格式录制和播放demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/57793.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

香港金曲奖分析(1983-2017 by SIRMAN)

以前的金曲奖就是华语音乐的代表&#xff0c;特别是80、90年代&#xff0c;谭张争霸&#xff0c;四大天王等&#xff0c;虽然近来影响力已不如之前&#xff0c;但让我们来看看1983-2017的获奖名单。数据来源于百度百科“十大劲歌金曲颁奖典礼”&#xff0c;由于名单较多&#x…

Android中Pcm文件转换为Mp3

刚完成了一个pcm转成mp3的小工作&#xff0c;记录下自己解决这个问题的过程&#xff0c;以便以后可以参考。pcm转换mp3首选的就是lame这个开源框架&#xff0c;下载地址lame&#xff0c;下载完成后需要ndk编译lame。安卓ndk环境配置可以百度。下面记录下ndk编译lame的过程 首先…

NCM转MP3神奇的网页

由于毕业演出需要&#xff0c;下了QQ音乐上的一首需要会员的歌&#xff0c;发现是NCM格式&#xff0c;没有办法打开&#xff0c;于是在网上找方法&#xff0c;然后就发现了这个好方便的网页&#xff0c;直接线上转格式&#xff01;赶紧记下来&#xff0c;以备下次用&#xff01…

使用Lame库实现wav、pcm转mp3

文章目录 前言 一、Lame库是什么&#xff1f; 二、使用步骤 0.创建native项目 1.下载Lame库 2.pcm转MP3 3.wav转MP3 4、native方法如下 三、注意 总结 前言 因为使用android录音后生成的文件是wav或者pcm格式&#xff0c;项目要求最后的文件需要是mp3格式&#xff0c;于…

Android集成LAME库,实现pcm转mp3

一、交叉编译LAME库 LAME是一种非常优秀的MP3编码引擎&#xff0c;在业界&#xff0c;转码成MP3格式的音频文件时&#xff0c;最常用的编码器就是LAME库。 1. 下载LAME库源码 https://sourceforge.net/projects/lame/files/lame/ 进入LAME官网下载LAME源码&#xff0c;我选择…

[opcv图像处理] C/C|++将图片转换为马赛克效果

这个程序将图片转换为马赛克效果。 算法原理&#xff1a;求出每个小方块内所有像素的颜色平均值&#xff0c;然后用来设置为该小方块的颜色。依次处理每个小方块&#xff0c;即可实现马赛克效果。 完整代码如下&#xff1a; / // 程序名称&#xff1a;将图片转换为马赛克效果…

从入门到入土:Python实现爬取网易云歌词|评论生成词云图

写在前面&#xff1a; 此博客仅用于记录个人学习进度&#xff0c;学识浅薄&#xff0c;若有错误观点欢迎评论区指出。欢迎各位前来交流。&#xff08;部分材料来源网络&#xff0c;若有侵权&#xff0c;立即删除&#xff09; Python实现爬取网易云歌词|评论生成词云图 免责声明…

用python写一个爬取周杰伦所有歌词的爬虫

写一个爬虫爬一下周董的所有歌词看看这么多年他为啥这么火 唱的都是什么主题的歌可以这么经久不衰&#xff0c;他凭啥被称为流行歌曲天王。废话不多说 直接上代码 今天比较晚了 之后再慢慢完善讲解。代码比较low因为是编自学边完成的&#xff0c;所以只是实现了基本的功能&…

buuoj 来首歌吧 writeup

题目&#xff08;二十三&#xff09;&#xff1a; 【题型】Misc 【题目】来首歌吧 【来源】&#xff08;buuoj&#xff09;https://buuoj.cn/challenges#%E6%9D%A5%E9%A6%96%E6%AD%8C%E5%90%A7 【思路】通过音频的节奏得出摩斯密码&#xff0c;得到flag。 【具体步骤】 Step1&a…

chatgpt赋能python:Python打折代码:为你的电商网站提供更便捷的价格管理工具

Python打折代码&#xff1a;为你的电商网站提供更便捷的价格管理工具 在当前这个竞争激烈的市场&#xff0c;随时提供大量的优惠促销活动是吸引消费者注意力和提高销售额的必要手段之一。而电商网站在进行促销活动时&#xff0c;一个鲜为人知的秘密是——打折代码。打折代码作…

利用Python实现有道翻译的功能

这是上学期在Python课堂上老师讲的利用Python实现有道翻译的功能。 流程如下&#xff1a;网址&#xff1a;有道翻译 输入翻译名称&#xff0c;按F12对网页进行分析&#xff0c;通过查询到translate开头的连接中我们找到了翻译的数据参数 首先将参数以urlencode编码的方式传入到…

中英文自动翻译(有道翻译、彩云小译)

一.有道翻译 1&#xff09;获取应用ID 和 应用密钥 https://ai.youdao.com/doc.s#guide 2&#xff09;遵循接口参数接入 具体参考接口文档&#xff1a;https://ai.youdao.com/DOCSIRMA/html/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E7%BF%BB%E8%AF%91/API%E6%96%87%E6%A1%A3/…

Unity 接入有道智云AI - 文本翻译

接入接口前首先需要申请应用ID和应用秘钥&#xff0c;登录有道智云AI开放平台&#xff0c;创建应用&#xff0c;获取应用ID和秘钥。 定义接口响应类数据结构&#xff0c;接口实际返回内容和官方文档有点出入&#xff0c;大概是文档未更新吧。 以下是官方文档给出的说明&#x…

【Python爬虫】有道翻译新旧API接口

&#x1f308;据说&#xff0c;看我文章时 关注、点赞、收藏 的 帅哥美女们 心情都会不自觉的好起来。 前言&#xff1a; &#x1f9e1;作者简介&#xff1a;大家好我是 user_from_future &#xff0c;意思是 “ 来自未来的用户 ” &#xff0c;寓意着未来的自己一定很棒~ ✨个…

Translate插件的有道翻译

在plugins下载Translate插件 setting-> Tools->Translation 没有id和密钥就申请注册 登录后 创建应用 创建成功后输入id和密钥 点击鼠标右键即可使用 翻译效果 over

python利用有道词典翻译_Python利用有道词典接口制作即时翻译的工具

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于Python 实用宝典&#xff0c;作者Python 实用宝典 前言 在编程时经常会遇到需要将中文词汇翻译成英文的情况。 比如变量名的定义、取一个合…

如何用python“优雅的”调用有道翻译

文章目录 前言分析分析url分析参数01分析参数02加密分析 模拟请求注意点请求代码执行结果 结语 前言 其实在以前就盯上有道翻译了的&#xff0c;但是由于时间问题一直没有研究(我的骚操作还在后面&#xff0c;记得关注)&#xff0c;本文主要讲解如何用python调用有道翻译&…

Python 调用有道的翻译接口

最近为了熟悉一下 js 用有道翻译练了一下手&#xff0c;写一篇博客记录一下&#xff0c;也希望能对大家有所启迪&#xff0c;不过这些网站更新太快&#xff0c;可能大家尝试的时候会有所不同。 首先来看一下网页 post 过去的数据 大家不难发现&#xff0c;我们翻译的内容是…

使用python打造一个中英互译软件(基于有道翻译)

&#xff08;本博客简洁明了&#xff0c;适合小白入门&#xff09; 首先明确整体构架&#xff1a; 1.爬虫部分 2.界面部分 3.打包 涵盖的库&#xff1a; import urllib.request import urllib.parse import json import tkinter as tk import tkinter.messagebox 先确定爬…

ubuntu最好用的划词翻译词典:有道词典和GoldenDict

目录 1、安装有到词典 2、安装GoldenDict 3、GoldenDict的一些简单配置以及相关bug修改 用惯了Windows下的有道词典&#xff0c;其划词翻译功能用起来令人极其舒适&#xff5e;Ubuntu系统中也有有道词典以及一个类似的类似的软件GoldenDict&#xff0c;下面就分别介绍下这两…