首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Android 仿微信小視頻錄製控件:MediaRecorder + Camera 完整實現

     編輯:Java 相關知識

從零構建微信風格錄製組件:攝像頭預覽、進度條、最長時長、豎屏輸出

繼承 LinearLayout 組合 SurfaceView + ProgressBar,封裝 Camera 預覽與 MediaRecorder 錄製,支持屬性配置(分辨率、最長時長、是否自動開啟攝像頭),提供錄製完成回調。

核心架構

  • UI 層:movie_recorder_view.xml 垂直佈局,SurfaceView 佔比 1,ProgressBar 固定 2dp 底部
  • 屬性配置:attrs.xml 定義 width/height/is_open_camera/record_max_time
  • 邏輯層:MovieRecorderView 管理 Camera/Recorder 生命週期、計時器、文件存儲

關鍵流程

  1. SurfaceCreated → initCamera() 開啟攝像頭、設置豎屏參數、綁定預覽、unlock() 供 MediaRecorder 使用
  2. 開始錄製 → createRecordDir() 創建臨時 mp4 文件 → initRecord() 配置 MediaRecorder(視頻源 CAMERA、音頻源 MIC、MPEG_4、分辨率、幀率、碼率、90° 旋轉) → start() → 定時器每秒更新進度條
  3. 達到時長/手動停止 → stopRecord() 停止錄製 → releaseRecord() 釋放 MediaRecorder → freeCameraResource() 鎖定並釋放 Camera → 回調 OnRecordFinishListener
  4. SurfaceDestroyed → 自動釋放攝像頭資源

核心代碼片段

// 攝像頭豎屏設置
params.set("orientation", "portrait");
camera.setParameters(params);
camera.setDisplayOrientation(90);

// MediaRecorder 關鍵配置
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
recorder.setVideoSize(width, height);
recorder.setVideoEncodingBitRate(512 * 1024); // 512kbps
recorder.setOrientationHint(90); // 輸出旋轉 90° 保證豎屏播放

避坑指南

  • Camera.unlock()/lock():MediaRecorder 使用攝像頭前必須 unlock,釋放時 lock 再 release
  • SurfaceHolder 類型:SURFACE_TYPE_PUSH_BUFFERS 兼容舊版本
  • 異常保護:setOnErrorListener 捕獲錄製錯誤,stop() 包裹多重 try-catch 防崩潰
  • 文件存儲:File.createTempFile("recording", ".mp4", dir) 避免命名衝突
  • 權限:Manifest 需 CAMERA、RECORD_AUDIO、WRITE_EXTERNAL_STORAGE

擴展方向

  • 雙鏡頭切換、美顏濾鏡(OpenGL ES)、斷點續錄、壓縮轉碼、上傳進度
  • Android 10+ 改用 MediaRecorder + Camera2 或 CameraX 適配
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved