Android中Pcm文件转换为Mp3

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

首先创建一个目录mp3lame(目录名字随意),然后在目录下创建jni文件夹,将lame源码下的libmp3lame文件拷贝到jni目录下,在jni目录下创建Android.mk

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE        := libmp3lame
LOCAL_CFLAGS := -DSTDC_HEADERS
LOCAL_SRC_FILES     := \
./libmp3lame/bitstream.c \
./libmp3lame/encoder.c \
./libmp3lame/fft.c \
./libmp3lame/gain_analysis.c \
./libmp3lame/id3tag.c \
./libmp3lame/lame.c \
./libmp3lame/mpglib_interface.c \
./libmp3lame/newmdct.c \
./libmp3lame/presets.c \
./libmp3lame/psymodel.c \
./libmp3lame/quantize.c \
./libmp3lame/quantize_pvt.c \
./libmp3lame/reservoir.c \
./libmp3lame/set_get.c \
./libmp3lame/tables.c \
./libmp3lame/takehiro.c \
./libmp3lame/util.c \
./libmp3lame/vbrquantize.c \
./libmp3lame/VbrTag.c \
./libmp3lame/version.c \
./wrapper.cLOCAL_LDLIBS := -lloginclude $(BUILD_SHARED_LIBRARY)

在创建Application.mk

APP_PLATFORM := android-19

这是指定app编译的sdk的版本,不设置会在编译过程报错,还有其他的一些配置参数,可以百度下。

把这两个文件放到jni目录下面,在mp3lame目录下执行ndk-build命令,文件开始编译

编写wrapper.c文件,这个是jni文件,需要自己编写方法去调用lame的方法

#include <stdio.h>
#include <stdlib.h>
#include <jni.h>
#include <android/log.h> 
#include "libmp3lame/lame.h"#define LOG_TAG "LAME ENCODER"
#define LOGD(format, args...)  __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, format, ##args);
#define BUFFER_SIZE 8192
#define be_short(s) ((short) ((unsigned short) (s) << 8) | ((unsigned short) (s) >> 8))lame_t lame;int read_samples(FILE *input_file, short *input) {int nb_read;nb_read = fread(input, 1, sizeof(short), input_file) / sizeof(short);int i = 0;while (i < nb_read) {input[i] = be_short(input[i]);i++;}return nb_read;
}void Java_com_demo_iflytek_mscdemo_Lame_initEncoder(JNIEnv *env,jobject jobj, jint in_num_channels, jint in_samplerate, jint in_brate,jint in_mode, jint in_quality) {lame = lame_init();LOGD("Encoding Init parameters:");lame_set_num_channels(lame, in_num_channels);LOGD("Encoding Number of channels: %d", in_num_channels);lame_set_in_samplerate(lame, in_samplerate);LOGD("Encoding Sample rate: %d", in_samplerate);lame_set_brate(lame, in_brate);LOGD("Encoding Bitrate: %d", in_brate);lame_set_mode(lame, in_mode);LOGD("Encoding Mode: %d", in_mode);lame_set_quality(lame, in_quality);LOGD("Encoding Quality: %d", in_quality);int res = lame_init_params(lame);LOGD("Encoding Init returned: %d", res);
}void Java_com_demo_iflytek_mscdemo_Lame_destroyEncoder(JNIEnv *env, jobject jobj) {int res = lame_close(lame);LOGD("Encoding Deinit returned: %d", res);
}void Java_com_demo_iflytek_mscdemo_Lame_encodeFile(JNIEnv *env,jobject jobj, jstring in_source_path, jstring in_target_path) {const char *source_path, *target_path;source_path = (*env)->GetStringUTFChars(env, in_source_path, NULL);target_path = (*env)->GetStringUTFChars(env, in_target_path, NULL);FILE *input_file, *output_file;input_file = fopen(source_path, "rb");output_file = fopen(target_path, "wb");short input[BUFFER_SIZE];char output[BUFFER_SIZE];int nb_read = 0;int nb_write = 0;int nb_total = 0;LOGD("Encoding started");while (nb_read = read_samples(input_file, input)) {nb_write = lame_encode_buffer(lame, input, input, nb_read, output,BUFFER_SIZE);fwrite(output, nb_write, 1, output_file);nb_total += nb_write;}LOGD("Encoded %d bytes", nb_total);nb_write = lame_encode_flush(lame, output, BUFFER_SIZE);fwrite(output, nb_write, 1, output_file);LOGD("Encoded Flushed %d bytes", nb_write);fclose(input_file);fclose(output_file);
}

将文件放到jni同级目录下,重新编译一遍。

编写java类

public class Lame {static {System.loadLibrary("mp3lame");}/**** @param numChannels 声道数* @param sampleRate 采样率* @param bitRate 比特率* @param mode 模式* @param quality*/public native void initEncoder(int numChannels, int sampleRate, int bitRate, int mode, int quality);public native void destroyEncoder();public native int encodeFile(String sourcePath, String targetPath);
}

这样就可以调用方法了。

注意:直接转mp3会出现噪音。。因为安卓字节是小端排序,lame是大端排序,所以需要转换,转换代码如下:

/*** 大小端字节转换* @param fileName* @return* @throws IOException*/public static String bigtolittle( String fileName) throws IOException {File file = new File(fileName);    //filename为pcm文件,请自行设置InputStream in = null;byte[] bytes = null;in = new FileInputStream(file);bytes = new byte[in.available()];//in.available()是得到文件的字节数int length = bytes.length;while (length != 1) {long i = in.read(bytes, 0, bytes.length);if (i == -1) {break;}length -= i;}int dataLength = bytes.length;int shortlength = dataLength / 2;ByteBuffer byteBuffer = ByteBuffer.wrap(bytes, 0, dataLength);ShortBuffer shortBuffer = byteBuffer.order(ByteOrder.LITTLE_ENDIAN).asShortBuffer();//此处设置大小端short[] shorts = new short[shortlength];shortBuffer.get(shorts, 0, shortlength);File file1 = File.createTempFile("pcm", null);//输出为临时文件String pcmtem = file1.getPath();FileOutputStream fos1 = new FileOutputStream(file1);BufferedOutputStream bos1 = new BufferedOutputStream(fos1);DataOutputStream dos1 = new DataOutputStream(bos1);for (int i = 0; i < shorts.length; i++) {dos1.writeShort(shorts[i]);}dos1.close();Log.d("gg", "bigtolittle: " + "=" + shorts.length);return pcmtem;}

ok这样就可以愉快的转换了,其他需求可以通过修改jni实现。放上几个资料的参考地址

https://blog.csdn.net/tcsupreme/article/details/80385670

https://www.jianshu.com/p/534741f5151c

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

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

相关文章

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;下面就分别介绍下这两…

有道翻译接口 破解

有道翻译 API 最近有些任务需要将中文翻译成英文&#xff0c;由于个人英文水平问题&#xff0c;每次都要打开好几个在线翻译网页&#xff0c;一句一句的丢进去&#xff0c;取最佳者为所用&#xff0c;甚是麻烦。 任务完成之后&#xff0c;就稍微研究了一下各个翻译接口&#…

对接有道翻译api中英翻译软件

中译英翻译软件对接了有道翻译API的翻译数据接口&#xff0c;通过数据接口&#xff0c;我们可以获得文本的批量翻译并对我们的译后文本进行内容自动编辑&#xff0c;通过调用有道翻译API数据接口&#xff0c;我们可以在我们的中译英翻译软件中更灵活地对我们的文本进行翻译处理…