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