Giter Site home page Giter Site logo

zlwaudiorecorder's Introduction

ZlwAudioRecorder

功能

  1. 使用AudioRecord进行录音
  2. 实现pcm、wav、mp3音频的录制
  3. 实时获取录音的音量、及录音byte数据
  4. 获取wav/mp3录音文件的时长
  5. 可配置录音的采样率、位宽 (v1.04更新)
  6. 录音可视化 (v1.05更新)
  7. 音源支持内录(Android10及以上版本支持) (v1.09更新)

博客

https://www.jianshu.com/p/c0222de2faed

Gradle

dependencies {
        implementation 'com.github.zhaolewei:ZlwAudioRecorder:v1.09'
}

allprojects {
    repositories {
        ...
        maven { url 'https://www.jitpack.io' }
    }
}

如何使用

  1. 初始化
  • init

    /**
    * 参数1: Application 实例
    * 参数2: 是否打印日志   
    */
    RecordManager.getInstance().init(MyApp.getInstance(), false);
  • 在清单文件中注册Services

    <service android:name="com.zlw.main.recorderlib.recorder.RecordService" />
  • 确保有录音权限

  1. 配置录音参数
  • 修改录音格式(默认:WAV)

     RecordManager.getInstance().changeFormat(RecordConfig.RecordFormat.WAV);
  • 修改录音配置

         RecordManager.getInstance().changeRecordConfig(recordManager.getRecordConfig().setSampleRate(16000));
         RecordManager.getInstance().changeRecordConfig(recordManager.getRecordConfig().setEncodingConfig(AudioFormat.ENCODING_PCM_8BIT));
  • 修改录音音源

         RecordManager.getInstance().setSource(RecordConfig.SOURCE_MIC); // 麦克风
         RecordManager.getInstance().setSource(RecordConfig.SOURCE_SYSTEM); //系统内录
  • 修改录音文件存放位置(默认sdcard/Record)

       RecordManager.getInstance().changeRecordDir(recordDir);
  • 录音状态监听

    RecordManager.getInstance().setRecordStateListener(new RecordStateListener() {
       @Override
       public void onStateChange(RecordHelper.RecordState state) {
           }
       }
    
       @Override
       public void onError(String error) {
       }
    });
  • 录音结果监听

    RecordManager.getInstance().setRecordResultListener(new RecordResultListener() {
       @Override
       public void onResult(File result) {
       }
    });
  • 声音大小监听

     RecordManager.getInstance().setRecordSoundSizeListener(new RecordSoundSizeListener() {
        @Override
        public void onSoundSize(int soundSize) {
        }
    });
  • 音频数据监听

      recordManager.setRecordDataListener(new RecordDataListener() {
         @Override
         public void onData(byte[] data) {
         }
     });
  • 音频可视化数据监听

       recordManager.setRecordFftDataListener(new RecordFftDataListener() {
          @Override
          public void onFftData(byte[] data) {
              audioView.setWaveData(data);
          }
        });
  1. 录音控制
  • 开始录音
    RecordManager.getInstance().start();
  • 暂停录音
    RecordManager.getInstance().pasue();
  • 恢复录音
    RecordManager.getInstance().resume();
  • 停止
    RecordManager.getInstance().stop();

Demo

Demo.png

zlwaudiorecorder's People

Contributors

newpepsi avatar zhaolewei avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

zlwaudiorecorder's Issues

关于getMaxAmplitude()函数

你好,MediaRecorder里提供了getMaxAmplitude()函数,那使用AudioRecord录音的时候怎么获取振幅呢?网上找了比较多的方法,发现和MediaRecorder里提供的数据有较大差别。
多谢

空指针异常

设备:三星

Android版本:5~6

java.lang.RuntimeException:Unable to start service com.zlw.main.recorderlib.recorder.RecordService@d1318b0 with Intent { cmp=com.yuanli.mvpuscs/com.zlw.main.recorderlib.recorder.RecordService (has extras) }: java.lang.NullPointerException: Attempt to invoke virtual method 'char[] java.lang.String.toCharArray()' on a null object reference

录音结束的时候会报异常java.io.IOException: Stream Closed

