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

news/2024/10/24 4:48:34/

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&#…