private void startRecordVideo() {

if (index == VIDEO_1080) {
if (!supported1080P120Fps) {
showToast(getString(R.string.notSupport1080P));
return;
}
} else if (index == VIDEO_4K) {
if (!supported4K) {
showToast(getString(R.string.notSupport4K));
return;
}
} else if (index == VIDEO_NORMAL) {
if (!supportedNormal) {
showToast(getString(R.string.notSupportNormal));
return;
}
}
isRecording = true;
clearPath();
try {
setUpMediaRecorder();
SurfaceTexture texture = mTextureView.getSurfaceTexture();
assert texture != null;
if (index == VIDEO_1080) {
texture.setDefaultBufferSize(1920, 1080);
} else {
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
}

mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);

Surface previewSurface = new Surface(texture);
mPreviewBuilder.addTarget(previewSurface);
Surface recordSurface = mMediaRecorder.getSurface();
mPreviewBuilder.addTarget(recordSurface);

if (index == VIDEO_1080) {
mCameraDevice.createConstrainedHighSpeedCaptureSession(Arrays.asList(previewSurface, recordSurface),
new StateCallback() {

@Override
public void onConfigured(CameraCaptureSession session) {
mPreviewSession = session;
mPreviewSessionHighSpeed = (CameraConstrainedHighSpeedCaptureSession) mPreviewSession;
updatePreview();
runOnUiThread(new Runnable() {
@Override
public void run() {
btn_record.setText(getString(R.string.stop));
isRecording = true;
}
});
}

@Override
public void onConfigureFailed(CameraCaptureSession session) {
showToast(getString(R.string.record_failed));
}
}, mBackgroundHandler);
mMediaRecorder.start();
} else {
mCameraDevice.createCaptureSession(Arrays.asList(previewSurface, recordSurface), new StateCallback() {

@Override
public void onConfigured(CameraCaptureSession session) {
mPreviewSession = session;
updatePreview();
runOnUiThread(new Runnable() {
@Override
public void run() {
btn_record.setText(getString(R.string.stop));
isRecording = true;

}
});
}

@Override
public void onConfigureFailed(CameraCaptureSession session) {
showToast(getString(R.string.record_failed));
}
}, mBackgroundHandler);
mMediaRecorder.start();
}
} catch (CameraAccessException e) {
isRecording = false;
e.printStackTrace();
LogUtil.e(TAG, "record video : " + e);
} catch (Exception e) {
showToast(e.toString());
isRecording = false;
LogUtil.e(TAG, e.toString());
}

}

private void clearPath() {
File filesDir = getExternalFilesDir(null);
if (filesDir.exists()) {
File[] files = filesDir.listFiles();
if (files != null) {
for (File f : files) {
f.delete();
}
}
}
}

private void setUpMediaRecorder() throws IllegalStateException, IOException {
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mFilePath = getVideoFilePath(index);
mMediaRecorder.setOutputFile(mFilePath);
mMediaRecorder.setVideoEncodingBitRate(20000000);
if (index == VIDEO_1080) {
mMediaRecorder.setVideoFrameRate(120);
} else {
mMediaRecorder.setVideoFrameRate(30);
}
mMediaRecorder.setVideoSize(videoSize.getWidth(), videoSize.getHeight());
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
int rotation = getWindowManager().getDefaultDisplay().getRotation();
int orientation = DEFAULT_ORIENTATION.get(rotation);
mMediaRecorder.setOrientationHint(orientation);
mMediaRecorder.prepare();
}

private void stopRecordVideo() {
isRecording = false;
btn_record.setText(getString(R.string.record));
if (index == VIDEO_1080 && mPreviewSessionHighSpeed != null) {
try {
mPreviewSessionHighSpeed.stopRepeating();
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
mMediaRecorder.stop();
mMediaRecorder.reset();
showToast("Video saved: " + mFilePath);
startPreview();
}

private void stopRecordingVideoOnPause() {
isRecording = false;
btn_record.setText(getString(R.string.record));
if (index == VIDEO_1080 && mPreviewSessionHighSpeed != null) {
try {
mPreviewSessionHighSpeed.stopRepeating();
} catch (CameraAccessException e) {
e.printStackTrace();
}
}

mMediaRecorder.stop();
mMediaRecorder.reset();
}

private void startPreview() {
if (null == mCameraDevice || !mTextureView.isAvailable()) {
return;
}
try {
SurfaceTexture texture = mTextureView.getSurfaceTexture();
assert texture != null;
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
Surface previewSurface = new Surface(texture);
mPreviewBuilder.addTarget(previewSurface);
mCameraDevice.createCaptureSession(Arrays.asList(previewSurface), new CameraCaptureSession.StateCallback() {

@Override
public void onConfigured(CameraCaptureSession cameraCaptureSession) {
mPreviewSession = cameraCaptureSession;
updatePreview();
}

@Override
public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
showToast("Failed");
}
}, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}

private void updatePreview() {
if (null == mCameraDevice) {
return;
}
try {
if (isRecording) {
if (index == VIDEO_1080) {
Range<Integer> fpsRange = getHighestFpsRange(availableFpsRange);
mPreviewBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, fpsRange);
List<CaptureRequest> mPreviewBuilderBurst = mPreviewSessionHighSpeed
.createHighSpeedRequestList(mPreviewBuilder.build());
mPreviewSessionHighSpeed.setRepeatingBurst(mPreviewBuilderBurst, null, mBackgroundHandler);
} else {
setUpCaptureRequestBuilder(mPreviewBuilder);
mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), null, mBackgroundHandler);
}
} else {
mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), null, mBackgroundHandler);
}
} catch (CameraAccessException e) {
e.printStackTrace();
LogUtil.e(TAG, "update preview : " + e);
}
}