java.io.IOException: Stream Closed
在RecordHelper.java:505
关闭资源的时候把两个位置调换一下就可以了
try {
if (fos != null) {
fos.close();
}
if (outputStream != null) {
outputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
改成
try {
if (outputStream != null) {
outputStream.close();
}
if (fos != null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
大佬可以把这个地方优化下

多次调用录音会报错,麻烦帮忙解决一下

我多次录制音频文件,会发生如下错误(jar里面报的错):
03-12 13:37:49.709 1323-1727/com.ycsoft.smartbox E/^_^RecordHelper=============: length=1536; regionStart=0; regionLength=-3
java.lang.ArrayIndexOutOfBoundsException: length=1536; regionStart=0; regionLength=-3
at java.util.Arrays.checkOffsetAndCount(Arrays.java:1732)
at libcore.io.IoBridge.write(IoBridge.java:444)
at java.io.FileOutputStream.write(FileOutputStream.java:202)
at com.zlw.main.recorderlib.recorder.RecordHelper$AudioRecordThread.startPcmRecorder(RecordHelper.java:294)
at com.zlw.main.recorderlib.recorder.RecordHelper$AudioRecordThread.run(RecordHelper.java:276)

03-12 13:37:51.469 1323-1323/com.ycsoft.smartbox E/^_^RecordHelper=============: 状态异常当前状态: IDLE

第一次录制成功,录完以后,再录制第二个,结果就出现录音出错了,然后就是如上的log,麻烦帮忙看看呢?

测试过程偶尔会遇到崩溃的现象报错如下

java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Bundle android.content.Intent.getExtras()' on a null object reference
at com.zlw.main.recorderlib.recorder.RecordService.onStartCommand(RecordService.java:59)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3700)
at android.app.ActivityThread.access$1700(ActivityThread.java:200)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1704)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:201)
at android.app.ActivityThread.main(ActivityThread.java:6810)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)

滴滴

能不能留下一个联系方式....有问题想请教

android 8.0+服务不能在后台运行问题

java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.zlw.main.recorderlib.recorder.RecordService

Caused by: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=.../com.zlw.main.recorderlib.recorder.RecordService (has extras) }: app is in background uid UidRecord{25d39c9 u0a270 SVC bg:+1m0s49ms idle change:idle procs:2 seq(0,0,0)}

编译失败……

Android resource linking failed
D:\projects\living\ZlwAudioRecorder\app\build\intermediates\incremental\mergeDebugResources\merged.dir\values\values.xml:1814: error: resource android:attr/fontVariationSettings not found.
D:\projects\living\ZlwAudioRecorder\app\build\intermediates\incremental\mergeDebugResources\merged.dir\values\values.xml:1815: error: resource android:attr/ttcIndex not found.
error: failed linking references.

W/AudioFlinger: RecordThread: buffer overflow

