日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android开发笔记之视频录制

發布時間:2023/12/16 Android 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android开发笔记之视频录制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Android開發筆記之視頻錄制

官方使用指南請查看Google音頻和視頻指南

視頻錄制基本步驟

  • 申明權限
  • <uses-permission android:name="android.permission.RECORD_AUDIO" /><--如果錄制的視頻保存在外部SD卡,還需要添加以下權限-><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    注意:RECORD_AUDIO為危險權限,從Android 6.0開始(API級別23)開始,需要動態獲取。

  • 視頻錄制參數配置
  • import android.graphics.SurfaceTexture; import android.hardware.Camera; import android.text.TextUtils;/*** @author Created by LRH* @description 視頻錄制參數(參數可自行拓展)* @date 2021/1/19 13:54*/ public class VideoRecorderConfig {//Cameraprivate Camera camera;//攝像頭預覽寬度private int videoWidth;//攝像頭預覽高度private int videoHeight;//攝像頭預覽偏轉角度private int cameraRotation;//保存的文件路徑private String path;//由于Camera使用的是SurfaceTexture,所以這里使用了SurfaceTexture//也可使用SurfaceHolderprivate SurfaceTexture mSurfaceTexture;private int cameraId = 0;public SurfaceTexture getSurfaceTexture() {return mSurfaceTexture;}public void setSurfaceTexture(SurfaceTexture surfaceTexture) {mSurfaceTexture = surfaceTexture;}public Camera getCamera() {return camera;}public void setCamera(Camera camera) {this.camera = camera;}public int getVideoWidth() {return videoWidth;}public void setVideoWidth(int videoWidth) {this.videoWidth = videoWidth;}public int getVideoHeight() {return videoHeight;}public void setVideoHeight(int videoHeight) {this.videoHeight = videoHeight;}public int getCameraRotation() {return cameraRotation;}public void setCameraRotation(int cameraRotation) {this.cameraRotation = cameraRotation;}public String getPath() {return path;}public void setPath(String path) {this.path = path;}public int getCameraId() {return cameraId;}public void setCameraId(int cameraId) {this.cameraId = cameraId;}public boolean checkParam() {return mSurfaceTexture != null && camera != null && videoWidth > 0 && videoHeight > 0 && !TextUtils.isEmpty(path);} }
  • 視頻錄制接口封裝(使用MediaRecorder)
  • import android.media.CamcorderProfile; import android.media.MediaRecorder; import android.os.Build; import android.view.Surface;import com.emp.yjy.baselib.utils.LogUtils; import java.io.IOException;/*** @author Created by LRH* @description* @date 2021/1/19 13:53*/ public class VideoRecorder {private static final String TAG = "VideoRecord";private MediaRecorder mRecorder;public VideoRecorder() {}/*** 開始錄制** @param config* @return*/public boolean startRecord(VideoRecorderConfig config, MediaRecorder.OnErrorListener listener) {if (config == null || !config.checkParam()) {LogUtils.e(TAG, "參數錯誤");return false;}if (mRecorder == null) {mRecorder = new MediaRecorder();}mRecorder.reset();if (listener != null) {mRecorder.setOnErrorListener(listener);}config.getCamera().unlock();mRecorder.setCamera(config.getCamera());//設置音頻通道 // mRecorder.setAudioChannels(1);//聲音源 // AudioSource.DEFAULT:默認音頻來源 // AudioSource.MIC:麥克風(常用) // AudioSource.VOICE_UPLINK:電話上行 // AudioSource.VOICE_DOWNLINK:電話下行 // AudioSource.VOICE_CALL:電話、含上下行 // AudioSource.CAMCORDER:攝像頭旁的麥克風 // AudioSource.VOICE_RECOGNITION:語音識別 // AudioSource.VOICE_COMMUNICATION:語音通信mRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);//視頻源mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);try {//推薦使用以下代碼進行參數配置CamcorderProfile bestCamcorderProfile = getBestCamcorderProfile(config.getCameraId());mRecorder.setProfile(bestCamcorderProfile);} catch (Exception e) {//設置輸出格式mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);//聲音編碼格式mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);//視頻編碼格式mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);}//設置視頻的長寬mRecorder.setVideoSize(config.getVideoWidth(), config.getVideoHeight()); // 設置取樣幀率mRecorder.setVideoFrameRate(30); // mRecorder.setAudioEncodingBitRate(44100); // 設置比特率(比特率越高質量越高同樣也越大)mRecorder.setVideoEncodingBitRate(800 * 1024); // 這里是調整旋轉角度(前置和后置的角度不一樣)mRecorder.setOrientationHint(config.getCameraRotation()); // 設置記錄會話的最大持續時間(毫秒)mRecorder.setMaxDuration(15 * 1000);//設置輸出的文件路徑mRecorder.setOutputFile(config.getPath());//設置預覽對象(可以使用SurfaceHoler代替)mRecorder.setPreviewDisplay(new Surface(config.getSurfaceTexture()));//預處理try {mRecorder.prepare();} catch (IOException e) {e.printStackTrace();return false;}//開始錄制mRecorder.start();return true;}/*** 停止錄制*/public void stopRecord() {if (mRecorder != null) {try {mRecorder.stop();mRecorder.reset();mRecorder.release();mRecorder = null;} catch (Exception e) {e.printStackTrace();LogUtils.e(TAG, e.getMessage());}}}/*** 暫停錄制** @return*/public boolean pause() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && mRecorder != null) {mRecorder.pause();return true;}return false;}/*** 繼續錄制** @return*/public boolean resume() {if (mRecorder != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {mRecorder.resume();return true;}return false;} }public CamcorderProfile getBestCamcorderProfile(int cameraID){CamcorderProfile profile = CamcorderProfile.get(cameraID, CamcorderProfile.QUALITY_LOW);if(CamcorderProfile.hasProfile(cameraID, CamcorderProfile.QUALITY_480P)){//對比下面720 這個選擇 每幀不是很清晰profile = CamcorderProfile.get(cameraID, CamcorderProfile.QUALITY_480P);profile.videoBitRate = profile.videoBitRate/5;return profile;}if(CamcorderProfile.hasProfile(cameraID, CamcorderProfile.QUALITY_720P)){//對比上面480 這個選擇 動作大時馬賽克!!profile = CamcorderProfile.get(cameraID, CamcorderProfile.QUALITY_720P);profile.videoBitRate = profile.videoBitRate/35;return profile;}if(CamcorderProfile.hasProfile(cameraID, CamcorderProfile.QUALITY_CIF)){profile = CamcorderProfile.get(cameraID, CamcorderProfile.QUALITY_CIF);return profile;}if(CamcorderProfile.hasProfile(cameraID, CamcorderProfile.QUALITY_QVGA)){profile = CamcorderProfile.get(cameraID, CamcorderProfile.QUALITY_QVGA);return profile;}return profile;}
  • 使用示例
  • public void recordVideo(CustomCameraView CameraView) {VideoRecorderConfig config = new VideoRecorderConfig();String path = App.sGlobalContext.getExternalFilesDir("video").getAbsolutePath() + File.separator + "test1.mp4";config.setCamera(CameraView.getCamera());config.setCameraRotation(CameraView.getCameraRotation());config.setVideoHeight(CameraView.getCameraSize().height);config.setVideoWidth(CameraView.getCameraSize().width);config.setPath(path);config.setSurfaceTexture(CameraView.getSurfaceTexture());config.setCameraId(0);VideoRecorder record = new VideoRecorder();boolean start = record.startRecord(config, null);int duration = 15_000;while (duration > 0) {if (duration == 10_000) {boolean pause = record.pause();LogUtils.e(TAG, "暫停錄制" + pause);}if (duration == 5_000) {boolean resume = record.resume();LogUtils.e(TAG, "重新開始錄制" + resume);}SystemClock.sleep(1_000);duration -= 1_000;}record.stopRecord();LogUtils.d(TAG, "停止錄制");}

    其中CustomCameraView為自己封裝的相機庫

    總結

    以上是生活随笔為你收集整理的Android开发笔记之视频录制的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。