android AudioRecord

2023-09-16 10:50:17

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

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

作用和用途:

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

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

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

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

需要权限:

<uses-permission android:name="android.permission.RECORD_AUDIO"/>

工具类:

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

}

更多推荐

第8章 MySQL的数据目录

8.1数据库和文件系统的关系像InnoDB、MyISAM这样的存储引擎都是把表存储在磁盘上的,而操作系统用来管理磁盘的又被称为文件系统,所以用专业一点的话来表述就是:像InnoDB、MyISAM这样的存储引擎都是把表存储在文件系统上的。当我们想读取数据的时候,这些存储引擎会从文件系统中把数据读出来返回给我们,当我们想写

公私钥非对称加密 生成和验证JSON Web Token (JWT)

前言这是我在这个网站整理的笔记,关注我,接下来还会持续更新。作者:神的孩子都在歌唱公私钥非对称加密生成和验证JSONWebToken什么是JSONWebToken(JWT)Java程序中生成和验证JWT代码解析什么是JSONWebToken(JWT)JSONWebToken(JWT)是一种轻量级的身份验证和授权机制,由

【Linux 之二】Ubuntu下开发环境的搭建(NFS \ SSH \ FTP \ Smba \ ...)

目前正在进行Linux相关项目的开发,而我的Linux开发是在Ubuntu(版本20.04)下进行的,为此需要搭建很多Linux相关的开发环境,方便工作的进行。这里主要是对各种开发环境的搭建做一个总结记录,方便后面查阅,也方便在Linux开发之路上遇到困难的各位同仁。好了,废话不多说,直接罗列各种开发环境的安装步骤等。

Java 多线程

目录线程相关概念线程基本使用1.继承Thread类,重写run方法示例代码程序示意图2.实现Runnable接口,重写run方法示例代码*应用案例代码理解3.继承Threadvs实现Runnable的区别4.多线程售票问题引出同步互斥问题5.线程终止代码示意图线程常用方法第一组示例代码第二组示例代码用户线程和守护线程示

Google Guava精讲(一)-Guava是什么?能做什么?

https://mvnrepository.com/artifact/com.google.guava/guava作为Java栈的测试工程师,在写代码时候会频繁遇到字符串处理、缓存、反射等问题,我们最常规的做法就是,为了使原生的JDK方法好用,通常是做了一层又一层封装,然后提供整个测试团队使用,而渐渐的就形成了自己的J

什么是葡萄酒结构,结构型葡萄酒好吗?

葡萄酒爱好者使用许多复杂的术语来描述葡萄酒的味道,有些是不言自明的,有些则有点模糊。如果你不是葡萄酒专家,你可能很难理解这个葡萄酒术语的全部含义。其中一个术语是葡萄酒结构,那么葡萄酒结构是什么意思呢?而结构酒是好东西吗?葡萄酒的结构是指葡萄酒的主要特征之间的相互作用,包括酒体、酒精度、酸度、单宁和甜度,葡萄酒的结构决定

73、SpringBoot 直接整合 JDBC

★SpringBoot可直接整合JDBC来操作数据库——很少这么干,这么干就意味着使用最原始的方式来操作数据库。对于对于极小的项目,直接整合JDBC无需添加JPA、Hibernate等ORM框架。★JdbcTemplate为项目添加spring-boot-starter-jdbc.jar依赖(注意没有data)。——这

CTF--攻防世界-杂项入门第一课

这是第一次接触杂项这个方向,所以就是根据writeup解的题,没有什么自己的思路,只是写一篇文章来记录一下解题过程。下载题目后拿到一张图片,确实挺迷惑的,不知从何下手,根据大家的思路都是看看有没有隐写,这里就需要用到一个很好用的工具--StegSolve这里就穿插一下这个工具的下载以及安装http://www.caes

MySQL进阶—从零到入土

1.存储引擎1).建表时指定存储引擎CREATETABLE表名(字段1字段1类型[COMMENT字段1注释],......字段n字段n类型[COMMENT字段n注释])ENGINE=INNODB[COMMENT表注释];2).查询当前数据库支持的存储引擎showengines;A.查询建表语句---默认存储引擎:Inn

设计模式:状态模式(C++实现)

状态模式(StatePattern)是一种行为设计模式,它允许对象在内部状态改变时改变其行为。状态模式将对象的行为封装在不同的状态类中,使得状态的切换对于对象来说是透明的。下面是一个简单的C++状态模式的示例:#include<iostream>//抽象状态类classState{public:virtualvoidh

Flink--4、DateStream API(执行环境、源算子、基本转换算子)

星光下的赶路人star的个人主页注意力的集中,意象的孤立绝缘,便是美感的态度的最大特点文章目录1、DataStreamAPI1.1执行环境(ExecutionEnvironment)1.1.1创建执行环境1.2执行模式(ExecutionMode)1.3触发程序执行2、源算子(Source)2.1准备工作2.2从集合中

热文推荐