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. 51nod 1812 树的双直径 题解【树形DP】【贪心】

    老了-稍微麻烦一点的树形DP都想不到了. 题目描述 给定一棵树,边权是整数 \(c_i\) ,找出两条不相交的链(没有公共点),使得链长的乘积最大(链长定义为这条链上所有边的权值之和,如果这条链只有 ...

  2. Locust HTTP client

    Http client 默认是以安全模式运行的,任何由于连接错误.超时或者类似错误引起的异常,都会返回一个空的Response对象,这个请求将会再locust统计中标记为failure,返回的虚拟对象 ...

  3. Java Web基础——Controller+Service +Dao三层的功能划分

    转自:https://www.cnblogs.com/cielosun/articles/5752272.html 1. Controller/Service/DAO简介: Controller是管理 ...

  4. MySQL查询操作select

    查找记录 SELECT select_expr [,select_expr ...] [ FROM table_references(表的参照) [WHERE where_condition](条件) ...

  5. MySQL表级约束和列级约束

    对一个数据列建立的约束,称为列级约束 对多个数据列建立的约束,称为表级约束 列级约束即可以在列定义时生命,也可以在列定义后声明. 表级约束只能在列定义后声明. NOT NULL和DEFAULT只存在列 ...

  6. PyCharm+cmd中使用Anaconda 与 新建Python环境(Windows)

    PyCharm配置Anaconda Anaconda的安装在网上已经有了,这里主要讲之前已经安装了已经配置好Python环境变量以及PyCharm的情况下,使用Anaconda. 即在PyCharm中 ...

  7. 使用BeanUtils封装数据时数据类型的转换

    //获得表单数据 Map<String, String[]> properties = request.getParameterMap(); User user = new User(); ...

  8. ES6中的类继承和ES5中的继承模式详解

    1.ES5中的继承模式 我们先看ES5中的继承. 既然要实现继承,首先我们得要有一个父类. Animal.prototype.eat = function(food) { console.log(th ...

  9. org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'xxxx' is not present

    org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'xxx ...

  10. jenkins启动脚本

    [root@localhost system]# cat /etc/init.d/jenkins #!/bin/sh # # SUSE system statup script for Jenkins ...