完成了相機拍照程式(Camera Take Photo Program)後,開始編寫相機錄制視頻程式(Camera Video Recording Program),相機錄制視頻程式需要使用 MediaRecorder API,使用 MediaRecorder 可以進行錄影和錄音,支援捕獲和編碼各種常見的音訊和視頻格式。
Android 相機錄制視頻程式(Camera Video Recording Program) |
- 操作系統:Windows 7 64-bit 版本
- 開發環境:Android Studio 4.0.1 版本
- 原程式:C:\Development\Development_Android\Android_Project\DIY-Android-091-11c Camera Video Recording
- 程式:C:\Development\Development_Android\Android_Project\DIY-Android-091-11c Camera Video Recording
- 測試環境:Vivo(維沃)X5Max Android 4.4.4(KitKat)版本
Android 相機錄制視頻程式(Camera Video Recording Program)編程步驟:
- 設定 Camera 許可權限後 - AndroidManifest.xml
- 設定 SurfaceView 參數 - init_View()
- 啟動 SurfaceView Callback - mSurfaceHolder.addCallback(this)
- 打開 Camera - Camera.open()
- 設置 Camera 參數 - setParameters()
- StartPreview Camera 顯示 - setPreviewDisplay(surfaceHolder) → startPreview()
- 設置 Button Video Recording 參數
- 設置 Mediarecorder
- 儲存錄制視頻
AndroidManifest.xml 獲取 Camera 許可權:
<uses-feature android:name="android.hardware.camera" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> |
activity_camera_recordvideo.xml:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent">
<SurfaceView android:id="@+id/activity_camera_surface" android:layout_width="match_parent" android:layout_height="match_parent" />
<Button android:id="@+id/btn_camera_video" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="200dp" android:text="Recording Video" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> |
CameraRecordVideo.java:
package bugworkshop.blogspot.com.camera;
import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log;
// Camera import android.hardware.Camera;
// SurfaceView import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.widget.Button;
// Recording Video import android.media.CamcorderProfile; import android.media.MediaRecorder; import android.os.Environment; import java.io.IOException;
public class CameraRecordVideo extends AppCompatActivity implements SurfaceHolder.Callback{
private Button mbtn_camera_video;
// Camera private Camera mCamera;
// SurfaceView private SurfaceView mSurfaceView; private SurfaceHolder mSurfaceHolder;
// Recording Video private boolean isRecording = false; private MediaRecorder mMediaRecorder;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_camera_recordvideo);
mbtn_camera_video = (Button)findViewById(R.id.btn_camera_video);
mbtn_camera_video.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!isRecording) { startRecording(); } else { stopRecording(); } } }); init_View(); }
//@Override public void init_View() { mSurfaceView = (SurfaceView)findViewById(R.id.activity_camera_surface); mSurfaceHolder = mSurfaceView.getHolder(); mSurfaceHolder.addCallback(this); // CallBack SurfaceCreate mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); }
@Override public void surfaceCreated(@NonNull SurfaceHolder surfaceHolder) { mCamera = Camera.open(); if (mCamera != null) { Camera.Parameters p = mCamera.getParameters(); p.setPreviewSize(640, 480); p.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); mCamera.setParameters(p); }
try { mCamera.setPreviewDisplay(surfaceHolder); mCamera.startPreview(); } catch (IOException e) { e.printStackTrace(); } }
@Override public void surfaceChanged(@NonNull SurfaceHolder surfaceHolder, int i, int i1, int i2) { }
@Override public void surfaceDestroyed(@NonNull SurfaceHolder surfaceHolder) { }
// Start Recording Video public void startRecording() { if (mCamera != null) { isRecording = true; mCamera.unlock(); mbtn_camera_video.setBackgroundColor(0xffff0000); mMediaRecorder = new MediaRecorder(); mMediaRecorder.setCamera(mCamera); mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface()); mMediaRecorder.setOutputFile("/sdcard/Video.mp4"); mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mMediaRecorder.setOrientationHint(90); mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); try { mMediaRecorder.prepare(); mMediaRecorder.start(); } catch (IOException e) { e.printStackTrace(); } } }
// Stop Recording Video public void stopRecording() { isRecording = false; //mRecordbutton.setBackgroundResource(R.drawable.circle_background); mbtn_camera_video.setBackgroundColor(0xffffffff); try { mMediaRecorder.stop(); mMediaRecorder.release(); mCamera.lock(); mCamera.startPreview(); } catch (Exception e) { e.printStackTrace(); } } } |
沒有留言:
張貼留言