Android 高速录像(2)
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)的更多相关文章
- Android 高速录像(1)
package com.kirin.voltage.activity; import java.io.File;import java.io.IOException;import java.util. ...
- Bmob移动后端云服务平台--Android从零開始--(二)android高速入门
Bmob移动后端云服务平台--Android从零開始--(二)android高速入门 上一篇博文我们简介何为Bmob移动后端服务平台,以及其相关功能和优势. 本文将利用Bmob高速实现简单样例,进一步 ...
- android Camera 录像时旋转角度
录像保存时,旋转角度要与所拍录像时的角度保持一致,否则,看起来就会出现角度不度,巅倒等问题. 一般在开始录像之前会先去初始化录像 initializeRecorder 中会去读取当前的录像或拍照的旋转 ...
- 看大师解说Android高速开发框架EasyAndroid
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u010966622/article/details/37601789 前几天做了小应用.感觉小有成就 ...
- EasyPlayer实现Android MediaMuxer录像MP4(支持G711/AAC/G726音频)
本文转自EasyDarwin开源团队John的博客:http://blog.csdn.net/jyt0551/article/details/72787095 Android平台的MediaMuxer ...
- android高速开发框架xUtils
xUtils简单介绍 xUtils 包括了非常多有用的android工具. xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词).拥有更加灵活的ORM,很多其它的事件注解支持且不受 ...
- 官方Android Camera2 录像示例--停止录像时崩溃修正
官方Android 使用Camera2示例项目地址:https://github.com/android/camera-samples 视频录像示例:https://github.com/androi ...
- 5.3、Android Studio录像
Android Monitor允许你从设备中录制一段MP4格式的视频,最长允许3分钟. 录制视频 在硬件设备中录制视频: 1. 打开一个项目 2. 在设备中运行应用 3. 显示Android Moni ...
- android高速上手(三)经常使用控件使用
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wangpeifeng669/article/details/26288387 完毕了android的 ...
随机推荐
- centos崩溃后如何修复
首先看能不能进单用户模式,能进去,就用mount -o remount,rw / 重置成可写的. 不能进单用户模式,就进入光盘救援模式,进去挂载了系统,这时候通常是必要的动态静态库出了问题,先应该做的 ...
- MSSQL远程连接操作(转)
--遠程連接操作 /****************************************************************************************** ...
- MVC返回数据流,ajax接受并保存文件
js代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...
- pandas中获取数据框的行、列数
获取数据框的行.列数 # 获取行数 df.shape[0] # 获取行数 len(df) # 获取列数 df.shape[1]
- 2019.04.19 读书笔记 比较File.OpenRead()和File.ReadAllBytes()的差异
最近涉及到流的获取与转化,终于要还流的债了. 百度了一下,看到这样的两条回复,于是好奇心,决定看看两种写法的源码差异. 先来看看OpenRead() public static FileStream ...
- SQL端通过脚本判断文件夹是否存在 并创建
做数据库备份作业的时候..想按日期建立文件夹.. 首先要判断文件夹是否存在 ) --路径 ) --日期 例如: 20171011 SET @DATE=CAST(DATEPART(YYYY,GETDAT ...
- QQ游戏--捕鱼假日竞技港对抗岛自动刷贝壳辅助使用教程和下载地址
首先解压缩到D盘根目录 再进入buyujiari文件夹双击 然后打开QQ游戏,进入竞技港-->对抗岛,到达开始准备的界面 再打开 辅助.exe 360对按键精灵的一个文件会提示病毒,可不用理会 ...
- Android开发环境搭建步骤-【Android】
本教程是android开发环境在windows下的安装配置,经本人测试完全正确无误.这个教程是史上最详细的android开发环境搭建教程. 工具/原料 Eclipse 3.7.0.Java Jdk6. ...
- ZOJ 3769 Diablo III
描述 Diablo III is an action role-playing video game. A few days ago, Reaper of Souls (ROS), the new e ...
- Maven 常见知识点整理
认识 Maven Maven 的作用? 1.添加第三方jar包 2.解决jar包之间的依赖关系 3.获取第三方jar包 4.将项目拆成多个工程模块 Maven 是什么? 是Apache软件基金会组织维 ...