Skip to content
Maybe the most robust Android Audio encapsulation library, with partial Rx support.
Java C CMake
Branch: master
Clone or download

Latest commit

aneeskodappana and Piasy Update (#60)
compile to implementation
Latest commit ed38192 Jan 2, 2019


Type Name Latest commit message Commit time
Failed to load latest commit information.
AudioProcessor update build.gradle Aug 22, 2018
app Migrating to Androidx (#59) Nov 27, 2018
gradle publish v1.6.0 Nov 27, 2018
rxandroidaudio Migrating to Androidx (#59) Nov 27, 2018
.gitignore add AudioProcessor Dec 13, 2016
.travis.yml update travis config Aug 22, 2018 update change log Nov 27, 2018
LICENSE Initial commit Feb 23, 2016 Update (#60) Jan 2, 2019
build.gradle Migrating to Androidx (#59) Nov 27, 2018
gradlew record & play OK; need handle permission Feb 23, 2016
gradlew.bat record & play OK; need handle permission Feb 23, 2016
logotype primary.png Add new logo May 27, 2018
settings.gradle add AudioProcessor Dec 13, 2016


Android Audio encapsulation library, with part Rx support.

Download Build Status


About lambda support

This library use lambda expression, since, there is native support for lambda, so I use it instead of jack support or RetroLambda, if you have lambda issue during build, please upgrade your gradle-android into 2.4.0+, or use 1.5.1 of this library, thanks!

Add to gradle dependency of your module build.gradle

allprojects {
    repositories {
        maven {
            url  ""

dependencies {
    implementation 'com.github.piasy:rxandroidaudio:1.6.0'
    implementation 'com.github.piasy:AudioProcessor:1.6.0'

Use in code

Record to file

mAudioRecorder = AudioRecorder.getInstance();
mAudioFile = new File(
        Environment.getExternalStorageDirectory().getAbsolutePath() +
                File.separator + System.nanoTime() + ".file.m4a");
        MediaRecorder.OutputFormat.MPEG_4, MediaRecorder.AudioEncoder.AAC,
// ...

Note: If you record a aac file, the sound quality will be poor if the sample rate and encoding bit rate is low, the sound quality will increase when you set a bigger sample rate and encoding bit rate, but as the sound quality improve, the recorded file size will also increase.

Play a file

With PlayConfig, to set audio file or audio resource, set volume, or looping:
        .subscribe(new Observer<Boolean>() {
               public void onSubscribe(final Disposable disposable) {


               public void onNext(final Boolean aBoolean) {
                    // prepared

               public void onError(final Throwable throwable) {


               public void onComplete() {
                    // play finished
                    // NOTE: if looping, the Observable will never finish, you need stop playing
                    // onDestroy, otherwise, memory leak will happen!

Full example of PlayConfig

PlayConfig.file(audioFile) // play a local file
    //.res(getApplicationContext(), R.raw.audio_record_end) // or play a raw resource
    .looping(true) // loop or not
    .leftVolume(1.0F) // left volume
    .rightVolume(1.0F) // right volume
    .build(); // build this config and play!

Record a stream

mOutputFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +
        File.separator + System.nanoTime() + ".stream.m4a");
mFileOutputStream = new FileOutputStream(mOutputFile);
mStreamAudioRecorder.start(new StreamAudioRecorder.AudioDataCallback() {
    public void onAudioData(byte[] data, int size) {
        if (mFileOutputStream != null) {
            try {
                mFileOutputStream.write(data, 0, size);
            } catch (IOException e) {

    public void onError() { Runnable() {
            public void run() {
                Toast.makeText(getApplicationContext(), "Record fail",
                mIsRecording = false;

Play a stream

Observable.just(mOutputFile).subscribeOn( Action1<File>() {
    public void call(File file) {
        try {
            FileInputStream inputStream = new FileInputStream(file);
            int read;
            while ((read = > 0) {
      , read);
        } catch (IOException e) {

Change the sound effect in stream mode
    mAudioProcessor.process(mRatio, mBuffer, StreamAudioRecorder.DEFAULT_SAMPLE_RATE),

See full example for more details.

Download demo apk.

Contribution are welcome

You can’t perform that action at this time.