项目作者: zhangYanGitHub

项目描述 :
Android 采用lame开源库,通过JNI 调用本地方法 实现MP3格式的录制 https://sourceforge.net/projects/lame/files/lame/
高级语言: C
项目地址: git://github.com/zhangYanGitHub/LameMp3.git
创建时间: 2018-01-12T07:07:16Z
项目社区:https://github.com/zhangYanGitHub/LameMp3

开源协议:Apache License 2.0

下载


LameMP3

采用lame开源库,通过JNI 调用本地方法 实现MP3格式的录制 https://sourceforge.net/projects/lame/files/lame/

PRs Welcome
License

最新版本

模块 lamemp3
最新版本 Download
  • 开源lame 版本 3.100

  • 引入

    1. compile 'com.zhang.lamemp3:lib_lame:1.0.0'
  • 使用方法

    1. /**
    2. * 采样率:音频的采样频率,每秒钟能够采样的次数,
    3. *采样率越高,音质越高。给出的实例是44100、22050、11025但不限于这几个参数。
    4. */
    5. recorder = new Mp3Player(this, 8000);
    6. recorder.setFilePath(dir + "/" + fileName);//录音保存目录
    7. //停止播放监听
    8. btn_play_stop.setOnClickListener(new View.OnClickListener() {
    9. @Override
    10. public void onClick(View v) {
    11. recorder.stopPlay();
    12. }
    13. });
    14. //播放本地音乐
    15. btn_play.setOnClickListener(new View.OnClickListener() {
    16. @Override
    17. public void onClick(View v) {
    18. recorder.play(dir + "/" + fileName);
    19. }
    20. });
    21. //播放回调 可以按需要封装
    22. recorder.setOnPlayListener(new Mp3Player.AudioPlayerListener() {
    23. @Override
    24. public void AudioUpdate(int level, int time) {
    25. tv.setText(String.valueOf("播放 \n level = " + level + "\n time = " + time + "s"));
    26. }
    27. });
    28. //播放完成监听
    29. recorder.setOnPlayFinishListener(new Mp3Player.AudioPlayerFinishListener() {
    30. @Override
    31. public void finish() {
    32. Toast.makeText(MainActivity.this, "播放结束", Toast.LENGTH_SHORT).show();
    33. }
    34. });
    35. //开始录制语音
    36. btn_record.setOnClickListener(new View.OnClickListener() {
    37. @Override
    38. public void onClick(View v) {
    39. recorder.start();
    40. }
    41. });
    42. //停止录制
    43. btn_stop.setOnClickListener(new View.OnClickListener() {
    44. @Override
    45. public void onClick(View v) {
    46. recorder.stop();
    47. }
    48. });
    49. //暂停录制
    50. btn_pause.setOnClickListener(new View.OnClickListener() {
    51. @Override
    52. public void onClick(View v) {
    53. recorder.pause();
    54. }
    55. });
    56. //继续录制
    57. btn_continue.setOnClickListener(new View.OnClickListener() {
    58. @Override
    59. public void onClick(View v) {
    60. recorder.restore();
    61. }
    62. });
    63. //录制时间回调
    64. recorder.setAudioUpdateListener(new Mp3Player.AudioUpdateListener() {
    65. @Override
    66. public void AudioUpdate(int level, int time) {
    67. tv.setText(String.valueOf("录制 \nlevel = " + level + "\n time = " + time + "s"));
    68. }
    69. });
    70. //录制结束监听
    71. recorder.setAudioFinishListener(new Mp3Player.AudioFinishListener() {
    72. @Override
    73. public void finish() {
    74. Toast.makeText(MainActivity.this, "录制结束", Toast.LENGTH_SHORT).show();
    75. }
    76. });
    77. //录制错误监听
    78. recorder.setOnErrorListener(new Mp3Player.OnErrorListener() {
    79. @Override
    80. public void onErrorInfo(String message) {
    81. Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
    82. }
    83. });
    • 最后记得释放子线程

      @Override
      protected void onDestroy() {

      1. super.onDestroy();
      2. recorder.onDestory();

      }

    • cmakeList.txt

      1. #1.cmake verson,指定cmake版本
      2. cmake_minimum_required(VERSION 3.4.1)
      3. # Creates and names a library, sets it as either STATIC
      4. # or SHARED, and provides the relative paths to its source code.
      5. # You can define multiple libraries, and CMake builds them for you.
      6. # Gradle automatically packages shared libraries with your APK.
  1. #2.project name,指定项目的名称,一般和项目的文件夹名称对应
  2. PROJECT(LaneMp3)
  3. #3.head file path,头文件目录
  4. INCLUDE_DIRECTORIES(
  5. src/main/cpp/include
  6. )
  7. #4.source directory,源文件目录
  8. AUX_SOURCE_DIRECTORY(src/main/cpp DIR_SRCS)
  9. #5.set environment variable,设置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,但是执行的时候会出现各种问题,比如"symbol lookup error xxxxx , undefined symbol"
  10. SET(TEST_MATH
  11. ${DIR_SRCS}
  12. )
  13. add_library( # Sets the name of the library.
  14. native_lame_mp3
  15. # Sets the library as a shared library.
  16. SHARED
  17. # Provides a relative path to your source file(s).
  18. ${DIR_SRCS} )
  19. #6.add executable file,添加要编译的可执行文件
  20. ADD_EXECUTABLE(${PROJECT_NAME} ${TEST_MATH})
  21. #7.add link library,添加可执行文件所需要的库,比如我们用到了libm.so(命名规则:lib+name+.so),就添加该库的名称
  22. target_link_libraries(${PROJECT_NAME} native_lame_mp3)
  • 混淆配置

    1. -keep class com.zhang.lamemp3.jni.lameMp3
    • 常见问题

      1. FAILURE: Build failed with an exception.
      2. * What went wrong:
      3. Execution failed for task ':lib_lame:externalNativeBuildRelease'.
      4. > Build command failed.
      5. Error while executing process D:\android\cmake\3.6.3155560\bin\cmake.exe with arguments {--build F:\git\LameMp3Demo\lib_lame\.externalNativeBuild\cmake\release\x86 --target LaneMp3}
      6. [1/1] Linking C executable LaneMp3
      7. FAILED: cmd.exe /C "cd . && D:\android\ndk-bundle\toolchains\llvm\prebuilt\windows-x86_64\bin\clang.exe --target=i686-none-linux-android --gcc-toolchain=D:/android/ndk-bundle/toolchains/x86-4.9/prebuilt/windows-x86_64 --sysroot=D:/android/ndk-bundle/sysroot -isystem D:/android/ndk-bundle/sysroot/usr
      8. /include/i686-linux-android -D__ANDROID_API__=17 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -Wa,--noexecstack -Wformat -Werror=format-security -DSTDC_HEADERS -O2 -DNDEBUG -Wl,--exclude-libs,libgcc.a --sysroot D:/android/ndk-bundle/pl
      9. atforms/android-17/arch-x86 -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -Wl,--gc-sections -Wl,-z,nocopyreloc -pie -fPIE CMakeFiles/LaneMp3.dir/src/main/cpp/bitstream.c.o CMakeFiles/LaneMp3.dir/src/main/cp
      10. p/encoder.c.o CMakeFiles/LaneMp3.dir/src/main/cpp/fft.c.o CMakeFiles/LaneMp3.dir/src/main/cpp/gain_analysis.c.o CMakeFiles/LaneMp3.dir/src/main/cpp/id3tag.c.o CMakeFiles/LaneMp3.dir/src/main/cpp/lame.c.o CMakeFiles/LaneMp3.dir/src/main/cpp/mpglib_interface.c.o CMakeFiles/LaneMp3.dir/src/main/cpp/native
      11. -lib.c.o CMakeFiles/LaneMp3.dir/src/main/cpp/newmdct.c.o CMakeFiles/LaneMp3.dir/src/main/cpp/presets.c.o CMakeFiles/LaneMp3.dir/src/main/cpp/psymodel.c.o CMakeFiles/LaneMp3.dir/src/main/cpp/quantize.c.o CMakeFiles/LaneMp3.dir/src/main/cpp/quantize_pvt.c.o CMakeFiles/LaneMp3.dir/src/main/cpp/reservoir.c
      12. .o CMakeFiles/LaneMp3.dir/src/main/cpp/set_get.c.o CMakeFiles/LaneMp3.dir/src/main/cpp/tables.c.o CMakeFiles/LaneMp3.dir/src/main/cpp/takehiro.c.o CMakeFiles/LaneMp3.dir/src/main/cpp/util.c.o CMakeFiles/LaneMp3.dir/src/main/cpp/vbrquantize.c.o CMakeFiles/LaneMp3.dir/src/main/cpp/VbrTag.c.o CMakeFiles/L
      13. aneMp3.dir/src/main/cpp/version.c.o CMakeFiles/LaneMp3.dir/src/main/cpp/xmm_quantize_sub.c.o -o LaneMp3 ../../../../build/intermediates/cmake/release/obj/x86/libnative_lame_mp3.so -lm && cd ."
      14. D:/android/ndk-bundle/platforms/android-17/arch-x86/usr/lib\crtbegin_dynamic.o:crtbegin.c:function _start: error: undefined reference to 'main'
      15. clang.exe: error: linker command failed with exit code 1 (use -v to see invocation)
      16. ninja: build stopped: subcommand failed.
  • 解决方法
    1. 更新你的NDK Cmake工具