Skip to content

Commit

Permalink
📝 MediaRecorder.MD
Browse files Browse the repository at this point in the history
  • Loading branch information
SheTieJun committed Mar 22, 2024
1 parent 3e743f6 commit 1e55830
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 4 deletions.
60 changes: 60 additions & 0 deletions MediaRecorder.MD
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
## MediaRecorder介绍

我自己做过录音功能,用的AudioRecord,因为以前MediaRecorder不支持暂停和恢复录制,现在MediaRecorder也支持暂停和恢复录制了,部分场景下使用MediaRecorder更加方便。

当然AudioRecord也有自己的优势,录制过程可以处理PCM,可以做混音,降噪等等。

现在Android版本分布在7.0以上占96%,8.0以上占93%,所以我们可以放心的使用MediaRecorder。~前提是你说法产品,哈哈

## 方法介绍

1. `setAudioSource(int audioSource)`: 设置音频源,例如麦克风。

2. `setOutputFormat(int output_format)`: 设置输出文件的格式,例如MPEG_4。

3. `setAudioEncoder(int audio_encoder)`: 设置音频文件的编码。

4. `setOutputFile(String path)`: 设置输出文件的路径。

5. `prepare()`: 准备录制器开始捕获和编码数据。这个方法必须在设置了音频和视频源、编码器、文件格式等之后,但在`start()`之前调用。

6. `start()`: 开始录制。在`prepare()`之后调用。

7. `pause()`: 暂停录制。在Android 7.0(API级别24)及更高版本中可用。调用此方法后,可以通过调用`resume()`方法来恢复录制。

8. `resume()`: 恢复录制。在Android 7.0(API级别24)及更高版本中可用。在调用`pause()`方法后,可以调用此方法来恢复录制。

9. `stop()`: 停止录制。在`start()`之后调用。一旦录制停止,你将必须重新配置它,就像它刚刚被构造一样。

10. `reset()`: 重置MediaRecorder到其空闲状态。调用此方法后,你将必须再次配置它,就像它刚刚被构造一样。

11. `release()`: 释放与此MediaRecorder对象关联的资源。当你完成使用MediaRecorder时,调用此方法是个好习惯。

12. `getMaxAmplitude()`: 返回自上次调用此方法以来采样的最大绝对振幅。只有在设置了音频源之后才调用此方法。

13. `setMaxDuration(int max_duration_ms)`: 设置最大录制时长,单位为毫秒。如果设置了这个值,当录制时间达到这个值时,MediaRecorder会自动停止,并发送一个`MEDIA_RECORDER_INFO_MAX_DURATION_REACHED`的消息。在你的代码中,`setMaxDuration(1000 * 60 * 60 * 24)`设置了最大录制时长为24小时。

14. `setVideoSource(int videoSource)`: 设置视频源,例如摄像头。

15. `setVideoEncoder(int video_encoder)`: 设置视频文件的编码。

16. `setVideoSize(int width, int height)`: 设置视频的宽度和高度。

17. `setVideoFrameRate(int rate)`: 设置视频的帧率。

18. `setOrientationHint(int degrees)`: 设置输出视频的旋转角度。

19. `setLocation(float latitude, float longitude)`: 设置录制的地理位置。

20. `setPreviewDisplay(Surface sv)`: 设置用于显示预览的Surface。

21. `setNextOutputFile(File file)`: 在Android 8.0(API级别26)及更高版本中可用。设置下一个输出文件,当当前输出文件达到最大大小或最大持续时间时,录制将继续到下一个文件。

22. `getMetrics()`: 返回一个包含有关底层媒体框架的度量的PersistableBundle。这些度量可以用于了解录制会话的性能和资源使用情况。

23. `setMaxFileSize(long max_filesize_bytes)`:用于设置输出文件的最大大小,单位为字节。如果设置了这个值,当录制的文件大小达到这个值时,`MediaRecorder`会自动停止,并发送一个`MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED`的消息。


## 总结
1. 7.0之后的版本,`pause()``resume()`方法可以用来暂停和恢复录制。
2. 8.0之后的版本,`setNextOutputFile(File file)`方法可以在当前输出文件达到最大大小或最大持续时间时,录制将继续到下一个文件。应用场景:每60秒发送一个音频。
1 change: 1 addition & 0 deletions README.MD
Original file line number Diff line number Diff line change
Expand Up @@ -219,4 +219,5 @@ abstract class BaseRecorder {
### 1. [Old version](https://github.com/SheTieJun/Mp3Recorder/tree/master_copy)
### 2. [Update_log](https://github.com/SheTieJun/Mp3Recorder/wiki/%E6%9B%B4%E6%96%B0%E6%97%A5%E5%BF%97)
### 3. [License](https://github.com/SheTieJun/Mp3Recorder/blob/master/LICENSE)
### 4. [MediaRecorder介绍](MediaRecorder.MD):部分场景下使用MediaRecorder更加方便。

Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@
package me.shetj.mp3recorder.record.utils

import android.media.MediaRecorder
import android.os.Build
import me.shetj.base.BaseKit
import me.shetj.base.tools.file.EnvironmentStorage
import java.io.File

object MediaRecorderKit {

Expand All @@ -14,7 +17,11 @@ object MediaRecorderKit {
// 开始录音
/* ①Initial:实例化MediaRecorder对象 */
if (mMediaRecorder == null){
mMediaRecorder = MediaRecorder()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
mMediaRecorder = MediaRecorder(BaseKit.app)
}else{
mMediaRecorder = MediaRecorder()
}
}
try {
/* ②setAudioSource/setVedioSource */
Expand All @@ -27,9 +34,23 @@ object MediaRecorderKit {
mMediaRecorder!!.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
/* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */
mMediaRecorder!!.setAudioEncoder(MediaRecorder.AudioEncoder.AAC)
/**
* 采样频率越高, 声音越接近原始数据。
* 采样位数越高,声音越接近原始数据。
* 比特率越高,传送的数据越大,音质越好
*/
mMediaRecorder!!.setAudioEncodingBitRate(128) // 设置比特率
mMediaRecorder!!.setAudioChannels(2) // 设置双声道
mMediaRecorder!!.setAudioSamplingRate(44100) // 设置采样率
mMediaRecorder!!.setMaxDuration(1000 * 60 * 60 * 24) // 设置最大录音时长
mMediaRecorder!!.setMaxFileSize(10*1024*1024)
savePath = EnvironmentStorage.getPath(packagePath = "record") + "/" + System.currentTimeMillis() + ".m4a"
/* ③准备 */
mMediaRecorder!!.setOutputFile(savePath)
val nextSavePath = File(EnvironmentStorage.getPath(packagePath = "record") + "/" + System.currentTimeMillis() + ".m4a")
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
mMediaRecorder!!.setNextOutputFile(nextSavePath)
}
/* ③准备 */
mMediaRecorder!!.prepare()
/* ④开始 */
mMediaRecorder!!.start()
Expand All @@ -38,6 +59,18 @@ object MediaRecorderKit {
}
}

fun pause(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
mMediaRecorder?.pause()
}
}

fun resume(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
mMediaRecorder?.resume()
}
}


fun stopRecord() {
if (mMediaRecorder == null){
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

package me.shetj.recorder.core

import android.media.MediaRecorder
Expand Down Expand Up @@ -30,7 +29,7 @@ data class Mp3Option(
// 回调
var recordListener: RecordListener? = null,
// pcm 回调
var pcmListener: PCMListener?=null,
var pcmListener: PCMListener? = null,
)

fun recorder(block: Mp3Option.() -> Unit): Mp3Option {
Expand Down

0 comments on commit 1e55830

Please sign in to comment.