Android多媒体四:MediaRecorder录制视频短片

Android多媒体四:MediaRecorder录制视频短片

MediaRecorder除了可用于录制音频之外,还可用于录制视频,使用MediaRecorder录制视频与录制音频的步骤基本相同。
只是录制视频时不仅需要采集声音,还需要采集图像。为了让MediaRecorder录制时采集图像,应该在调用setAudioSource(int audio_source)方法时
再调用setVideoSource(int video_source)方法来设置图像来源。

除此之外,还需要在调用setOutputFormat()设置输出文件格式之后进行如下步骤:

   1、调用MediaRecorder对象的setVideoEncoder()、setVideoEncodingBitRate(int  bitRate)、setVideoFrameRate()设置所录制的视频的编码格式、
		编码位率、每秒多少帧等,这些参数将可以控制所录制的视频的品质、文件的大小。一般来说,视频品质越好,视频文件越大。

	2、调用MediaRecorder的setPreviewDisplay(SurfaceView  sv)方法设置使用哪个SurfaceView来显示视频预览。
实例:录制视频并保存

layout/activity_main.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:gravity="center_horizontal"
			android:orientation="vertical"
			tools:context=".MainActivity">

			<LinearLayout
				android:layout_width="wrap_content"
				android:layout_height="wrap_content"
				android:gravity="center_horizontal"
				android:orientation="horizontal">

				<Button
					android:id="@+id/recode"
					android:layout_width="0dp"
					android:layout_height="wrap_content"
					android:layout_weight="1"
					android:text="录制" />

				<Button
					android:id="@+id/stop"
					android:layout_width="0dp"
					android:layout_height="wrap_content"
					android:layout_weight="1"
					android:text="停止" />

			</LinearLayout>

			<!-- 显示视频预览的SurfaceView -->
			<SurfaceView
				android:id="@+id/sView"
				android:layout_width="match_parent"
				android:layout_height="match_parent" />
		</LinearLayout>

com/example/administrator/MainActivity.java

		package com.example.administrator;

		import android.Manifest;
		import android.app.Activity;
		import android.hardware.Camera;
		import android.media.MediaRecorder;
		import android.os.Bundle;
		import android.os.Environment;
		import android.util.Log;
		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;

		import com.example.administrator.Permission.PermissionManager;

		import java.io.File;
		import java.io.IOException;

		public class MainActivity extends Activity implements OnClickListener, PermissionManager.PermissionsResultListener {
			private final String TAG = "MainActivity";
			//程序中的两个按钮
			Button recode;
			Button stop;

			//系统的视频文件
			File videoFile;
			MediaRecorder mRecorder;

			//显示视频预览的SurfaceView
			SurfaceView sView;

			//记录是否正在进行录制
			private boolean isRecoding = false;
			private Camera mCamera;

			@Override
			protected void onCreate(Bundle savedInstanceState) {
				super.onCreate(savedInstanceState);
				setContentView(R.layout.activity_main);
				PermissionManager.requestPermission(this, "录制视频", 5, this, Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE);
				//获取程序界面中的两个按钮
				recode = findViewById(R.id.recode);
				stop = findViewById(R.id.stop);
				//让stop按钮不可用
				stop.setEnabled(false);
				//为按钮的单击事件绑定监听器
				recode.setOnClickListener(this);
				stop.setOnClickListener(this);
				//获取程序界面中的SurfaceView
				sView = this.findViewById(R.id.sView);
				//下面设置Surface不需要自己维护缓冲区
				sView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
				//设置分辨率
				sView.getHolder().setFixedSize(320, 280);
				//设置该组件让屏幕不会自动关闭
				sView.getHolder().setKeepScreenOn(true);
			}


			@Override
			public void onClick(View source) {
				switch (source.getId()) {
					//单击录制按钮
					case R.id.recode:
						Toast.makeText(this, "SD卡不存在,请插入SD卡!", 5000).show();
						if (!Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {
							return;
						}
						//创建保存录制视频的视频文件
						try {
							videoFile = new File(Environment.getDownloadCacheDirectory().getCanonicalFile() + "/myvideo.mp4");
						} catch (IOException e) {
							e.printStackTrace();
						}
						Log.i(TAG, "onClick: path = " + videoFile.toString());
						//创建MediaRecorder对象
						mRecorder = new MediaRecorder();

						mCamera = Camera.open();
						Camera.Parameters params = mCamera.getParameters();
						mCamera.setDisplayOrientation(90);//旋转了90度,最好先判断下JDK的版本号,再决定旋转不
						mCamera.setParameters(params);
						mCamera.stopPreview();
						mCamera.unlock();//解锁
						mRecorder.setCamera(mCamera);

						mRecorder.reset();
						//设置从麦克风采集声音
						mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
						//设置从摄像头采集图像
						mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
						//设置视频文件的输出格式(必须在设置声音编码格式、图像编码格式之前设置)
						mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
						//设置声音编码的格式
						mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
						//设置图像编码的格式
						mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
		//                    mRecorder.setVideoSize(320, 280);
						//每秒4帧
						mRecorder.setVideoFrameRate(30);
						mRecorder.setOutputFile(videoFile.getAbsolutePath());
						//指定使用SurfaceView来预览视频
						mRecorder.setPreviewDisplay(sView.getHolder().getSurface());
						try {
							mRecorder.prepare();
						} catch (IOException e) {
							e.printStackTrace();
						}
						//开始录制
						mRecorder.start();
						System.out.println("----recoding----");
						//让recorde按钮不可用
						recode.setEnabled(false);
						//让stop按钮可用
						stop.setEnabled(true);
						isRecoding = true;
						break;
					//单击停止按钮
					case R.id.stop:
						//如果正在进行录制
						if (isRecoding) {
							//停止录制
							mRecorder.stop();
							//释放资源
							mRecorder.release();
							//让record按钮可用
							recode.setEnabled(true);
							//让stop按钮不可用
							stop.setEnabled(false);
							mCamera.release();
						}
						break;
				}
			}

			@Override
			public void onPermissionGranted(int requestCode) {

			}

			@Override
			public void onPermissionDenied(int requestCode) {

			}
		}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值