backtrace:
2019-12-02 11:27:59.038 6940-6940/? A/DEBUG: #00 pc 00049e54 /system/lib/libc.so (tgkill+12)
2019-12-02 11:27:59.038 6940-6940/? A/DEBUG: #1 pc 000475f3 /system/lib/libc.so (pthread_kill+34)
2019-12-02 11:27:59.038 6940-6940/? A/DEBUG: #2 pc 0001d8a5 /system/lib/libc.so (raise+10)
2019-12-02 11:27:59.038 6940-6940/? A/DEBUG: #3 pc 000193f1 /system/lib/libc.so (__libc_android_abort+34)
2019-12-02 11:27:59.038 6940-6940/? A/DEBUG: #4 pc 00017034 /system/lib/libc.so (abort+4)
2019-12-02 11:27:59.038 6940-6940/? A/DEBUG: #5 pc 0000c3c9 /system/lib/libcutils.so (__android_log_assert+112)
2019-12-02 11:27:59.038 6940-6940/? A/DEBUG: #6 pc 00028857 /system/lib/libhwui.so
2019-12-02 11:27:59.038 6940-6940/? A/DEBUG: #7 pc 0002923b /system/lib/libhwui.so (_ZN7android10uirenderer12renderthread12RenderThread5queueEPNS1_10RenderTaskE+22)
2019-12-02 11:27:59.038 6940-6940/? A/DEBUG: #8 pc 00025a23 /system/lib/libhwui.so
2019-12-02 11:27:59.039 6940-6940/? A/DEBUG: #9 pc 000259ed /system/lib/libhwui.so
2019-12-02 11:27:59.039 6940-6940/? A/DEBUG: #10 pc 0008e365 /system/lib/libandroid_runtime.so
2019-12-02 11:27:59.039 6940-6940/? A/DEBUG: #11 pc 01e92171 /system/framework/arm/boot-framework.oat (offset 0x15b6000) (android.view.ThreadedRenderer.nSyncAndDrawFrame+124)
2019-12-02 11:27:59.039 6940-6940/? A/DEBUG: #12 pc 01e92d63 /system/framework/arm/boot-framework.oat (offset 0x15b6000) (android.view.ThreadedRenderer.draw+302)
2019-12-02 11:27:59.039 6940-6940/? A/DEBUG: #13 pc 01eabb0f /system/framework/arm/boot-framework.oat (offset 0x15b6000) (android.view.ViewRootImpl.draw+1338)
2019-12-02 11:27:59.039 6940-6940/? A/DEBUG: #14 pc 01eae6a3 /system/framework/arm/boot-framework.oat (offset 0x15b6000) (android.view.ViewRootImpl.performDraw+142)
2019-12-02 11:27:59.039 6940-6940/? A/DEBUG: #15 pc 01eb1165 /system/framework/arm/boot-framework.oat (offset 0x15b6000) (android.view.ViewRootImpl.performTraversals+8888)
2019-12-02 11:27:59.039 6940-6940/? A/DEBUG: #16 pc 01eb40df /system/framework/arm/boot-framework.oat (offset 0x15b6000) (android.view.ViewRootImpl.doTraversal+146)
2019-12-02 11:27:59.039 6940-6940/? A/DEBUG: #17 pc 01ea731d /system/framework/arm/boot-framework.oat (offset 0x15b6000) (android.view.ViewRootImpl$TraversalRunnable.run+40)
2019-12-02 11:27:59.039 6940-6940/? A/DEBUG: #18 pc 01df4d89 /system/framework/arm/boot-framework.oat (offset 0x15b6000) (android.view.Choreographer$CallbackRecord.run+164)
2019-12-02 11:27:59.039 6940-6940/? A/DEBUG: #19 pc 01df673f /system/framework/arm/boot-framework.oat (offset 0x15b6000) (android.view.Choreographer.doCallbacks+554)
2019-12-02 11:27:59.039 6940-6940/? A/DEBUG: #20 pc 01df6c77 /system/framework/arm/boot-framework.oat (offset 0x15b6000) (android.view.Choreographer.doFrame+850)
2019-12-02 11:27:59.039 6940-6940/? A/DEBUG: #21 pc 01df5781 /system/framework/arm/boot-framework.oat (offset 0x15b6000) (android.view.Choreographer$FrameDisplayEventReceiver.run+60)
2019-12-02 11:27:59.039 6940-6940/? A/DEBUG: #22 pc 0162b4b5 /system/framework/arm/boot-framework.oat (offset 0x15b6000) (android.os.Handler.handleCallback+48)
2019-12-02 11:27:59.039 6940-6940/? A/DEBUG: #23 pc 0162b513 /system/framework/arm/boot-framework.oat (offset 0x15b6000) (android.os.Handler.dispatchMessage+54)
2019-12-02 11:27:59.039 6940-6940/? A/DEBUG: #24 pc 01bdfd4f /system/framework/arm/boot-framework.oat (offset 0x15b6000) (android.os.Looper.loop+714)
2019-12-02 11:27:59.039 6940-6940/? A/DEBUG: #25 pc 0163c90f /system/framework/arm/boot-framework.oat (offset 0x15b6000) (android.app.ActivityThread.main+426)
2019-12-02 11:27:59.039 6940-6940/? A/DEBUG: #26 pc 000a99c1 /system/lib/libart.so (art_quick_invoke_stub_internal+64)
2019-12-02 11:27:59.040 6940-6940/? A/DEBUG: #27 pc 00405389 /system/lib/libart.so (art_quick_invoke_static_stub+228)
2019-12-02 11:27:59.040 6940-6940/? A/DEBUG: #28 pc 000b0c7f /system/lib/libart.so (_ZN3art9ArtMethod6InvokeEPNS_6ThreadEPjjPNS_6JValueEPKc+178)
2019-12-02 11:27:59.040 6940-6940/? A/DEBUG: #29 pc 00315e81 /system/lib/libart.so (_ZN3artL18InvokeWithArgArrayERKNS_33ScopedObjectAccessAlreadyRunnableEPNS_9ArtMethodEPNS_8ArgArrayEPNS_6JValueEPKc+56)
2019-12-02 11:27:59.040 6940-6940/? A/DEBUG: #30 pc 00317213 /system/lib/libart.so (_ZN3art12InvokeMethodERKNS_33ScopedObjectAccessAlreadyRunnableEP8_jobjectS4_S4_j+766)
2019-12-02 11:27:59.040 6940-6940/? A/DEBUG: #31 pc 002bd4ed /system/lib/libart.so (ZN3artL13Method_invokeEP7_JNIEnvP8_jobjectS3_S3+40)
2019-12-02 11:27:59.040 6940-6940/? A/DEBUG: #32 pc 005aed49 /system/framework/arm/boot.oat (offset 0x51b000) (java.lang.reflect.Method.invoke+116)
2019-12-02 11:27:59.040 6940-6940/? A/DEBUG: #33 pc 020d5df1 /system/framework/arm/boot-framework.oat (offset 0x15b6000) (com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run+100)
2019-12-02 11:27:59.040 6940-6940/? A/DEBUG: #34 pc 020d6dcb /system/framework/arm/boot-framework.oat (offset 0x15b6000) (com.android.internal.os.ZygoteInit.main+1534)
2019-12-02 11:27:59.040 6940-6940/? A/DEBUG: #35 pc 000a99c1 /system/lib/libart.so (art_quick_invoke_stub_internal+64)
2019-12-02 11:27:59.040 6940-6940/? A/DEBUG: #36 pc 00405389 /system/lib/libart.so (art_quick_invoke_static_stub+228)
2019-12-02 11:27:59.040 6940-6940/? A/DEBUG: #37 pc 000b0c7f /system/lib/libart.so (_ZN3art9ArtMethod6InvokeEPNS_6ThreadEPjjPNS_6JValueEPKc+178)
2019-12-02 11:27:59.040 6940-6940/? A/DEBUG: #38 pc 00315e81 /system/lib/libart.so (_ZN3artL18InvokeWithArgArrayERKNS_33ScopedObjectAccessAlreadyRunnableEPNS_9ArtMethodEPNS_8ArgArrayEPNS_6JValueEPKc+56)
2019-12-02 11:27:59.040 6940-6940/? A/DEBUG: #39 pc 00315c93 /system/lib/libart.so (_ZN3art17InvokeWithVarArgsERKNS_33ScopedObjectAccessAlreadyRunnableEP8_jobjectP10_jmethodIDSt9__va_list+266)
2019-12-02 11:27:59.040 6940-6940/? A/DEBUG: #40 pc 00277b97 /system/lib/libart.so (_ZN3art3JNI21CallStaticVoidMethodVEP7_JNIEnvP7_jclassP10_jmethodIDSt9__va_list+426)
2019-12-02 11:27:59.040 6940-6940/? A/DEBUG: #41 pc 00066665 /system/lib/libandroid_runtime.so
2019-12-02 11:27:59.040 6940-6940/? A/DEBUG: #42 pc 00067f37 /system/lib/libandroid_runtime.so (_ZN7android14AndroidRuntime5startEPKcRKNS_6VectorINS_7String8EEEb+498)
2019-12-02 11:27:59.040 6940-6940/? A/DEBUG: #43 pc 000018fd /system/bin/app_process32
2019-12-02 11:27:59.040 6940-6940/? A/DEBUG: #44 pc 00016c4d /system/lib/libc.so (__libc_init+48)
2019-12-02 11:27:59.040 6940-6940/? A/DEBUG: #45 pc 0000153c /system/bin/app_process32

