当前位置:首页 > 技术 > 正文内容

Android中的MediaRecorder录音与录像

访客 技术 2026年7月22日 1

Android系统不仅支持播放多媒体文件,还能够从设备硬件中捕获多媒体数据,例如通过麦克风录音或摄像头录像。本文将详细介绍如何使用MediaRecorder在Android中实现录音和录像功能,并通过示例代码加以说明。

MediaRecorder概述

MediaRecorder主要用于记录音频和视频,位于android.media.MediaRecorder包下。它为开发者提供了丰富的API来实现录音和录像功能。以下是一些常用方法的简要说明:

  • prepare():准备开始录音或录像。
  • start():开始录音或录像。
  • stop():停止录音或录像。
  • reset():重置MediaRecorder的状态。
  • release():释放MediaRecorder占用的资源。
  • setAudioEncoder(int):设置音频编码格式。
  • setAudioSource(int):设置音频输入源。
  • setOutputFormat(int):设置输出媒体文件的格式。
  • setPreviewDisplay(Surface):设置视频预览界面。
  • setVideoEncoder(int):设置视频编码格式。
  • setVideoSource(int):设置视频输入源。
  • setOutputFile(String):指定输出媒体文件的路径。
  • setMaxDuration(int):设置最大录制时长(单位:毫秒)。

需要注意的是,MediaRecorder的状态机决定了其方法的调用顺序。只有处于特定状态下,才能调用相应的方法。下图展示了官方文档中的状态转换图:

MediaRecorder状态机

录音实现

以下是一个简单的录音示例代码,录音文件将保存在SD卡根目录下:

package cn.bgxt.mediarecorderdemo;

import android.app.Activity;
import android.media.MediaRecorder;
import android.media.MediaRecorder.OnErrorListener;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class RecordActivity extends Activity {
    private Button btnStart, btnStop;
    private MediaRecorder mediaRecorder;
    private boolean isRecording;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_record);

        btnStart = (Button) findViewById(R.id.btnStart);
        btnStop = (Button) findViewById(R.id.btnStop);

        btnStop.setEnabled(false);

        btnStart.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startRecording();
            }
        });

        btnStop.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                stopRecording();
            }
        });
    }

    private void startRecording() {
        try {
            File file = new File("/sdcard/mediarecorder.amr");
            if (file.exists()) {
                file.delete();
            }

            mediaRecorder = new MediaRecorder();
            mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            mediaRecorder.setOutputFile(file.getAbsolutePath());

            mediaRecorder.setOnErrorListener(new OnErrorListener() {
                @Override
                public void onError(MediaRecorder mr, int what, int extra) {
                    mediaRecorder.stop();
                    mediaRecorder.release();
                    mediaRecorder = null;
                    isRecording = false;
                    btnStart.setEnabled(true);
                    btnStop.setEnabled(false);
                    Toast.makeText(RecordActivity.this, "录音发生错误", Toast.LENGTH_SHORT).show();
                }
            });

            mediaRecorder.prepare();
            mediaRecorder.start();

            isRecording = true;
            btnStart.setEnabled(false);
            btnStop.setEnabled(true);
            Toast.makeText(RecordActivity.this, "开始录音", Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void stopRecording() {
        if (isRecording) {
            mediaRecorder.stop();
            mediaRecorder.release();
            mediaRecorder = null;
            isRecording = false;
            btnStart.setEnabled(true);
            btnStop.setEnabled(false);
            Toast.makeText(RecordActivity.this, "录音结束", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onDestroy() {
        if (isRecording) {
            mediaRecorder.stop();
            mediaRecorder.release();
            mediaRecorder = null;
        }
        super.onDestroy();
    }
}

为了使应用程序能够录音,需要在AndroidManifest.xml中添加以下权限:

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

录像实现

以下是一个使用MediaRecorder进行录像的示例代码,录像文件将保存在SD卡根目录下:

package cn.bgxt.mediarecorderdemo;

import android.app.Activity;
import android.media.MediaRecorder;
import android.media.MediaRecorder.OnErrorListener;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class VideoActivity extends Activity {
    private Button btnStart, btnStop;
    private SurfaceView svView;
    private boolean isRecording;
    private MediaRecorder mediaRecorder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video);

        btnStart = (Button) findViewById(R.id.btnStart);
        btnStop = (Button) findViewById(R.id.btnStop);
        svView = (SurfaceView) findViewById(R.id.svView);

        btnStop.setEnabled(false);

        btnStart.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startRecording();
            }
        });

        btnStop.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                stopRecording();
            }
        });

        svView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    private void startRecording() {
        try {
            File file = new File("/sdcard/video.mp4");
            if (file.exists()) {
                file.delete();
            }

            mediaRecorder = new MediaRecorder();
            mediaRecorder.reset();
            mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
            mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
            mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
            mediaRecorder.setVideoFrameRate(4);
            mediaRecorder.setOutputFile(file.getAbsolutePath());
            mediaRecorder.setPreviewDisplay(svView.getHolder().getSurface());

            mediaRecorder.setOnErrorListener(new OnErrorListener() {
                @Override
                public void onError(MediaRecorder mr, int what, int extra) {
                    mediaRecorder.stop();
                    mediaRecorder.release();
                    mediaRecorder = null;
                    isRecording = false;
                    btnStart.setEnabled(true);
                    btnStop.setEnabled(false);
                    Toast.makeText(VideoActivity.this, "录制出错", Toast.LENGTH_SHORT).show();
                }
            });

            mediaRecorder.prepare();
            mediaRecorder.start();

            isRecording = true;
            btnStart.setEnabled(false);
            btnStop.setEnabled(true);
            Toast.makeText(VideoActivity.this, "开始录像", Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void stopRecording() {
        if (isRecording) {
            mediaRecorder.stop();
            mediaRecorder.release();
            mediaRecorder = null;
            isRecording = false;
            btnStart.setEnabled(true);
            btnStop.setEnabled(false);
            Toast.makeText(VideoActivity.this, "停止录像,并保存文件", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onDestroy() {
        if (isRecording) {
            mediaRecorder.stop();
            mediaRecorder.release();
            mediaRecorder = null;
        }
        super.onDestroy();
    }
}

为了使用摄像头进行录像,需要在AndroidManifest.xml中添加以下权限:

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

总结

通过MediaRecorder,开发者可以轻松实现音频和视频的录制功能。本文通过详细的代码示例和权限说明,展示了如何在Android应用中使用MediaRecorder进行录音和录像。希望这些内容能帮助开发者更好地理解和使用MediaRecorder。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。