[2021.12.5]使用MediaRecorder录制音频和视频(Camera1)

news/2023/12/8 23:44:52

1 概述

MediaRecorder类用于录制音频和视频。步骤如下:
(1)实例化MediaRecorder对象
(2)设置声音来源和图像来源
(3)设置视频分辨率
(4)设置录制视频文件的保存路径
(5)设置使用哪个SurfaceView
(6)准备录制视频
(7)开始录制视频
(8)停止录制,释放资源

2 代码

CameraRecord:

https://github.com/hanyuhang-hz/android-demos

MainActivity.java

public class MainActivity extends Activity {public final static String TAG = "CameraRecord";private ImageButton play, stop, record;private MediaRecorder mediaRecorder;private SurfaceView surfaceView;private boolean isRecord = false;private File videoDir;private android.hardware.Camera camera;private File path;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(MainActivity.this, new String[]{ Manifest.permission.RECORD_AUDIO}, 1);}if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(MainActivity.this, new String[]{ Manifest.permission.CAMERA}, 1);}if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(MainActivity.this, new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);}// 设置全屏显示getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);if (!android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {Toast.makeText(MainActivity.this, "请安装SD卡!", Toast.LENGTH_SHORT).show();}record = (ImageButton) findViewById(R.id.record);stop = (ImageButton) findViewById(R.id.stop);play = (ImageButton) findViewById(R.id.play);stop.setEnabled(false);play.setEnabled(false);surfaceView = (SurfaceView) findViewById(R.id.surfaceView);surfaceView.getHolder().setFixedSize(1920, 1080);record.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {record();}});stop.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (isRecord) {mediaRecorder.stop();mediaRecorder.release();record.setEnabled(true);stop.setEnabled(false);play.setEnabled(true);Toast.makeText(MainActivity.this, "录像保存在:" + path, Toast.LENGTH_SHORT).show();}}});play.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 通过Intent跳转播放视频界面Intent intent = new Intent(MainActivity.this, PlayVideoActivity.class);startActivity(intent);}});}// 创建record()方法,实现录制功能private void record() {// 设置录制视频保存的文件夹videoDir = new File(Environment.getExternalStorageDirectory() + "/DCIM/Camera/");if (!videoDir.exists()) {videoDir.mkdir();}String fileName = "video.mp4";path = new File(videoDir, fileName);mediaRecorder = new MediaRecorder();Camera.Parameters parameters = camera.getParameters();parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);camera.setParameters(parameters);camera.startPreview();camera.setDisplayOrientation(90);camera.unlock();mediaRecorder.setCamera(camera);mediaRecorder.reset();   //重置MediaRecordermediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);           // 设置麦克风获取声音mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);        // 设置摄像头获取图像mediaRecorder.setVideoEncodingBitRate(1920 * 1080);                    // 设置清晰度CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);mediaRecorder.setProfile(profile);mediaRecorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight);mediaRecorder.setOutputFile(path.getAbsolutePath());                   // 设置视频输出路径mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface()); // 设置使用SurfaceView预览视频mediaRecorder.setOrientationHint(90);                                  // 调整播放视频角度try {mediaRecorder.prepare();                                           // 准备录像} catch (Exception e) {e.printStackTrace();}mediaRecorder.start();                                                 // 开始录制Toast.makeText(MainActivity.this, "开始录像", Toast.LENGTH_SHORT).show();record.setEnabled(false);stop.setEnabled(true);play.setEnabled(false);isRecord = true;}@Overrideprotected void onResume() {camera = android.hardware.Camera.open();super.onResume();}@Overrideprotected void onPause() {camera.stopPreview();camera.release();super.onPause();}
}

PlayVideoActivity.java