Android 10 录音失败

在Android 9或以下的设备录音没有问题,在Android 10上录音会提示录音失败

setRecordFftDataListener不回调

我在录音的时候出现不回调,看来下你的源码,发现setRecordFftDataListener不回调的原因是
recordManager.setRecordDataListener(data -> {
Log.e("TAG", "data长度:" + data.length);
Log.e("TAG", "data::" + getFloat(data));
});
长度都是640 没有大于某个值就不回调,我再看了下返回的byte数组 全是-127之类的 基本没啥变化,是我使用的方式不对么?因为我需要用到音频的数据,所以把你这些监听全打印出来,但是好想数据是有问题的。

stop方法调用问题

感谢您的分享,我在测试的时候发现stop方法在调用的时候需要在pause的状态下才能执行,不然线程中会一直打印日志,所以建议在调用stop方法之前,先调用pause方法

安卓10录音崩溃

Unable to start service com.zlw.main.recorderlib.recorder.RecordService@a0c6921 with Intent { cmp=com.lovol.njgj/com.zlw.main.recorderlib.recorder.RecordService (has extras) }: java.lang.NullPointerException
是service启动在安卓10的适配问题?

采集的音量db数太少。

测试了一下,获取10个竟然需要700多毫秒,这样的话想做一个波形图很不平滑,有没有办法在同样的时间采集到更多的db数呢?