private Range<Integer> getHighestFpsRange(Range<Integer>[] fpsRanges) {
Range<Integer> fpsRange = Range.create(fpsRanges[0].getLower(), fpsRanges[0].getUpper());
for (Range<Integer> r : fpsRanges) {
if (r.getUpper() > fpsRange.getUpper()) {
fpsRange.extend(0, r.getUpper());
}
}

for (Range<Integer> r : fpsRanges) {
if (r.getUpper() == fpsRange.getUpper()) {
if (r.getLower() < fpsRange.getLower()) {
fpsRange.extend(r.getLower(), fpsRange.getUpper());
}
}
}
return fpsRange;
}

private Range<Integer>[] availableFpsRange;

private void setUpCaptureRequestBuilder(Builder builder) {
builder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
}

private CameraDevice mCameraDevice;
private MediaRecorder mMediaRecorder;
// private Semaphore mCameraOpenCloseLock = new Semaphore(1);

private void closeCamera() {
// try {
// mCameraOpenCloseLock.acquire();
if (null != mCameraDevice) {
mCameraDevice.close();
mCameraDevice = null;
}
if (null != mMediaRecorder) {
mMediaRecorder.release();
mMediaRecorder = null;
}
// } catch (InterruptedException e) {
// throw new RuntimeException("Interrupted while trying to lock camera
// closing.");
// } finally {
// mCameraOpenCloseLock.release();
// }
}

private Toast toast;

private void showToast(String msg) {
if (null == toast) {
toast = Toast.makeText(this, msg, Toast.LENGTH_SHORT);
} else {
toast.setText(msg);
}
toast.show();
}

private String getVideoFilePath(int index) {
String dir = "";
switch (index) {
case VIDEO_1080:
dir = "1080p";
break;
case VIDEO_4K:
dir = "4K";
break;
case VIDEO_NORMAL:
dir = "320x240";
break;
default:
dir = null;
break;
}
return getExternalFilesDir(null).getAbsolutePath() + "/" + dir + ".mp4";
}

private Handler mBackgroundHandler;
private HandlerThread mBackgroundThread;

private void startBackgroundThread() {
mBackgroundThread = new HandlerThread("Capture Video");
mBackgroundThread.start();
mBackgroundHandler = new Handler(mBackgroundThread.getLooper());
}

private void stopBackgroundThread() {
mBackgroundThread.quitSafely();
try {
mBackgroundThread.join();
mBackgroundThread = null;
mBackgroundHandler = null;
} catch (InterruptedException e) {
e.printStackTrace();
LogUtil.e(TAG, "stop background thread : " + e);
}
}

private void showChoices() {
final PopupWindow window = new PopupWindow(this);
View contentView = LayoutInflater.from(this).inflate(R.layout.pop, null);

RadioGroup rg = (RadioGroup) contentView.findViewById(R.id.rg);

switch (index) {
case VIDEO_1080:
rg.check(R.id.rb1080);
break;
case VIDEO_4K:
rg.check(R.id.rb4k);
break;
case VIDEO_NORMAL:
rg.check(R.id.rbnormal);
break;
default:
break;
}

rg.setOnCheckedChangeListener(new OnCheckedChangeListener() {

@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.rb1080:
index = VIDEO_1080;
videoSize = size1080P;
break;
case R.id.rb4k:
index = VIDEO_4K;
videoSize = size4K;
break;
case R.id.rbnormal:
index = VIDEO_NORMAL;
videoSize = size320x240;
break;
default:
break;
}
SharedPreferencesUtils.saveInt(RecordActivity.this, INDEX, index);
window.dismiss();
}
});
window.setContentView(contentView);
window.setOutsideTouchable(true);
window.showAtLocation(ibtn_info, Gravity.TOP, 0, 0);
}

}