public class PlayVideoActivity extends Activity {private SurfaceView surfaceView;private ImageButton play, pause, stop;private MediaPlayer mediaPlayer;private SurfaceHolder surfaceHolder;private boolean noPlay = true;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_play_video);// 设置全屏显示getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);play = (ImageButton) findViewById(R.id.play);pause = (ImageButton) findViewById(R.id.pause);stop = (ImageButton) findViewById(R.id.stop);surfaceView = (SurfaceView) findViewById(R.id.surfaceView);surfaceHolder = surfaceView.getHolder();pause.setEnabled(false);stop.setEnabled(false);/*** 实现播放功能*/play.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (noPlay) {play();noPlay = false;} else {mediaPlayer.start();}}});/*** 实现暂停功能*/pause.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mediaPlayer.isPlaying()) {mediaPlayer.pause();}}});/*** 实现停止功能*/stop.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (mediaPlayer.isPlaying()) {mediaPlayer.stop();mediaPlayer.release();noPlay = true;pause.setEnabled(false);stop.setEnabled(false);}}});}/*** 创建play()方法,在该方法中实现视频的播放功能*/public void play() {mediaPlayer = new MediaPlayer();mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);mediaPlayer.setDisplay(surfaceHolder);try {mediaPlayer.setDataSource(Environment.getExternalStorageDirectory() + "/DCIM/Camera/video.mp4");mediaPlayer.prepare();} catch (Exception e) {e.printStackTrace();}mediaPlayer.start();pause.setEnabled(true);stop.setEnabled(true);// 为MediaPlayer对象添加完成事件监听器mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {Toast.makeText(PlayVideoActivity.this, "视频播放完毕!", Toast.LENGTH_SHORT).show();}});}/*** 当前Activity销毁时,停止正在播放的视频,并释放MediaPlayer所占用的资源*/@Overrideprotected void onDestroy() {super.onDestroy();if (mediaPlayer != null) {if (mediaPlayer.isPlaying()) {mediaPlayer.stop();}// Activity销毁时停止播放,释放资源。不做这个操作,即使退出还是能听到视频播放的声音mediaPlayer.release();}}
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><!--SurfaceView组件--><SurfaceViewandroid:id="@+id/surfaceView"android:layout_width="match_parent"android:layout_height="match_parent" /><!--水平线性布局--><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:orientation="horizontal"><!--播放按钮--><ImageButtonandroid:id="@+id/play"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:background="@color/btn_bg"android:src="@drawable/play" /><!--录制按钮--><ImageButtonandroid:id="@+id/record"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:background="@color/btn_bg"android:src="@drawable/record" /><!--停止按钮--><ImageButtonandroid:id="@+id/stop"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:background="@color/btn_bg"android:src="@drawable/stop" /></LinearLayout></RelativeLayout>

activity_play_video.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.hyh.camerarecord.PlayVideoActivity"><!--SurfaceView组件--><SurfaceViewandroid:id="@+id/surfaceView"android:layout_weight="10"android:layout_width="wrap_content"android:layout_height="wrap_content" /><!--水平线性布局--><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"android:orientation="horizontal"><!--播放按钮--><ImageButtonandroid:id="@+id/play"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:background="@color/black"android:src="@drawable/btn_play" /><!--暂停按钮--><ImageButtonandroid:id="@+id/pause"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:background="@color/black"android:src="@drawable/btn_pause" /><!--停止按钮--><ImageButtonandroid:id="@+id/stop"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:background="@color/black"android:src="@drawable/btn_stop" /></LinearLayout>
</LinearLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.hyh.camerarecord"><!-- 授予程序录制声音的权限 --><uses-permission android:name="android.permission.RECORD_AUDIO" /><!-- 授予程序使用摄像头的权限 --><uses-permission android:name="android.permission.CAMERA" /><!-- 授予使用外部存储器的权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.CameraRecord"android:requestLegacyExternalStorage="true"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name=".PlayVideoActivity"></activity></application></manifest>

3 遇到的问题

3.1 java.io.FileNotFoundException: /storage/emulated/0/Camera/DCIM/video.mp4: open failed: ENOENT (No such file or directory)

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<applicationandroid:requestLegacyExternalStorage="true"
</application>

3.2 java.lang.RuntimeException: start failed.
        at android.media.MediaRecorder.start(Native Method)
        at com.hyh.camerarecord.MainActivity.record(MainActivity.java:141)

屏蔽:
//mediaRecorder.setVideoSize(1920, 1080);                              //设置视频的尺寸
//mediaRecorder.setVideoFrameRate(10);                                 //设置为每秒10帧

