編輯:關於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的布局文件為:
修改文件路徑 android4.4\packages\apps\Browser\src\com\android\browser\BrowserSettings.java
文件存儲是 Android 中最基本的一種數據存儲方式,它不對存儲的內容進行任何的格式化處理,所有數據都是原封不動的保存到文件當中的。概述文件存取的核心就是輸入流和輸出流
微信對話列表滑動刪除效果很不錯的,借鑒了github上SwipeListView(項目地址:https://github.com/likebamboo/SwipeList
在Android系統API中,有兩個Camera類: android.graphics.Camera android.hardware.Camera 第二個應用於