我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android中怎么录制mp3格式文件

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android中怎么录制mp3格式文件

Android中怎么录制mp3格式文件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

工具

MP3格式是用一个开源项目转的,MP3lame,由于该项目用到了jni,所以需要大家配置好ndk环境,环境配置在此就不多说了,大家可以自行百度,最新的应该很好配置。

创建jni

拷贝文件

下载好后(我下载的是3.98.4版本)打开,找到libmp3lame文件,将里面的.h和.c拷贝下来,在自己的工程里创建jni文件夹,在jni文件夹下新建一个文件夹(我的命名为lame-3.98.4_libmp3lame,后面会用到),将刚才拷贝的文件复制进去,然后再把include文件夹里的lame.h也拷贝进去。

创建Android.mk

在jni中创建文件,Android.mk

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LAME_LIBMP3_DIR := lame-3.98.4_libmp3lameLOCAL_MODULE  := mp3lameLOCAL_class="lazy" data-src_FILES := $(LAME_LIBMP3_DIR)/bitstream.c $(LAME_LIBMP3_DIR)/fft.c $(LAME_LIBMP3_DIR)/id3tag.c $(LAME_LIBMP3_DIR)/mpglib_interface.c $(LAME_LIBMP3_DIR)/presets.c $(LAME_LIBMP3_DIR)/quantize.c $(LAME_LIBMP3_DIR)/reservoir.c $(LAME_LIBMP3_DIR)/tables.c $(LAME_LIBMP3_DIR)/util.c $(LAME_LIBMP3_DIR)/VbrTag.c $(LAME_LIBMP3_DIR)/encoder.c $(LAME_LIBMP3_DIR)/gain_analysis.c $(LAME_LIBMP3_DIR)/lame.c $(LAME_LIBMP3_DIR)/newmdct.c $(LAME_LIBMP3_DIR)/psymodel.c $(LAME_LIBMP3_DIR)/quantize_pvt.c $(LAME_LIBMP3_DIR)/set_get.c $(LAME_LIBMP3_DIR)/takehiro.c $(LAME_LIBMP3_DIR)/vbrquantize.c $(LAME_LIBMP3_DIR)/version.c com_maxi_mp3record_MP3Recorder.cinclude $(BUILD_SHARED_LIBRARY)

**注意:**LAME_LIBMP3_DIR := lame-3.98.4_libmp3lame 需要将其改为你的项目中的文件名,即上面说的jni下新建的文件夹。

大家应该看到了最后一句的com_maxi_mp3record_MP3Recorder.c
很明显这是我自己创建的.c文件。用来调用mp3lame中的接口的,对应着我java中的com.maxi.mp3record.MP3Recorder.java。咱们先创建java文件。

创建MP3Recorder.java

对应你的包名建一个MP3Recorder.java文件,该文件是java文件对应你的包名建立即可。

package cn.ctvonline.android.modules.project.widget;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import android.media.AudioFormat;import android.media.AudioRecord;import android.media.MediaRecorder;import android.os.Handler;public class MP3Recorder { private String filePath; private int sampleRate; private boolean isRecording = false; private boolean isPause = false; private Handler handler;  public static final int MSG_REC_STARTED = 1;  public static final int MSG_REC_STOPPED = 2;  public static final int MSG_REC_PAUSE = 3;  public static final int MSG_REC_RESTORE = 4;  public static final int MSG_ERROR_GET_MIN_BUFFERSIZE = -1;  public static final int MSG_ERROR_CREATE_FILE = -2;  public static final int MSG_ERROR_REC_START = -3;  public static final int MSG_ERROR_AUDIO_RECORD = -4;  public static final int MSG_ERROR_AUDIO_ENCODE = -5;  public static final int MSG_ERROR_WRITE_FILE = -6;  public static final int MSG_ERROR_CLOSE_FILE = -7; public MP3Recorder(int sampleRate) {  this.sampleRate = sampleRate; } public void setFilePath(String filePath) {  this.filePath = filePath; }  public void start() {  if (isRecording) {   return;  }  new Thread() {   @Override   public void run() {    android.os.Process      .setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);    // 根据定义好的几个配置,来获取合适的缓冲大小    final int minBufferSize = AudioRecord.getMinBufferSize(      sampleRate, AudioFormat.CHANNEL_IN_MONO,      AudioFormat.ENCODING_PCM_16BIT);    if (minBufferSize < 0) {     if (handler != null) {      handler.sendEmptyMessage(MSG_ERROR_GET_MIN_BUFFERSIZE);     }     return;    }    AudioRecord audioRecord = new AudioRecord(      MediaRecorder.AudioSource.MIC, sampleRate,      AudioFormat.CHANNEL_IN_MONO,      AudioFormat.ENCODING_PCM_16BIT, minBufferSize * 2);    // 5秒的缓冲    short[] buffer = new short[sampleRate * (16 / 8) * 1 * 5];    byte[] mp3buffer = new byte[(int) (7200 + buffer.length * 2 * 1.25)];    FileOutputStream output = null;    try {     File file = createSDFile(filePath);     output = new FileOutputStream(file);    } catch (FileNotFoundException e) {     if (handler != null) {      handler.sendEmptyMessage(MSG_ERROR_CREATE_FILE);     }     return;    } catch (IOException e) {     // TODO Auto-generated catch block     e.printStackTrace();    }    MP3Recorder.init(sampleRate, 1, sampleRate, 32);    isRecording = true; // 录音状态    isPause = false; // 录音状态    try {     try {      audioRecord.startRecording(); // 开启录音获取音频数据      if (mListener != null) {       mListener.wellPrepared();      }     } catch (IllegalStateException e) {      // 不给录音...      if (handler != null) {       handler.sendEmptyMessage(MSG_ERROR_REC_START);      }      return;     }     try {      // 开始录音      if (handler != null) {       handler.sendEmptyMessage(MSG_REC_STARTED);      }      int readSize = 0;      boolean pause = false;      while (isRecording) {              if (isPause) {        if (!pause) {         handler.sendEmptyMessage(MSG_REC_PAUSE);         pause = true;        }        continue;       }       if (pause) {        handler.sendEmptyMessage(MSG_REC_RESTORE);        pause = false;       }                     readSize = audioRecord.read(buffer, 0,         minBufferSize);       voiceLevel = getVoiceSize(readSize, buffer);       if (readSize < 0) {        if (handler != null) {         handler.sendEmptyMessage(MSG_ERROR_AUDIO_RECORD);        }        break;       } else if (readSize == 0) {        ;       } else {        int encResult = MP3Recorder.encode(buffer,          buffer, readSize, mp3buffer);        if (encResult < 0) {         if (handler != null) {          handler.sendEmptyMessage(MSG_ERROR_AUDIO_ENCODE);         }         break;        }        if (encResult != 0) {         try {          output.write(mp3buffer, 0, encResult);         } catch (IOException e) {          if (handler != null) {           handler.sendEmptyMessage(MSG_ERROR_WRITE_FILE);          }          break;         }        }       }             }            int flushResult = MP3Recorder.flush(mp3buffer);      if (flushResult < 0) {       if (handler != null) {        handler.sendEmptyMessage(MSG_ERROR_AUDIO_ENCODE);       }      }      if (flushResult != 0) {       try {        output.write(mp3buffer, 0, flushResult);       } catch (IOException e) {        if (handler != null) {         handler.sendEmptyMessage(MSG_ERROR_WRITE_FILE);        }       }      }      try {       output.close();      } catch (IOException e) {       if (handler != null) {        handler.sendEmptyMessage(MSG_ERROR_CLOSE_FILE);       }      }           } finally {      audioRecord.stop();      audioRecord.release();     }    } finally {     MP3Recorder.close();     isRecording = false;    }    if (handler != null) {     handler.sendEmptyMessage(MSG_REC_STOPPED);    }   }  }.start(); } public void stop() {  isRecording = false; } public void pause() {  isPause = true; } public void restore() {  isPause = false; } public boolean isRecording() {  return isRecording; } public boolean isPaus() {  if (!isRecording) {   return false;  }  return isPause; } // 获得声音的level public int getVoiceSize(int r, short[] buffer) {  if (isRecording) {   try {    long v = 0;    // 将 buffer 内容取出,进行平方和运算    for (int i = 0; i < buffer.length; i++) {     v += buffer[i] * buffer[i];    }    // 平方和除以数据总长度,得到音量大小。    double mean = v / (double) r;    double volume = 10 * Math.log10(mean);    return (((int) volume / 10) - 1);   } catch (Exception e) {    // TODO Auto-generated catch block   }  }  return 1; }  public static File createSDFile(String fileName) throws IOException {  File file = new File(fileName);  if (!isFileExists(file))   if (file.isDirectory()) {    file.mkdirs();   } else {    file.createNewFile();   }  return file; } private int voiceLevel; public int getVoiceLevel() {  return voiceLevel; } public interface AudioStageListener {  void wellPrepared(); } public AudioStageListener mListener; public void setOnAudioStageListener(AudioStageListener listener) {  mListener = listener; }  public void setHandle(Handler handler) {  this.handler = handler; }  static {  System.loadLibrary("mp3lame"); }  public static void init(int inSamplerate, int outChannel,   int outSamplerate, int outBitrate) {  init(inSamplerate, outChannel, outSamplerate, outBitrate, 7); }  public native static void init(int inSamplerate, int outChannel,   int outSamplerate, int outBitrate, int quality);  public native static int encode(short[] buffer_l, short[] buffer_r,   int samples, byte[] mp3buf);  public native static int flush(byte[] mp3buf);  public native static void close();}

创建c文件

在创建c文件,创建在jni下,命名就按你的java文件所在的包名命名”.”替换为“_”。例如:com_maxi_mp3record_MP3Recorder.c。当然还得有头文件:com_maxi_mp3record_MP3Recorder.h。

com_maxi_mp3record_MP3Recorder.c

#include "lame-3.98.4_libmp3lame/lame.h"#include "com_maxi_mp3record_MP3Recorder.h"static lame_global_flags *glf = NULL;JNIEXPORT void JNICALL Java_com_maxi_mp3record_MP3Recorder_init(  JNIEnv *env, jclass cls, jint inSamplerate, jint outChannel,  jint outSamplerate, jint outBitrate, jint quality) { if (glf != NULL) {  lame_close(glf);  glf = NULL; } glf = lame_init(); lame_set_in_samplerate(glf, inSamplerate); lame_set_num_channels(glf, outChannel); lame_set_out_samplerate(glf, outSamplerate); lame_set_brate(glf, outBitrate); lame_set_quality(glf, quality); lame_init_params(glf);}JNIEXPORT jint JNICALL Java_com_maxi_mp3record_MP3Recorder_encode(  JNIEnv *env, jclass cls, jshortArray buffer_l, jshortArray buffer_r,  jint samples, jbyteArray mp3buf) { jshort* j_buffer_l = (*env)->GetShortArrayElements(env, buffer_l, NULL); jshort* j_buffer_r = (*env)->GetShortArrayElements(env, buffer_r, NULL); const jsize mp3buf_size = (*env)->GetArrayLength(env, mp3buf); jbyte* j_mp3buf = (*env)->GetByteArrayElements(env, mp3buf, NULL); int result = lame_encode_buffer(glf, j_buffer_l, j_buffer_r,   samples, j_mp3buf, mp3buf_size); (*env)->ReleaseShortArrayElements(env, buffer_l, j_buffer_l, 0); (*env)->ReleaseShortArrayElements(env, buffer_r, j_buffer_r, 0); (*env)->ReleaseByteArrayElements(env, mp3buf, j_mp3buf, 0); return result;}JNIEXPORT jint JNICALL Java_com_maxi_mp3record_MP3Recorder_flush(  JNIEnv *env, jclass cls, jbyteArray mp3buf) { const jsize mp3buf_size = (*env)->GetArrayLength(env, mp3buf); jbyte* j_mp3buf = (*env)->GetByteArrayElements(env, mp3buf, NULL); int result = lame_encode_flush(glf, j_mp3buf, mp3buf_size); (*env)->ReleaseByteArrayElements(env, mp3buf, j_mp3buf, 0); return result;}JNIEXPORT void JNICALL Java_com_maxi_mp3record_MP3Recorder_close(  JNIEnv *env, jclass cls) { lame_close(glf); glf = NULL;}

com_maxi_mp3record_MP3Recorder.h

#include <jni.h>#ifndef _Included_com_maxi_mp3record_MP3Recorder#define _Included_com_maxi_mp3record_MP3Recorder#ifdef __cplusplusextern "C" {#endifJNIEXPORT void JNICALL Java_com_maxi_mp3record_MP3Recorder_init (JNIEnv *, jclass, jint, jint, jint, jint, jint);JNIEXPORT jint JNICALL Java_com_maxi_mp3record_MP3Recorder_encode (JNIEnv *, jclass, jshortArray, jshortArray, jint, jbyteArray);JNIEXPORT jint JNICALL Java_com_maxi_mp3record_MP3Recorder_flush (JNIEnv *, jclass, jbyteArray);JNIEXPORT void JNICALL Java_com_maxi_mp3record_MP3Recorder_close (JNIEnv *, jclass);#ifdef __cplusplus}#endif#endif

这俩文件别只复制不看内容啊,里面可都是连接java和c的接口,所以不能有差错。举个例子吧,#ifndef _Included_com_maxi_mp3record_MP3Recorder,这个就得替换成你对应的包名,里面所有都得替换成你自己的程序对应的包名。

编译ndk

创建Application.mk在你的项目文件的jni下,在里面写入:
APP_ABI := all
如果不加,NDK只会编译“armeabi”,然而安卓有很多不同类型的处理器,所以我们不止需要arm。相信你们搞到现在了肯定ndk都配置好了,然后打开终端,进入到你的项目(找到你的ndk目录下的ndk-bulid,最好把它添加到环境变量里,对于以后编译比较方便,在此默认你没添加环境变量),执行ndk-bulid。稍等片刻你会发现你的项目里多了一个obj文件夹,obj文件夹下会生成”arm64-v8a”、”armeabi”、”armeabi-v7a”、”mips”、”mips64”、”x86”、”x86_64”。打开它,各个文件夹下会有一个libmp3lame.so。ok,没错那就是你要的“滑板鞋”。将它放入你的libs文件下,没有自行创建,各个平台便都可以加载了。

使用方法

MP3Recorder recorder = new MP3Recorder(8000);recorder.setFilePath(voicePath);//录音保存目录recorder.start();//开始录音recorder.stop();//录音结束recorder.getVoiceLevel()//这是我封装的获取音频振幅接口,大家可以用来录音的时候显示声音大小,数据自行调节。

看完上述内容,你们掌握Android中怎么录制mp3格式文件的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android中怎么录制mp3格式文件

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android中怎么录制mp3格式文件

Android中怎么录制mp3格式文件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。工具MP3格式是用一个开源项目转的,MP3lame,由于该项目用到了jni,所以需要大家配置
2023-05-30

windows中DAT文件怎么转mp3格式

今天小编给大家分享一下windows中DAT文件怎么转mp3格式的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。DAT文件转m
2022-12-28

Android 怎么用Lame编码器编码mp3文件

这篇文章主要介绍“Android 怎么用Lame编码器编码mp3文件”,在日常操作中,相信很多人在Android 怎么用Lame编码器编码mp3文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android
2023-06-14

Android中怎么使用pull方式解析xml格式文件

这篇文章将为大家详细讲解有关Android中怎么使用pull方式解析xml格式文件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。具体如下:
2023-05-30

android布局文件的格式是什么

Android布局文件的格式是XML(eXtensible Markup Language,可扩展标记语言)。XML是一种用于存储和传输数据的标记语言,它具有良好的可读性和可扩展性,适用于描述布局结构和属性等信息。在Android中,布局文
2023-10-24

windows中tmp文件怎么转换格式

这篇文章主要介绍了windows中tmp文件怎么转换格式的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇windows中tmp文件怎么转换格式文章都会有所收获,下面我们一起来看看吧。tmp文件转换格式的方法1、t
2023-07-01

PDF、Doc与Dwg格式的文件怎么在Android 应用中打开

本篇文章为大家展示了PDF、Doc与Dwg格式的文件怎么在Android 应用中打开,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。代码:这是一个单独的类 首先接收intent传过来的url我是用ur
2023-05-31

怎么在python中转换json文件格式

本篇文章给大家分享的是有关怎么在python中转换json文件格式,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。python有哪些常用库python常用的库:1.requesu
2023-06-14

怎么在python中使用CSV文件格式

今天就跟大家聊聊有关怎么在python中使用CSV文件格式,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,
2023-06-14

怎么将文件PDF格式转换成Word格式

这篇文章给大家分享的是有关怎么将文件PDF格式转换成Word格式的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。(1)打开手机,在手机上的应用市场上搜索“PDF转换大师”,找到可以转换文档格式的工具,将其下载到手机
2023-06-05

windows中tmp文件怎么转换格式mp4

这篇文章主要讲解了“windows中tmp文件怎么转换格式mp4”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“windows中tmp文件怎么转换格式mp4”吧!tmp文件转换格式mp4的方法
2023-07-01

html格式文件怎么打开

在如今数字化的时代,HTML成为了最常用的网页设计语言之一。对于许多人来说,HTML并不是很了解,那么这篇文章将针对HTML格式文件如何打开进行讲解。HTML全称为超文本标记语言,是一种用于创建Web页面的标准语言。此语言主要被Web浏览器解释和显示。在因特网上,我们经常会遇到各种以.html或.htm结尾的文件,这是HTML格式文件,通常来说只有通过Web浏览器才能打开这种类
2023-05-14

怎么修改php格式文件

本篇内容介绍了“怎么修改php格式文件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!步骤一:了解PHP文件格式在您进行修改之前,您需要了解P
2023-07-05

.vue格式文件怎么打开

这篇文章主要介绍“.vue格式文件怎么打开”,在日常操作中,相信很多人在.vue格式文件怎么打开问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”.vue格式文件怎么打开”的疑惑有所帮助!接下来,请跟着小编一起来
2023-07-05

​dng格式文件怎么打开

本篇内容介绍了“dng格式文件怎么打开”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!dng格式是数码相机原始数据的公共存档格式,可以用Ado
2023-06-20

Python怎么将csv格式转换成JSON格式文件

这篇文章主要介绍“Python怎么将csv格式转换成JSON格式文件”,在日常操作中,相信很多人在Python怎么将csv格式转换成JSON格式文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python怎
2023-06-02

windows中ofd文件怎么转换成wps格式

本篇内容介绍了“windows中ofd文件怎么转换成wps格式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ofd文件转换成wps格式的方法
2023-01-03

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录