android AudioRecord

AudioRecord是Android中用于音频录制的类,它的主要作用是捕获来自设备麦克风或其他音频源的音频数据,并将其保存为PCM格式的音频流,以供后续处理或存储。

以下是关于AudioRecord的一些常见用途和基本使用方法:

作用和用途:

音频录制:AudioRecord可以用于录制来自麦克风、耳机麦克风或其他音频输入源的音频。这在开发语音通话、语音识别、音频笔记、音频流媒体等应用中非常有用。

声音分析:通过捕获音频数据,你可以进行声音分析,如检测音频的频谱、音量、音调等特征,用于声音处理和分析应用。

实时音频处理:你可以将录制的音频数据传递给其他音频处理库或自定义算法,以进行实时音频处理,如降噪、回声消除、音频效果等。

音频存储:你可以将录制的音频数据保存为音频文件,例如.wav或.mp3,以便后续播放或分享。

需要权限:

复制代码
<uses-permission android:name="android.permission.RECORD_AUDIO"/>

工具类:

java 复制代码
package com.realtop.translatemodule.utils;

import android.annotation.SuppressLint;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.util.Log;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.security.auth.login.LoginException;

public class AudioRecordUtils {

    private static final String TAG = "AudioRecordActivity";
    private static final int SAMPLE_RATE = 16000; // 采样率为16K
    private static final int CHANNEL_CONFIG = AudioFormat.CHANNEL_IN_MONO;
    private static final int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
    private static final int BUFFER_SIZE = AudioRecord.getMinBufferSize(SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT);
    private AudioRecord audioRecord;
    private boolean isRecording = false;
    private Thread recordingThread;
    private FileOutputStream fileOutputStream;

    @SuppressLint("MissingPermission")
    public synchronized void startRecording(String filePath) {
        if (isRecording) {
            Log.i(TAG, "startRecording: ing stop enter");
            return;
        }
        isRecording = true;
        // 初始化 AudioRecord 对象
        audioRecord = new AudioRecord(
                MediaRecorder.AudioSource.VOICE_COMMUNICATION,
                SAMPLE_RATE,
                CHANNEL_CONFIG,
                AUDIO_FORMAT,
                BUFFER_SIZE
        );

        audioRecord.startRecording();

        // 初始化输出文件
        try {
            fileOutputStream = new FileOutputStream(filePath, true);
        } catch (FileNotFoundException e) {
            Log.i(TAG, "startRecording: error:" + e.getMessage());
        }

        recordingThread = new Thread(() -> {
            byte[] buffer = new byte[BUFFER_SIZE];
            while (isRecording) {
                int bytesRead = audioRecord.read(buffer, 0, BUFFER_SIZE);
                if (bytesRead != AudioRecord.ERROR_INVALID_OPERATION) {
                    try {
                        fileOutputStream.write(buffer, 0, bytesRead);
                    } catch (IOException e) {
                        Log.i(TAG, "startRecording: error:" + e.getMessage());
                    }
                }
            }
            Log.i(TAG, "startRecording: record thread end");
        });
        recordingThread.start();
        Log.i(TAG, "startRecording: start");
    }


    public synchronized void stopRecording() {
        if (!isRecording) {
            Log.i(TAG, "stopRecording: end ing");
            return;
        }
        isRecording = false;
        try {
            recordingThread.join(); // 精华部分
            audioRecord.stop();
            fileOutputStream.close();
            audioRecord.release();
            Log.i(TAG, "stopRecording: end");
        } catch (Exception e) {
            e.printStackTrace();
            Log.i(TAG, "stopRecording: error:" + e.getMessage());
        }
    }

}
相关推荐
何盖(何松影)4 小时前
Android T startingwindow使用总结
android
小李飞飞砖5 小时前
Android 依赖注入框架详解
android
SUNxuetian5 小时前
【Android Studio】升级AGP-8.6.1,Find Usage对Method失效的处理方法!
android·ide·gradle·android studio·安卓
阿华的代码王国6 小时前
【Android】搭配安卓环境及设备连接
android·java
__water6 小时前
RHA《Unity兼容AndroidStudio打Apk包》
android·unity·jdk·游戏引擎·sdk·打包·androidstudio
一起搞IT吧9 小时前
相机Camera日志实例分析之五:相机Camx【萌拍闪光灯后置拍照】单帧流程日志详解
android·图像处理·数码相机
浩浩乎@9 小时前
【openGLES】安卓端EGL的使用
android
Kotlin上海用户组10 小时前
Koin vs. Hilt——最流行的 Android DI 框架全方位对比
android·架构·kotlin
zzq199611 小时前
Android framework 开发者模式下,如何修改动画过度模式
android
木叶丸11 小时前
Flutter 生命周期完全指南
android·flutter·ios