# Test114 **Repository Path**: baixiaohe/test114 ## Basic Information - **Project Name**: Test114 - **Description**: Test114 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2021-01-18 - **Last Updated**: 2021-08-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # RxHarmonyAudio logo Adaptation of RxAndroidAudio(https://github.com/Piasy/RxAndroidAudio) to Harmony OS.An Audio encapsulation library, with part Rx support. 本项目是基于开源项目Piasy/RxAndroidAudio进行鸿蒙化的移植和开发的,可以通过地址https://github.com/Piasy/RxAndroidAudio 追踪到原安卓项目版本。 ## 项目介绍 ## (Project Introduce) ### 项目名称(Project Name:):RxHarmonyAudio ### 功能:(Functions:) 1. 实现音频文件录制和播放 (1.record and play audio file) 2. 实现音频流文件录制和播放 (2.record and play audio stream file) 3. 变声播放录音文件 (3.voice changing play) ### 项目移植状态:(project complete status:) 1. 主要功能已经移植; (1.mainly functions completed) 2. 测试Demo可以正常使用; (2.Demo for test can be use) ### 项目作者和维护人:TS ### 编程语言:java ## 使用说明(How to use:) 1. 下载或自行编译生成RxHarmonyAudio的.har文件,文件路径为:entry/libs/rxharmonyaudio.har。 (1.Download or compile RxHarmonyAudio.har file yourself,the sample har file location:entry/libs/rxharmonyaudio.har.) 2. 自行编译时,需要注意要自行添加签名。 (2.You should pay attention to add the Signature file to project structure when you compile the project your self.) 3. 导入你的OHOS项目模块的**./libs**中。 (3.import your OHOS projct module to **./libs** of your project.) 4. 在模块下的**build.gradle**中确认依赖**./libs**下的.har包,``implementation fileTree(dir: 'libs', include: ['*.jar', '*.har'])``。 (4.add ``implementation fileTree(dir: 'libs', include: ['*.jar', '*.har'])`` into **build.gradle** of the moudle you perfer.) 5. 在代码中使用。 (5.use the classes providered with the Har.) ## 代码使用(Usage) #### 录制音频文件(Record to file) audio file capture ```java mAudioRecorder = AudioRecorder.getInstance(); mAudioFile = new File( Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + System.nanoTime() + ".file.m4a"); Source source = new Source(); source.setRecorderAudioSource(Recorder.AudioSource.MIC); AudioProperty audioProperty = new AudioProperty.Builder() .setRecorderSamplingRate(AUDIO_SAMPLE_RATE_HZ) .setRecorderBitRate(AUDIO_BIT_RATE_HZ) .setRecorderAudioEncoder(Recorder.AudioEncoder.AAC) .build(); StorageProperty storageProperty = new StorageProperty.Builder() .setRecorderFile(mAudioFile) .setRecorderMaxDurationMs(-1) .setRecorderMaxFileSizeBytes(-1) .build(); mAudioRecorder.prepareRecord(source, Recorder.OutputFormat.MPEG_4, audioProperty, storageProperty); mAudioRecorder.startRecord(); // ... mAudioRecorder.stopRecord(); ``` #### 播放音频文件(Play a file) Playconfig 中可以设置音频源,设置音量,或者播放循环: With PlayConfig, to set audio file or audio resource, set volume, or looping: audio file play ```java mRxAudioPlayer.play(PlayConfig.file(audioFile).looping(true).build()) .subscribeOn(Schedulers.io()) .observeOn(HarmonySchedulers.mainThread()) .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! } }); ``` #### PlayConfig 的完整示例(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,but harmony Player not support left volume and right volume separated. .rightVolume(1.0F) // right volume,but harmony Player not support left volume and right volume separated. .build(); // build this config and play! ``` #### 录制音频流文件 (Record a stream) audio stream capture ```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(final byte[] data,final int size) { if (mFileOutputStream != null) { try { mFileOutputStream.write(data, 0, size); } catch (IOException e) { e.printStackTrace(); } } } @Override public void onError() { new EventHandler(EventRunner.getMainEventRunner()).postSyncTask(new Runnable() { @Override public void run() { new ToastDialog(StreamAbility.this).setText("Record fail").setDuration(DIALOG_DURATION).show(); mBtnStart.setText("Start"); mIsRecording = false; } }); } }); ``` #### 播放音频流文件 (Play a stream) audio stream play ```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) audio stream changed play ``` java mStreamAudioPlayer.play( mAudioProcessor.process(mRatio, mBuffer, StreamAudioRecorder.DEFAULT_SAMPLE_RATE), read); ``` ## 欢迎提交修改意见(Contribution are welcome) https://gitee.com/ts_ohos/RxHarmonyAudio/pulls