https://github.com/piasy/rxandroidaudio
Maybe the most robust Android Audio encapsulation library, with partial Rx support.
https://github.com/piasy/rxandroidaudio
Last synced: about 1 year ago
JSON representation
Maybe the most robust Android Audio encapsulation library, with partial Rx support.
- Host: GitHub
- URL: https://github.com/piasy/rxandroidaudio
- Owner: Piasy
- License: mit
- Created: 2016-02-23T08:01:58.000Z (over 10 years ago)
- Default Branch: master
- Last Pushed: 2021-05-05T02:20:53.000Z (about 5 years ago)
- Last Synced: 2025-04-07T21:13:53.950Z (about 1 year ago)
- Language: Java
- Homepage: http://blog.piasy.com/2016/02/24/Robust-Android-Audio-encapsulation/
- Size: 343 KB
- Stars: 1,567
- Watchers: 51
- Forks: 233
- Open Issues: 11
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# RxAndroidAudio

Android Audio encapsulation library, with part Rx support.
[  ](https://bintray.com/piasy/maven/RxAndroidAudio/_latestVersion) [](https://travis-ci.org/Piasy/RxAndroidAudio)
## Usage
### About lambda 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!
### Add to gradle dependency of your module build.gradle
```gradle
allprojects {
repositories {
mavenCentral()
}
}
dependencies {
implementation 'com.github.piasy:rxandroidaudio:1.7.0'
implementation 'com.github.piasy:AudioProcessor:1.7.0'
}
```
### Use in code
#### Record to file
```java
mAudioRecorder = AudioRecorder.getInstance();
mAudioFile = new File(
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.
#### Play a file
With PlayConfig, to set audio file or audio resource, set volume, or looping:
```java
mRxAudioPlayer.play(PlayConfig.file(audioFile).looping(true).build())
.subscribeOn(Schedulers.io())
.subscribe(new Observer() {
@Override
public void onSubscribe(final Disposable disposable) {
}
@Override
public void onNext(final Boolean aBoolean) {
// prepared
}
@Override
public void onError(final Throwable throwable) {
}
@Override
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
```java
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
```java
mOutputFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +
File.separator + System.nanoTime() + ".stream.m4a");
mOutputFile.createNewFile();
mFileOutputStream = new FileOutputStream(mOutputFile);
mStreamAudioRecorder.start(new StreamAudioRecorder.AudioDataCallback() {
@Override
public void onAudioData(byte[] data, int size) {
if (mFileOutputStream != null) {
try {
mFileOutputStream.write(data, 0, size);
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void onError() {
mBtnStart.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "Record fail",
Toast.LENGTH_SHORT).show();
mBtnStart.setText("Start");
mIsRecording = false;
}
});
}
});
```
#### Play a stream
```java
Observable.just(mOutputFile).subscribeOn(Schedulers.io()).subscribe(new Action1() {
@Override
public void call(File file) {
try {
mStreamAudioPlayer.init();
FileInputStream inputStream = new FileInputStream(file);
int read;
while ((read = inputStream.read(mBuffer)) > 0) {
mStreamAudioPlayer.play(mBuffer, read);
}
inputStream.close();
mStreamAudioPlayer.release();
} catch (IOException e) {
e.printStackTrace();
}
}
});
```
#### Change the sound effect in stream mode
``` java
mStreamAudioPlayer.play(
mAudioProcessor.process(mRatio, mBuffer, StreamAudioRecorder.DEFAULT_SAMPLE_RATE),
len);
```
See [full example](https://github.com/Piasy/RxAndroidAudio/tree/master/app) for more details.
[Download demo apk](http://fir.im/RXA).
## Contribution are welcome
+ Please follow [my code style based on SquareAndroid](https://github.com/Piasy/java-code-styles)