安卓实现视频录制,我发现有两种方法,一种是调用自带的视频功能,一种是使用MediaRecorder。class="wp-more-tag mce-wp-more" title="Read More..." alt="" />
以下内容也是通过自己测试整理而来。转载请注明出处:http://www.pm-road.com/index.php/2014/12/05/267/
这两种方法我全部测试了,每种方法都有自己的优缺点。接下来,把两种方法的代码写出来。
先说第一种方法,也是最简单的方法,那就是直接调用系统的视频功能。
代码很简单:
Java代码
-
- class VideoListener implements OnClickListener {
-
- @Override
- public void onClick(View v) {
- Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
-
-
-
- intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
-
-
- intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 61);
-
- intent.putExtra(MediaStore.EXTRA_SIZE_LIMIT, 1024 * 1024 * 100);
-
- startActivityForResult(intent, 11);
-
- }
接下来是第二方法 ,也是比第一次麻烦的方法 ,使用MediaRecorder:
break" alt="" />
Java代码
-
- class VideoListener implements OnClickListener {
-
- @Override
- public void onClick(View v) {
-
- Intent intent = new Intent(context,MovieRecorder.class);
- startActivity(intent);
-
- }
-
- }
MovieRecorder.class 中的代码:
Java代码
- package com.titan.ti_yuqiao.video;
-
- import java.io.File;
-
- import android.app.Activity;
- import android.content.pm.ActivityInfo;
- import android.graphics.PixelFormat;
- import android.media.MediaRecorder;
- import android.os.Bundle;
- import android.os.Environment;
- import android.view.SurfaceView;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.Window;
- import android.view.WindowManager;
- import android.widget.ImageButton;
- import android.widget.Toast;
-
- import com.titan.ti_yuqiao.R;
-
- public class MovieRecorder extends Activity implements OnClickListener {
-
- ImageButton record, stop;
-
- File videoFile;
- MediaRecorder mRecorder;
-
- SurfaceView sView;
-
- private boolean isRecording = false;
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(R.layout.video);
-
- setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
-
- getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
- WindowManager.LayoutParams.FLAG_FULLSCREEN);
-
- getWindow().setFormat(PixelFormat.TRANSLUCENT);
-
- record = (ImageButton) findViewById(R.id.record);
- stop = (ImageButton) findViewById(R.id.stop);
-
- stop.setEnabled(false);
-
- record.setOnClickListener(this);
- stop.setOnClickListener(this);
-
- sView = (SurfaceView) this.findViewById(R.id.sView);
-
- sView.getHolder().setFixedSize(1280, 720);
-
- sView.getHolder().setKeepScreenOn(true);
- }
-
- @Override
- public void onClick(View source) {
- switch (source.getId()) {
-
- case R.id.record:
- if (!Environment.getExternalStorageState().equals(
- android.os.Environment.MEDIA_MOUNTED)) {
- Toast.makeText(MovieRecorder.this, "SD卡不存在,请插入SD卡!",
- Toast.LENGTH_SHORT).show();
- return;
- }
- try {
-
- videoFile = new File(Environment.getExternalStorageDirectory()
- .getCanonicalFile() + "/20141205123345.3gp");
-
- mRecorder = new MediaRecorder();
- mRecorder.reset();
-
- mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
-
- mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
-
-
- mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
-
- mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
-
- mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
-
- mRecorder.setVideoSize(1280, 720);
-
- mRecorder.setVideoFrameRate(20);
-
-
- mRecorder.setVideoEncodingBitRate(8*1024*1024);
- mRecorder.setOutputFile(videoFile.getAbsolutePath());
-
- mRecorder.setPreviewDisplay(sView.getHolder().getSurface());
- mRecorder.prepare();
-
- mRecorder.start();
-
-
- record.setEnabled(false);
-
- stop.setEnabled(true);
- isRecording = true;
- } catch (Exception e) {
- e.printStackTrace();
- }
- break;
-
- case R.id.stop:
-
- if (isRecording) {
-
- mRecorder.stop();
-
- mRecorder.release();
- mRecorder = null;
-
- record.setEnabled(true);
-
- stop.setEnabled(false);
- }
- break;
- }
- }
- }
以下是该MovieRecorder.class对应的xml配置
Xml代码
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- <SurfaceView
- android:id="@+id/sView"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
- <LinearLayout
- android:orientation="horizontal"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="center_horizontal"
- android:layout_alignParentBottom="true"
- android:layout_centerHorizontal="true">
- <ImageButton
- android:id="@+id/record"
- android:layout_width="66dp"
- android:layout_height="66dp"
- android:scaleType="fitCenter"
- android:src="@drawable/red_no_problem" />
- <ImageButton
- android:id="@+id/stop"
- android:layout_width="66dp"
- android:layout_height="66dp"
- android:scaleType="fitCenter"
- android:src="@drawable/red_success" />
- </LinearLayout>
- </RelativeLayout>
对该程序添加权限:
- <uses-permission android:name="android.permission.RECORD_AUDIO"/>
-
- <uses-permission android:name="android.permission.CAMERA"/>
- <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
-
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
通过对这两种方法的测试,也发现两种方法的优缺点,以下为对比:
一:使用第一种方法,方便快捷,不需要太多的代码量;
使用第二种方法,代码量稍大;
二:第一种方法视频清晰度只有两种,一个是最不清楚,一个是最清楚;
第二种方法视频清晰度可根据数值自动往上调 ;
三:第一种方法,清晰度为1的时候,会占用大内存;
第二种方法 :清晰度越高的时候,内存也会增大;
经测试:第一种方法清晰度为1,录制一分钟,大小在43M左右;第二种方法当为8*1024*1024时,录制一分钟,大小在57M;
四:第一种方法在录制过程中,操作方便,有自己的暂停、录制、播放按钮 ;
第二种只能自己去写暂停、录制或播放按钮;
综上,如果内存足够大的时候,个人推荐使用第一种方法,方便快捷。
以上内容也是通过自己测试整理而来。