Android 高速录像(2)的更多相关文章

  1. Android 高速录像(1)

    package com.kirin.voltage.activity; import java.io.File;import java.io.IOException;import java.util. ...

  2. Bmob移动后端云服务平台--Android从零開始--(二)android高速入门

    Bmob移动后端云服务平台--Android从零開始--(二)android高速入门 上一篇博文我们简介何为Bmob移动后端服务平台,以及其相关功能和优势. 本文将利用Bmob高速实现简单样例,进一步 ...

  3. android Camera 录像时旋转角度

    录像保存时,旋转角度要与所拍录像时的角度保持一致,否则,看起来就会出现角度不度,巅倒等问题. 一般在开始录像之前会先去初始化录像 initializeRecorder 中会去读取当前的录像或拍照的旋转 ...

  4. 看大师解说Android高速开发框架EasyAndroid

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u010966622/article/details/37601789 前几天做了小应用.感觉小有成就 ...

  5. EasyPlayer实现Android MediaMuxer录像MP4(支持G711/AAC/G726音频)

    本文转自EasyDarwin开源团队John的博客:http://blog.csdn.net/jyt0551/article/details/72787095 Android平台的MediaMuxer ...

  6. android高速开发框架xUtils

    xUtils简单介绍 xUtils 包括了非常多有用的android工具. xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词).拥有更加灵活的ORM,很多其它的事件注解支持且不受 ...

  7. 官方Android Camera2 录像示例--停止录像时崩溃修正

    官方Android 使用Camera2示例项目地址:https://github.com/android/camera-samples 视频录像示例:https://github.com/androi ...

  8. 5.3、Android Studio录像

    Android Monitor允许你从设备中录制一段MP4格式的视频,最长允许3分钟. 录制视频 在硬件设备中录制视频: 1. 打开一个项目 2. 在设备中运行应用 3. 显示Android Moni ...

  9. android高速上手(三)经常使用控件使用

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wangpeifeng669/article/details/26288387 完毕了android的 ...

随机推荐

  1. [BZOJ 4857][Jsoi2016]反质数序列

    传送门 $ \color{green} {solution : } $ 因为 $ 1 $ 的个数我们最多只能选一个,所以剩下的数如果组成素数那么只有一奇一偶,显然是个二分图模型 #include &l ...

  2. POJ_2886 Who Gets the Most Candies? 【二分+树状数组】

    一.题目 POJ2886 二.分析 这个题目吧,开始没读懂,做的时候也没懂,WA的时候懂了.假设是第p个出圈的人有一个对应的因子个数$F(p)$,那么,题目求的就是这个$F(p)$最大的对应的人. 1 ...

  3. EntityFramework First,FirstOrDefault,Single,SingleOrDefault的区别

    操作符 如果源序列是空的 源序列只包含一个元素 源序列包含多个元素 First 抛异常 返回该元素 返回第一个元素 FirstOrDefault 返回default(TSource) 返回该元素 返回 ...

  4. git 换行符替换

    https://help.github.com/en/articles/dealing-with-line-endings rm .git/index git reset https://github ...

  5. POJ 2253 Frogger ,poj3660Cow Contest(判断绝对顺序)(最短路,floyed)

    POJ 2253 Frogger题目意思就是求所有路径中最大路径中的最小值. #include<iostream> #include<cstdio> #include<s ...

  6. 在Vue项目中使用html2canvas生成页面截图并上传

    使用方法 项目中引入 npm install html2canvas html代码 //html代码 <!-- 把需要生成截图的元素放在一个元素容器里,设置一个ref --> <di ...

  7. try-catch里面加了return后,finally还会执行吗?

    请看下面的方法,在我们的catch里面,捕获到了异常之后,我们的catch模块里面的语句,还会接着执行,当我们执行到return之后,我们不会立即返回,而是会接着执行finally块里面的代码,只有执 ...

  8. springboot pom.xml文件

    pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

  9. C#反射动态调用dll中的方法,并返回结果(转)

    反射的作用是动态的加载某个dll(程序集),并执行该程序集中的某个方法,并返回结果:当然也可以给该方法传递参数 namespace assembly_name { public class assem ...

  10. vue笔记精华部分

    以 _ 或 $ 开头的属性 不会 被 Vue 实例代理,因为它们可能和 Vue 内置的属性.API 方法冲突.你可以使用例如 vm.$data._property 的方式访问这些属性. mixin的使 ...