Android Audio encapsulation library, with part Rx support.
This library use lambda expression, since com.android.tools.build:gradle:2.4.0, 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!
allprojects {
repositories {
mavenCentral()
}
}
dependencies {
implementation 'com.github.piasy:rxandroidaudio:1.7.0'
implementation 'com.github.piasy:AudioProcessor:1.7.0'
}mAudioRecorder = AudioRecorder.getInstance();
mAudioFile = newFile(
Environment.getExternalStorageDirectory().getAbsolutePath() +
File.separator + System.nanoTime() + ".file.m4a");
mAudioRecorder.prepareRecord(MediaRecorder.AudioSource.MIC,
MediaRecorder.OutputFormat.MPEG_4, MediaRecorder.AudioEncoder.AAC,
mAudioFile);
mAudioRecorder.startRecord();
// ...mAudioRecorder.stopRecord();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.
With PlayConfig, to set audio file or audio resource, set volume, or looping:
mRxAudioPlayer.play(PlayConfig.file(audioFile).looping(true).build())
.subscribeOn(Schedulers.io())
.subscribe(newObserver<Boolean>() {
@OverridepublicvoidonSubscribe(finalDisposabledisposable) {
}
@OverridepublicvoidonNext(finalBooleanaBoolean) {
// prepared
}
@OverridepublicvoidonError(finalThrowablethrowable) {
}
@OverridepublicvoidonComplete() {
// play finished// NOTE: if looping, the Observable will never finish, you need stop playing// onDestroy, otherwise, memory leak will happen!
}
});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!mOutputFile = newFile(Environment.getExternalStorageDirectory().getAbsolutePath() +
File.separator + System.nanoTime() + ".stream.m4a");
mOutputFile.createNewFile();
mFileOutputStream = newFileOutputStream(mOutputFile);
mStreamAudioRecorder.start(newStreamAudioRecorder.AudioDataCallback() {
@OverridepublicvoidonAudioData(byte[] data, intsize) {
if (mFileOutputStream != null) {
try {
mFileOutputStream.write(data, 0, size);
} catch (IOExceptione) {
e.printStackTrace();
}
}
}
@OverridepublicvoidonError() {
mBtnStart.post(newRunnable() {
@Overridepublicvoidrun() {
Toast.makeText(getApplicationContext(), "Record fail",
Toast.LENGTH_SHORT).show();
mBtnStart.setText("Start");
mIsRecording = false;
}
});
}
});Observable.just(mOutputFile).subscribeOn(Schedulers.io()).subscribe(newAction1<File>() {
@Overridepublicvoidcall(Filefile) {
try {
mStreamAudioPlayer.init();
FileInputStreaminputStream = newFileInputStream(file);
intread;
while ((read = inputStream.read(mBuffer)) > 0) {
mStreamAudioPlayer.play(mBuffer, read);
}
inputStream.close();
mStreamAudioPlayer.release();
} catch (IOExceptione) {
e.printStackTrace();
}
}
});mStreamAudioPlayer.play(
mAudioProcessor.process(mRatio, mBuffer, StreamAudioRecorder.DEFAULT_SAMPLE_RATE),
len);See full example for more details.
- Please follow my code style based on SquareAndroid
