在上一篇博客,Android-MediaRecorder录制音频,中讲解了使用Android API MediaRecorder 刻录音频,这篇博客主要是介绍 使用MediaRecorder刻录(视频)录像机
这篇博客是讲解刻录视频,无论是刻录音频还是刻录视频都是使用 MediaRecorder媒体刻录器来刻录
刻录音频 与 刻录视频 对比:
刻录音频:MediaRecorder
刻录播放:MediaRecorder + SurfaceView
MediaRecorder是Android设计的媒体刻录器,不仅仅可以刻录音频文件,还可以刻录视频文件
刻录:Audio 相关
刻录:Video 相关
MediaRecorder 和 MediaPlayer 的区别:
MediaRecorder:媒体刻录器,可以刻录(音频 / 视频)
MediaPlayer: 媒体播放器,可以播放(音频 / 视频)
以下图,是Android官方提供:MediaRecorder时序图:
只要会看这个图:就能实现音频/视频刻录,开始刻录,停止刻录,等等
看图规律:
1.蓝色椭圆形是状态;
2.单箭头是方法调用;
3.双箭头是监听回调;
AndroidManifest.xml配置权限:
<!-- 刻录是很危险的行为,所以需要权限RECORD_AUDIO,无论是刻录音频还是视频都需要RECORD_AUDIO --> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 保存音频文件到sdcard外部存储的权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
AndroidManifest.xml配置Activity横屏/全屏:
<!-- MediaRecorder录制视频 设置横屏显示: android:screenOrientation="landscape" 设置无标题+全屏: android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" --> <activity android:name=".MyMediaRecorderVideoActivity" android:screenOrientation="landscape" android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
activity_media_recorder_video.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <SurfaceView android:id="@+id/surface_view" android:layout_width="match_parent" android:layout_height="match_parent" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="刻录视频" android:layout_alignParentBottom="true" android:onClick="recorderVideo" /> </RelativeLayout>
MyMediaRecorderVideoActivity.java
package liudeli.my_media1; import android.app.Activity; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.view.SurfaceView; import android.view.View; import android.widget.Button; import java.io.File; import java.io.IOException; public class MyMediaRecorderVideoActivity extends Activity { // 定义媒体刻录器 刻录视频+音频 private MediaRecorder recorder; // 定义SurfaceView private SurfaceView surfaceView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_media_recorder_video); surfaceView = findViewById(R.id.surface_view); // 创建媒体刻录器 recorder = new MediaRecorder(); // 音频录制的来源:麦克风?? recorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 视频录制的来源:Camera recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // 文件输出的格式 .3pg recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); // 音频编码的格式 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // 视频编码的格式 recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT); // 使用默认的:手机会自动支持某种格式(H264/H263) // 文件输出的路径 File file = new File(Environment.getExternalStorageDirectory(), "MediaRecorderToVideo.3gp"); recorder.setOutputFile(file.getAbsolutePath()); } /** * 刻录视频 * @param view */ public void recorderVideo(View view) { Button recorderVideo = (Button) view; String recorderVideoStr = recorderVideo.getText().toString(); if ("正在刻录视频".equals(recorderVideoStr)) { recorderVideo.setText("刻录视频"); recorder.stop(); recorder.reset(); // You can reuse the object by going back to setAudioSource() step recorder.release(); // Now the object cannot be reused } else if ("刻录视频".equals(recorderVideoStr)) { recorderVideo.setText("正在刻录视频"); /** * 在准备之前把SurfaceView 和 MediaRecorder 关联绑定起来 */ recorder.setPreviewDisplay(surfaceView.getHolder().getSurface()); try { // 开始准备 recorder.prepare(); } catch (IOException e) { e.printStackTrace(); } // 启动开始刻录 recorder.start(); // Recording is now started } } }
效果:
播放刻录好的 MediaRecorderToVideo.3gp