3.3 MediaRecorder录制的视频不聚焦

Camera.Parameters parameters = camera.getParameters();
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
camera.setParameters(parameters);

3.4 MediaRecorder录制的视频和预览视频清晰度不一致,录制的视频不清晰 

参考https://blog.csdn.net/qunqunstyle99/article/details/83143939

CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
mediaRecorder.setProfile(profile);
mediaRecorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight);


http://www.ppmy.cn/news/474523.html

相关文章

内录音频的方法

有时需要将电脑上听到的声音录制下来&#xff0c;比如在网上听到一首好歌或者视频里的某段音乐&#xff0c;由于种种原因无法下载时&#xff0c;我们可以通过电脑内录的方法将其录制下来。提醒一句&#xff0c;内录下来的音乐也得注意版权问题哦。 设 置 要进行电脑内录之前&am…

Android录制声音文件(音频),并播放

readme&#xff1a;1、这个demo中没有对多次点击同一个声音文件做详细处理&#xff0c;偶尔会有崩溃&#xff0c;用的时候需要注意。2、按住录音按钮录音过程中&#xff0c;只对竖直方向处理了一下&#xff0c;水平方向没写&#xff1b;3、没有做删除某个声音文件的操作&#x…

windows下录制音频

参考文档&#xff1a; 1&#xff1a;github上的一个开源代码&#xff1a;点击打开链接&#xff0c;因为存储音频需要自己写文件头部&#xff0c;所以这里借鉴了它的文件存储功能。 2&#xff1a;一个很有用的帖子代码&#xff1a;点击打开链接&#xff0c;虽然有点小瑕疵&…

Android多媒体功能开发(10)——使用MediaRecorder类录制音频

Android为音频录制提供了两个类&#xff1a;MediaRecorder和AudioRecord。 MediaRecorder类优点是使用简单&#xff0c;集成了录音、编码、压缩等&#xff0c;直接录制到文件&#xff0c;支持3gp、aac、amr等少量的录音音频格式。缺点是无法实时处理音频&#xff0c;输出的音频…

Android音频开发(二):录制音频(WAV及MP3格式)

一、Android音频开发(一)&#xff1a;音频基础知识二、Android音频开发(二)&#xff1a;录制音频(WAV及MP3格式)三、Android音频开发(三)&#xff1a;使用ExoPlayer播放音频四、Android音频开发(四)&#xff1a;音频播放模式五、Android音频开发(五)&#xff1a;感应(息屏/亮屏…

录制音频

想要在ios设备上录制音频&#xff0c;可以使用AVAudioRecorder类&#xff0c;确保你已经将CoreAudio.framework 库添加到目标文件中 AV框架中的AVAudioRecorder类使得在iOS中录制音频变得很简单。开始录制音频需要提供一些参数给AVAudioRecorder实例的initWithURL:settings:err…

Android多媒体功能开发(11)——使用AudioRecord类录制音频

AudioRecord类优点是能录制到缓冲区&#xff0c;能够实现边录边播&#xff08;AudioRecord AudioTrack&#xff09;以及对音频的实时处理&#xff08;如QQ电话&#xff09;。缺点是输出是PCM格式的原始采集数据&#xff0c;如果直接保存成音频文件&#xff0c;不能够被播放器播…

音视频开发(二):AudioRecord录制PCM音频

目录 音频采集API AudioRecord和MediaRecorder介绍 PCM的介绍 AudioRecord的使用&#xff08;构造、开始录制、停止录制、其他细节点&#xff09; ffplay播放pcm pcm转为wav 小结 一、音频采集API AudioRecord和MediaRecorder AndroidSDK提供了两套音频录制的API&#…

Android音视频开发:MediaRecorder录制音频

Android 多媒体框架针对音频录制提供了两种方法&#xff1a;MediaRecorder和AudioRecord。 区别 MediaRecorder&#xff1a;录制的音频文件是经过压缩后的&#xff0c;需要设置编码器&#xff0c;并且录制的音频文件可以用系统自带的播放器播放。MediaRecorder属于系统Api高度…

音频录制以及播放

