Android录音API,如何高效使用并避免常见陷阱?

在Android开发中,录音功能的实现主要依赖于两个API:MediaRecorder和AudioRecord,这两个API各有特点,适用于不同的场景,以下是对这两个API的详细介绍以及使用示例代码。

Android录音API,如何高效使用并避免常见陷阱?

MediaRecorder

简介

功能集成:MediaRecorder已经集成了录音、编码、压缩等功能,使用起来相对简单。

音频格式:支持少量的录音音频格式,如AAC、AMR、3GP等。

优点:代码量小,易于实现基本的录音功能。

缺点:无法实时处理音频数据,输出的音频格式有限。

示例代码

Android录音API,如何高效使用并避免常见陷阱?

public class MediaRecordingUtils {
    private String filePath;
    private MediaRecorder mMediaRecorder;
    private final String TAG = "fan";
    public static final int MAX_LENGTH = 1000 * 60 * 200; // 最大录音时长,单位毫秒
    private OnAudioStatusUpdateListener audioStatusUpdateListener;
    public MediaRecordingUtils() {
    }
    public MediaRecordingUtils(String filePath) {
        this.filePath = filePath;
    }
    private long startTime;
    private long endTime;
    public void startRecord() {
        // 开始录音
        if (mMediaRecorder == null)
            mMediaRecorder = new MediaRecorder();
        try {
            mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 设置麦克风
            mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
            fileName = DateFormat.format("yyyyMMdd_HHmmss", Calendar.getInstance(Locale.CHINA)) + ".m4a";
            if (!FileUtils.isFolderExist(FileUtils.getFolderName(audioSaveDir))) {
                FileUtils.makeFolders(audioSaveDir);
            }
            filePath = audioSaveDir + fileName;
            mMediaRecorder.setOutputFile(filePath);
            mMediaRecorder.setMaxDuration(MAX_LENGTH);
            mMediaRecorder.prepare();
            mMediaRecorder.start();
            startTime = System.currentTimeMillis();
            updateMicStatus();
            Log.e(TAG, "startTime" + startTime);
        } catch (IllegalStateException | IOException e) {
            Log.i("call startAmr(File mRecAudioFile) failed!" + e.getMessage());
        }
    }
    public void stopRecord() {
        try {
            mMediaRecorder.stop();
            mMediaRecorder.release();
            mMediaRecorder = null;
            filePath = "";
        } catch (RuntimeException e) {
            Log.e(e.toString());
            mMediaRecorder.reset();
            mMediaRecorder.release();
            mMediaRecorder = null;
            File file = new File(filePath);
            if (file.exists())
                file.delete();
            filePath = "";
        }
    }
}

AudioRecord

简介

实时处理:AudioRecord主要用于实时处理音频数据,可以实现边录边播的功能。

数据格式:输出的是PCM语音数据,需要进一步编码和压缩才能保存为音频文件。

优点:灵活性高,可以实现复杂的音频处理功能。

缺点:使用较为复杂,需要手动处理音频数据的编码和压缩。

示例代码

Android录音API,如何高效使用并避免常见陷阱?

