生活随笔
收集整理的這篇文章主要介紹了
Android开发笔记之视频录制
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Android開發(fā)筆記之視頻錄制
官方使用指南請(qǐng)查看Google音頻和視頻指南
視頻錄制基本步驟
申明權(quán)限
<uses-permission android:name="android.permission.RECORD_AUDIO" /><--如果錄制的視頻保存在外部SD卡,還需要添加以下權(quán)限-><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
注意:RECORD_AUDIO為危險(xiǎn)權(quán)限,從Android 6.0開始(API級(jí)別23)開始,需要?jiǎng)討B(tài)獲取。
視頻錄制參數(shù)配置
import android
.graphics
.SurfaceTexture
;
import android
.hardware
.Camera
;
import android
.text
.TextUtils
;
public class VideoRecorderConfig {private Camera camera
;private int videoWidth
;private int videoHeight
;private int cameraRotation
;private String path
;private 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
;
public class VideoRecorder {private static final String TAG
= "VideoRecord";private MediaRecorder mRecorder
;public VideoRecorder() {}public boolean startRecord(VideoRecorderConfig config
, MediaRecorder
.OnErrorListener listener
) {if (config
== null
|| !config
.checkParam()) {LogUtils
.e(TAG
, "參數(shù)錯(cuò)誤");return false;}if (mRecorder
== null
) {mRecorder
= new MediaRecorder();}mRecorder
.reset();if (listener
!= null
) {mRecorder
.setOnErrorListener(listener
);}config
.getCamera().unlock();mRecorder
.setCamera(config
.getCamera());
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
.setVideoEncodingBitRate(800 * 1024);
mRecorder
.setOrientationHint(config
.getCameraRotation());
mRecorder
.setMaxDuration(15 * 1000);mRecorder
.setOutputFile(config
.getPath());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());}}}public boolean pause() {if (Build
.VERSION
.SDK_INT
>= Build
.VERSION_CODES
.N
&& mRecorder
!= null
) {mRecorder
.pause();return true;}return false;}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
)){profile
= CamcorderProfile
.get(cameraID
, CamcorderProfile
.QUALITY_480P
);profile
.videoBitRate
= profile
.videoBitRate
/5;return profile
;}if(CamcorderProfile
.hasProfile(cameraID
, CamcorderProfile
.QUALITY_720P
)){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為自己封裝的相機(jī)庫(kù)
總結(jié)
以上是生活随笔為你收集整理的Android开发笔记之视频录制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。