音频录制以及播放 象棋小子 1048272975 一般的音频应用中&#xff0c;往往需要支持音频的拾取输入以及音频的播放输出。LPC5411x具有I2S音频接口以及双通道PDM数字麦克风接口&#xff0c;其中数字麦克风接口支持芯片深度睡眠时的语音激活&#xff0c;非常适合于音频…

【软件】windows录音,如何录制系统内部声音(几乎找遍全网的所有方法)

1. 引言 最近因为一些原因&#xff0c;需要录制一些远程会议的音频&#xff0c;便于回溯记录。因此花了一些时间&#xff0c;去找了一下有什么软件可以录制系统内部的声音。 不单单是麦克风收录的声音&#xff0c;还包括系统内部的声音&#xff0c;就是我们耳机里能听到的声音…

5种录制Windows 10 音频的方法

您是否正在寻找合适的软件来录制在Windows 10电脑上播放的音频&#xff1f;本文将评测 5 款常用的录音软件。 有时我们想在笔记本电脑上上录制我们的声音以在不同情况下使用。 录制的曲目可以包括歌曲、乐器、旁白、拼写、提醒、播客等。 但是&#xff0c;Windows没有内置选项…

Android音视频开发:AudioRecord录制音频

简介 AudioRecord是安卓多媒体框架中用于录制音频的工具。它支持录制原始音频数据&#xff0c;即PCM数据&#xff0c;PCM数据不能被播放器直接播放&#xff0c;需要编码压缩成常见音频格式才能被播放器识别。而原生api也提供了AudioTrack播放PCM数据。 录音流程 AudioRecord是…

如何进行音频录制?实用的音频录制方法合集

音频录制是一种重要的技能&#xff0c;可以用于各种场合&#xff0c;比如我们可以使用音频录制技术录制不同乐器和声音的音频&#xff0c;并在后期进行处理和混音&#xff0c;制作出完整的音乐作品等等。但是&#xff0c;要想录制出高质量的音频并不容易&#xff0c;需要掌握一…

Linux dd 命令使用

dd命令的使用&#xff0c;等下写

金属元素螯合剂:1189194-64-6,DOTA-(COOt-Bu)3-CH2-Alkynyl,试剂的结构式和CAS分享

文章关键词&#xff1a;双功能螯合剂&#xff0c;大环配体一、试剂基团反应特点&#xff08;Reagent group reaction characteristics&#xff09;&#xff1a; 西安凯新生物科技有限公司供应的​DOTA-(COOt-Bu)3-CH2-Alkynyl中&#xff0c;​DOTA分子是一种十二元四氮杂大环配…

学习HCIP的day.14

目录 STP生成树协议 生成树协议 一、802.1D 1、根网桥 2、根端口 3、指定端口 4、非指定端口 5、接口状态 802.1D的收敛时间 802.1D算法的缺点 以上cost值的解释 二、PVST 三、PVST 四、快速生成树 五、MSTP/MST/802.1S STP生成树协议 网络三层架构…

什么是序列化与反序列化

序列化&#xff1a;就是将对象转化为字符流的过程。 反序列化&#xff1a;就是将字节流转化为对象的过程。 被序列化的对象类型需要实现Serializable序列化接口&#xff0c;此接口是标志接口。 为保证序列化与反序列化的过程稳定&#xff0c;建议在类中添加序列化版本号。 …

计算机主机sn号怎么查看,笔记本序列号怎么看_笔记本电脑SN序列号的查看方法-win7之家...

序列号就是SN码&#xff0c;通常电脑中都会自带有序列号&#xff0c;可以用来验证真伪或产品是否合法的一组序列号&#xff0c;然而有不少笔记本电脑用户想要查看序列号&#xff0c;就是不知道要怎么看&#xff0c;其实方法有很多&#xff0c;现在就随win7之家小编一起来学习一…

rk3288_android7.1 随机生成SN号问题

问题现象 擦除flash升级后&#xff0c;SN号会被清空&#xff0c;不方便调试&#xff1b;希望擦除flash升级后&#xff0c;可以随机生成SN号 解决方案&#xff1a; system/core/drmservice/drmservice.c 中 SERIALNO_FROM_IDB设为1&#xff0c;会使用工具写入的sn&#xff0c;否…
最新文章