public class AudioRecordingUtils {
    private AudioRecord mAudioRecord;
    private boolean isRecording = false;
    private int sampleRateInHz = 44100; // 采样率
    private int channelConfig = AudioFormat.CHANNEL_IN_MONO; // 单声道输入
    private int audioFormat = AudioFormat.ENCODING_PCM_16BIT; // PCM 16位编码
    private int minBufferSize;
    private byte[] buffer;
    private String filePath;
    private FileOutputStream fos;
    public AudioRecordingUtils(String filePath) {
        this.filePath = filePath;
        minBufferSize = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);
        buffer = new byte[minBufferSize];
        mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRateInHz, channelConfig, audioFormat, minBufferSize, buffer);
        try {
            fos = new FileOutputStream(filePath);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
    public void startRecording() {
        mAudioRecord.startRecording();
        isRecording = true;
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (isRecording) {
                    int read = mAudioRecord.read(buffer, 0, buffer.length);
                    if (AudioRecord.ERROR_INVALID_OPERATION != read) {
                        try {
                            fos.write(buffer, 0, read);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }).start();
    }
    public void stopRecording() {
        isRecording = false;
        mAudioRecord.stop();
        try {
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

相关问题与解答栏目

问题1:如何在Android 10及以上版本中处理录音权限的变化?

:在Android 10(API级别29)及更高版本中,引入了新的隐私权限机制,包括“录音焦点”的概念,这意味着即使应用获得了录音权限,如果另一个应用正在使用麦克风,您的应用可能仍无法录音,为了处理这种情况,您可以使用AudioManager来查询当前是否有其他应用占用了录音焦点,并在适当的时候请求录音焦点。

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
if (audioManager.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN) == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
    // 获得录音焦点,可以开始录音
} else {
    // 未获得录音焦点,提示用户或等待
}

您需要在AndroidManifest.xml中声明相应的权限,并在运行时请求这些权限,还需要在res/xml/目录下创建一个permission_microphone.xml文件来描述所需的权限。

各位小伙伴们,我刚刚为大家分享了有关“android录音api”的知识,希望对你们有所帮助。如果您还有其他相关问题需要解决,欢迎随时提出哦!

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/625990.html

Like (0)
Donate 微信扫一扫 微信扫一扫
K-seo的头像K-seoSEO优化员
Previous 2024-11-03 05:01
Next 2024-11-03 05:12

相关推荐

  • 如何利用Audio API进行录音操作?

    Audio API 录音功能详解一、背景介绍在现代网页应用中,音频处理需求日益增加,HTML5 提供了强大的API来满足这些需求,包括录音、回放以及音频可视化效果等,本文将详细介绍如何使用MediaStream Recording API和Web Audio API实现这些功能,二、核心概念1. MediaSt……

    2024-11-20
    07
  • html5怎么录音功能

    HTML5录音功能随着互联网的发展,越来越多的应用程序需要实现录音功能,HTML5提供了一种在浏览器中实现录音的简单方法,无需安装额外的插件或软件,本文将详细介绍如何使用HTML5实现录音功能。HTML5录音原理HTML5录音功能是基于Web Audio API实现的,Web Audio API是一个用于处理音频数据的JavaScri……

    2023-12-26
    0262
  • html5怎么实现网页录音

    HTML5提供了一种在网页上实现录音功能的方法,即通过使用Web API中的MediaRecorder接口,MediaRecorder是一个用于捕获音频和视频的API,它允许开发者在浏览器中录制音频或视频,并将其保存为文件或上传到服务器。要实现网页录音,首先需要创建一个MediaRecorder对象,并指定录音的参数,如采样率、编码格……

    2024-01-22
    0189
  • html录音怎么打开

    HTML录音怎么打开?随着互联网的普及,越来越多的网站和应用程序开始提供在线录音功能,HTML录音是一种在网页上实现录音功能的技术,用户可以通过浏览器直接进行录音操作,而无需安装额外的软件,本文将详细介绍如何使用HTML录音技术,以及如何打开和使用HTML录音文件。HTML录音技术简介HTML录音是利用Web Audio API和We……

    2024-01-05
    0190
  • html 录音

    在HTML中录音,我们通常需要借助于一些JavaScript库,如MediaRecorder API,MediaRecorder API是一个内置在现代浏览器中的Web API,它允许开发者通过JavaScript来捕获和处理音频和视频数据。1. MediaRecorder API简介MediaRecorder API是一个用于捕获音……

    2023-12-26
    0122
  • 如何实现Android录屏功能?

    概述Android录屏功能可以通过多种方式实现,其中最常见的一种是使用Android自带的API,即通过MediaProjection来实现,这种方式不需要设备root权限,适用于大多数普通用户和开发者,工具类实现Android的录屏功能,需要用到以下几个关键工具类:1、MediaProjection:用于屏幕……

    2024-11-03
    06

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入