java.lang.OutOfMemoryError

1 java.lang.Object.internalClone(Native Method)

2 java.lang.Object.clone(Object.java:229)
3 com.zlw.main.recorderlib.recorder.mp3.a$a.(Mp3EncodeThread.java:140)
4 com.zlw.main.recorderlib.recorder.b$a.b(RecordHelper.java:334)
5 com.zlw.main.recorderlib.recorder.b$a.run(RecordHelper.java:273)

感谢您的分享,采用您的方式做mp3转码,后来发现在Mp3EncodeThread类的140行ChangeBuffer构造方法传值过程中采用了clone方法,导致一个多小时后内存到了500多M,现在是把clone去掉了

我有初始化,但是还是报错初始化失败

1, RecordManager.getInstance().init(ChatApplication.appLication,true)

2,RecordManager.getInstance().start()

RecordHelper$AudioRecordThread.startPcmRecorder(RecordHelper.java:305)===============> startRecording() called on an uninitialized AudioRecord.
java.lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord.
at android.media.AudioRecord.startRecording(AudioRecord.java:1110)
at com.zlw.main.recorderlib.recorder.RecordHelper$AudioRecordThread.startPcmRecorder(RecordHelper.java:288)
at com.zlw.main.recorderlib.recorder.RecordHelper$AudioRecordThread.run(RecordHelper.java:276)

提升码率

首先 大佬的库很不错 下载了看了下 封装的也可以
想问下 pcm转MP3的时候 MP3的码率只有20多 我想提升到100多 应该怎么办 呢

实时音量不准确吧???

RecordManager.getInstance().setRecordSoundSizeListener(new RecordSoundSizeListener() {
    @Override
    public void onSoundSize(int soundSize) {
    }
});

音量一直是在50-70之间徘徊。不管是一点声音都没有,还是声音很大,曲线都一样。

急急急!!路过的大佬进来帮看看 跪谢跪谢..

各位大佬 我遇到这个问题 删除录音文件 上一段录音还存在

需求:有一个重置按钮 在录音中可以取消录音

然后我点击这个按钮 我去掉了.stop方法 log显示我 mp3EncodeThread is null, 代码业务流程有误,请检查!!这个错误是我没有进行初始化吗 但是我的日志是有初始化的阿
如果正常保存不会出现这个问题 错误

我看到有一个小伙伴提的问题和我这个差不多 我尝试了你说的 RecordManager.getInstance().stop();然后删除本地文件 我尝试了 没有作用的

这个是会缓存在内存中吗?如果缓存在内存中 是要清理内存吗

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.