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. C#集合之不变的集合

    如果对象可以改变其状态,就很难在多个同时运行的任务中使用.这些集合必须同步.如果对象不能改变器状态,就很容易在多个线程中使用. Microsoft提供了一个新的集合库:Microsoft Immuta ...

  2. BZOJ - 2741 分块维护最大连续异或和

    题意:给定\(a[l...r]\),多次询问区间\([l,r]\)中的最大连续异或和\(a_i⊕a_{i+1}⊕...⊕a_{j},l≤i≤j≤r\) 一眼过去认为是不可做的,但题目给出\(n=1.2 ...

  3. 利用Python实现倒序任意整数

    这是很早以前学习C时候做过的一个练习题,题目的要求大概是把用户输入的三位数倒序输出,比如说用户输入123,然后程序应该输出的结果是321.如果遇到用户输入100,那么程序应该输出1.然后我给扩展一下, ...

  4. python 模块和包以及他们的导入关系

    一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编 ...

  5. spring的总结

    1. 第一天 问题:怎样的程序是一个优秀的程序 可维护性好,可扩展性好,性能优秀 问题:业界对象提供什么的概念 高内聚,低耦合,也就是尽量使代码对应的功能写在对应的模块,并且尽量减少类与类之间的关系, ...

  6. Hive中 使用 Round() 的坑

    有个算法如下: SELECT MEMBERNUMBER, ROUND(SUM(SumPointAmount)) AS VALUE FROM BSUM_CRMPOINT WHERE UPPER(POIN ...

  7. Oracle 通过子查询批量添加、修改表数据

    1.通过查询快速创建表 create table test1(id,job,mgr,sal) as () ) ---这是一个分页查询 ok,表创建成功 2.通过查询快速创建视图 create or r ...

  8. input输入框中只能输入数字,非数字字符自动清除

    前言:项目中有个缴纳保证金的功能,要是输入框只能输入数字,不能输入其他字符. ①HTML代码:<input class="input-box" type="text ...

  9. 快速部署简单私有云CloudStack(上)

    前言: 亲身用了大半年,没出过重大毛病,也就是服务挂了,跟服务器也没啥关系.如果想更深入学习cloudstack可以试试高级网络,我是一直用的简单网络(扁平网络). 由来:CloudStack的前身是 ...

  10. PHP自然排序,非自然排序(未完成)

    还要研究一下,暂时先添加个链接 参考:PHP数组的“自然”排序