小編給大家分享一下Android如何實現調用手機攝像頭錄像限制錄像時長,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
具體內容如下
因為服務器空間有限,所以視頻時長必須有所限制。
在xml中先布局一個按鈕,點擊開始錄頻。布局一個TextView用于顯示倒計時的時間。
一、使用Hander+TimerTask完成定時操作
private TextView btn_stop;
private int recLen = 11;
Timer timer = new Timer();
//時間倒計時放在開始按鈕事件后,看標題7那里是時間倒計時開始的時候
//timer.schedule(task,1000,1000);
final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg){
switch (msg.what){
case 1:
btn_stop.setText(""+recLen);
if(recLen<0){
timer.cancel();
btn_stop.setVisibility(View.GONE);
}
}
}
};
TimerTask task = new TimerTask() {
@Override
public void run() {
recLen--;
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
//當倒計時時間到1的時候關閉錄像
if (recLen == 1){
customTimer.Stop();
stopRecord();
}
}
};二、初始化攝像頭
private void initCamera() {
mCamera = Camera.open(0); //①
mCamera.setDisplayOrientation(90);
try {
mCamera.setPreviewDisplay(mSurfaceHolder);
mCamera.cancelAutoFocus();//此句加上 可自動聚焦 必須加
Camera.Parameters parameters = mCamera.getParameters();
//查詢攝像頭支持的分辨率
parameters.getSupportedPreviewSizes();
for (int i = 0; i < parameters.getSupportedPreviewSizes().size(); i++) {
Log.i("<><><><>Width", parameters.getSupportedPreviewSizes().get(i).width + "");
Log.i("<><><><>Height", parameters.getSupportedPreviewSizes().get(i).height + "");
}
//設置分辨率
parameters.setPreviewSize(1280, 720);
//設置聚焦模式
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
//縮短Recording啟動時間
parameters.setRecordingHint(true);
//是否支持影像穩定能力,支持則開啟
if (parameters.isVideoStabilizationSupported())
parameters.setVideoStabilization(true);
mCamera.setParameters(parameters);
mCamera.startPreview();
} catch (Exception e) {
Log.i(TAG, "Error starting camera preview: " + e.getMessage());
}
}三、創建視頻文件
private boolean createRecordDir() {
if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
Toast.makeText(this, "SD卡不存在!", Toast.LENGTH_SHORT).show();
return false;
}
File sampleDir = new File("/sdcard/myVideo/");
if (!sampleDir.exists()) {
sampleDir.mkdirs();
}
videoName = "VID_" + DateUtils.getData(DateUtils.FORMAT_YYYYMMDDHHMMSS) + ".mp4";
mVecordFile = new File(sampleDir, videoName);
return true;
}四、配置MediaRecorder
private void setConfigRecord() {
mediaRecorder = new MediaRecorder();
mediaRecorder.reset();
mediaRecorder.setCamera(mCamera);
mediaRecorder.setOnErrorListener(onErrorListener);
//錄像角度
mediaRecorder.setOrientationHint(90);
//使用SurfaceView預覽
mediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
//1.設置采集聲音
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//設置采集圖像
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
//2.設置視頻,音頻的輸出格式 mp4
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
//3.設置音頻的編碼格式
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
//設置圖像的編碼格式
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
CamcorderProfile mProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P);
mediaRecorder.setAudioEncodingBitRate(44100);
if (mProfile.videoBitRate > 2 * 1024 * 1024) {
mediaRecorder.setVideoEncodingBitRate(2 * 1024 * 1024);
} else {
mediaRecorder.setVideoEncodingBitRate(1024 * 1024);
}
mediaRecorder.setVideoFrameRate(mProfile.videoFrameRate);
mediaRecorder.setVideoSize(1280, 720);
mediaRecorder.setOutputFile(mVecordFile.getAbsolutePath());
}五、停止錄制
private void stopRecord() {
try {
if (isRecording && mediaRecorder != null) {
mediaRecorder.setOnErrorListener(null);
mediaRecorder.setPreviewDisplay(null);
mediaRecorder.stop();
mediaRecorder.reset();
mediaRecorder.release();
mediaRecorder = null;
isRecording = false;
Log.i(TAG, "" + mVecordFile.toString());
//new imageTask().execute(mVecordFile);
MessageData md = new MessageData();
md.srdatatype = SRDataType.錄像返回;
md.Data = mVecordFile.getAbsolutePath();
Intent intent = new Intent(BroadCastParameter.action);
intent.putExtra("data", md);
sendBroadcast(intent);
// Fragment頁面廣播通知
LocalBroadcastManager.getInstance(CustomRecorder.this).sendBroadcast(intent);
finish();
}
}catch (Exception ex)
{
//Toast.makeText(getApplicationContext(),ex.getMessage(),1).show();
}
}六、關閉攝像頭
private void stopCamera() {
if (mCamera != null) {
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}七、點擊開始錄像按鈕
public void onViewClicked(View view) {
if (Build.VERSION.SDK_INT >= 23) {
int REQUEST_CODE_CONTACT = 101;
//驗證是否許可權限
for (String str : permissions) {
if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(getApplicationContext(),"存儲權限未授權",1).show();
return;
}
}
}
switch (view.getId()) {
//開始
case R.id.btn_start:
btn_start.setVisibility(View.GONE);
btn_stop.setVisibility(View.VISIBLE);
//這是是判斷視頻文件有沒有創建,如果沒有就返回
boolean creakOk = createRecordDir();
if (!creakOk) {
return;
}
try {
mCamera.unlock();
setConfigRecord();
mediaRecorder.prepare();
mediaRecorder.start();
} catch (Exception e) {
//Toast.makeText(getApplicationContext(),e.getMessage(),Toast.LENGTH_LONG).show();
}
StartTime = new Date(System.currentTimeMillis());
isRecording = true;
customTimer.ReStart();
timer.schedule(task,1000,1000);
break;看完了這篇文章,相信你對“Android如何實現調用手機攝像頭錄像限制錄像時長”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。