Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android錄制視頻

Android錄制視頻

編輯:關於Android編程

我們一般直接從攝像頭和麥克風取數據,經過編碼,保存為文件。android的視頻錄制需要使用到MediaRecorder,MediaRecorder除了可以用於錄制音頻,還可用於錄制視頻。

效果圖如下圖所示:

\\

一個為錄制過程中,可以看到屏幕上方的錄制時間顯示,後一個為停止錄制視頻。

 

然後錄制好的視頻可以在手機的SD卡中找到,如下圖所示:

\

 

視頻錄制步驟:

1) 調用MediaRecorder 對象的setVideoEncoder()、setVideoEncodingBitRate(intbitRate)、setVideoFrameRate設置所錄制的視頻的編碼格式、編碼位率、每秒多少幀等,這些參數將可以控制所錄制的視頻的品質、文件的大小。一般來說,視頻品質越好,視頻文件越大。

2) 調用 MediaRecorder的setPreviewDisplay(Surfacesv)方法設置使用哪個SurfaceView來顯示視頻預覽。

實例使用MediaRecorder錄制視頻:

 

 

import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.view.*;
import android.view.SurfaceHolder.Callback;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Calendar;

@SuppressLint(SimpleDateFormat)
public class MyActivity extends Activity implements Callback {
	private SurfaceView mSurfaceview;
	private Button mBtnStartStop;// 開始停止錄制按鍵
	private boolean mStartedFlg = false;
	private MediaRecorder mRecorder;// 錄制視頻的類
	private SurfaceHolder mSurfaceHolder;// 顯示視頻
	private Camera camera;
	private TextView timeView;// 在屏幕頂部顯示錄制時間
	private int time = 0;

	@SuppressLint(HandlerLeak)
	private Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case 1:// 開始錄制
				timeView.setText(time +  s);
				break;
			case 2:// 錄制8s結束
				mRecorder.stop();
				mRecorder.reset(); // You can reuse the object by
				mBtnStartStop.setText(Start);
				mStartedFlg = false;
				time = 0;
				timeView.setText(time +  s);
				break;
			case 3:// 體檢結束
				time = 0;
				timeView.setText(time +  s);
				break;

			}
		}

		;
	};

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉標題欄
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);// 設置全屏
		getWindow().setFormat(PixelFormat.TRANSLUCENT); // 選擇支持半透明模式,在有surfaceview的activity中使用。
		setContentView(R.layout.main);// 加載布局

		timeView = (TextView) findViewById(R.id.time);
		mSurfaceview = (SurfaceView) findViewById(R.id.surfaceview);
		mBtnStartStop = (Button) findViewById(R.id.btn);
		mBtnStartStop.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				if (!mStartedFlg) {
					// 開始
					if (mRecorder == null) {
						mRecorder = new MediaRecorder(); // 創建mediarecorder的對象
					}
					try {
						camera.unlock();
						mRecorder.setCamera(camera);
						mRecorder
								.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);// 這兩項需要放在setOutputFormat之前
						mRecorder
								.setVideoSource(MediaRecorder.VideoSource.CAMERA);// 設置錄制視頻源為Camera(相機)
						mRecorder.setOrientationHint(90);
						// Set output file format
						mRecorder
								.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);// 設置錄制完成後視頻的封裝格式THREE_GPP為3gp.MPEG_4為mp4

						// 這兩項需要放在setOutputFormat之後
						mRecorder
								.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
						mRecorder
								.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);// 設置錄制的視頻編碼h263

						mRecorder.setVideoSize(800, 480);// 設置視頻錄制的分辨率。必須放在設置編碼和格式的後面,否則報錯
						mRecorder.setVideoFrameRate(30);// 設置錄制的視頻幀率。必須放在設置編碼和格式的後面,否則報錯

						mRecorder.setMaxDuration(8000);// 設置最大的錄制時間
						mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());

						// Set output file path
						String path = getSDPath();
						if (path != null) {
							File dir = new File(path + /recordtest);
							if (!dir.exists()) {
								dir.mkdir();
							}
							path = dir + / + getDate() + .mp4;
							Toast.makeText(MyActivity.this, path,
									Toast.LENGTH_LONG).show();
							mRecorder.setOutputFile(path);

							mRecorder.prepare();// 准備錄制

							mRecorder.start(); // 開始錄制

							new Thread(new Runnable() {

								@Override
								public void run() {
									while (time < 8) {
										try {
											time++;
											Thread.sleep(1000);
											handler.sendEmptyMessage(1);
										} catch (InterruptedException e) {
											// TODO Auto-generated catch block
											e.printStackTrace();
										}

									}
									handler.sendEmptyMessage(2);

								}
							}).start();

							mStartedFlg = true;
							mBtnStartStop.setText(Stop);

						}
					} catch (Exception e) {
						e.printStackTrace();
					}
				} else {
					// stop
					if (mStartedFlg) {
						try {
							mRecorder.stop();
							mRecorder.reset(); // You can reuse the object by
							// going back to
							// setAudioSource() step
							mBtnStartStop.setText(Start);
							handler.sendEmptyMessageDelayed(3, 1000);
						} catch (Exception e) {
							e.printStackTrace();
						}
					}
					mStartedFlg = false; // Set button status flag
				}
			}

		});

		SurfaceHolder holder = mSurfaceview.getHolder();// 取得holder

		holder.addCallback(this); // holder加入回調接口

		holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);// setType必須設置,要不出錯.

	}

	/**
	 * 使用時間對錄像起名
	 * 
	 * @return
	 */
	public static String getDate() {
		Calendar ca = Calendar.getInstance();
		SimpleDateFormat sdf = new SimpleDateFormat(yyyyMMddhhmmss);
		String date = sdf.format(ca.getTimeInMillis());
		return date;
	}

	/**
	 * 獲取SD path
	 * 
	 * @return
	 */
	public String getSDPath() {
		File sdDir = null;
		boolean sdCardExist = Environment.getExternalStorageState().equals(
				android.os.Environment.MEDIA_MOUNTED); // 判斷sd卡是否存在
		if (sdCardExist) {
			sdDir = Environment.getExternalStorageDirectory();// 獲取跟目錄
			// Toast.makeText(this,sdDir.toString(),Toast.LENGTH_LONG).show();
			return sdDir.toString();
		} else {
			Toast.makeText(this, 沒有SD卡, Toast.LENGTH_LONG).show();
		}

		return null;
	}

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		camera = Camera.open(); // 獲取Camera實例
		try {
			camera.setPreviewDisplay(holder);
			mSurfaceview.setLayoutParams(new LinearLayout.LayoutParams(width,
					height));
		} catch (Exception e) {
			// 如果出現異常,則釋放Camera對象
			camera.release();
		}
		camera.setDisplayOrientation(90);// 設置預覽視頻時時豎屏
		// 啟動預覽功能
		camera.startPreview();
		// 將holder,這個holder為開始在onCreate裡面取得的holder,將它賦給mSurfaceHolder
		mSurfaceHolder = holder;

	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {

		// 將holder,這個holder為開始在onCreate裡面取得的holder,將它賦給mSurfaceHolder
		mSurfaceHolder = holder;
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		// TODO Auto-generated method stub
		// surfaceDestroyed的時候同時對象設置為null
		mSurfaceview = null;
		mSurfaceHolder = null;
		if (mRecorder != null) {
			mRecorder.release(); // Now the object cannot be reused
			mRecorder = null;
		}
		if (camera != null) {
			camera.release();
			camera = null;
		}
	}
}
XML的布局文件為:

 



 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved