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());
        }
    }

}
相关推荐
独隅11 小时前
Claude API 实战教程:从入门到完整项目
android·java·数据库·claude·claude code
且随疾风前行.15 小时前
Paint Cavans高级绘制:[一]Paint画笔高级应用
android·ui
郑州光合科技余经理17 小时前
同城小程序开发:同一笔单在用户端和商家端各显示到哪
android·java·开发语言·前端·后端·uni-app·php
pigdreams18 小时前
Google 官方 Android CLI:让AI直接读布局结构而不是用adb截图验证
android·人工智能·adb
hunterandroid21 小时前
[Android 从零到一] Glide 图片加载原理:三级缓存、生命周期绑定与内存优化
android
法的空间21 小时前
AI 编程时代,为什么 Dart 分析会拖慢大型项目的开发
android·flutter·ios
鱼儿也有烦恼21 小时前
客户端应用架构模式
android·架构
独隅1 天前
Claude 高效应用实战指南
android·java·开发语言·claude·claude code
硅基手札1 天前
Android 系统全景专栏 00 · 总目录
android·操作系统·嵌入式开发
YB13751 天前
Jetpack Compose 动画Crossfade
android