深井菜鸟
深井菜鸟
  • 发布:2019-12-11 12:06
  • 更新:2020-06-04 10:13
  • 阅读:1940

android中NJS方式使用原生录制视频

分类:Native.js

我们公司有业务要需要做限制拍摄时间的视频录制功能,官方提供的API太坑 太坑 太坑 太坑,压根不能用

感谢这位同行分享的代码:
https://ask.dcloud.net.cn/question/25816?item_id=108332&rf=false

我基于该分享的代码进行改进,成功在本地存储了mp4文件,望对大家有帮助

var Camera = plus.android.importClass('android.hardware.Camera')
,MediaRecorder = plus.android.importClass('android.media.MediaRecorder')
,SurfaceView = plus.android.importClass('android.view.SurfaceView')
,LinearLayout = plus.android.importClass('android.widget.LinearLayout')
,MediaRecorder = plus.android.importClass('android.media.MediaRecorder')
,SurfaceHolder = plus.android.implements('android.view.SurfaceHolder');

var mainActivity = plus.android.runtimeMainActivity()
,cameraView = new LinearLayout(mainActivity)
,surfaceView = new SurfaceView(mainActivity)
,cameraCount = Camera.getNumberOfCameras()
,cameraInfo = new Camera.CameraInfo()
,mediaRecorder = new MediaRecorder()
,cameraId = null
,camera = null
,surfaceHolder = null
,videoFilePath = plus.io.convertLocalFileSystemURL('_downloads/') + Date.now() + '.mp4';

//查询可用摄像头
for (var i = 0;i < cameraCount;i++) {
Camera.getCameraInfo(i, cameraInfo);

if(plus.android.getAttribute(cameraInfo, 'facing') !== cameraInfo.CAMERA_FACING_BACK) continue;  
cameraId = i;  
break;  

}

if(cameraId === null) throw Error('无后置摄像头');

cameraView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
cameraView.addView(surfaceView, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
mainActivity.setContentView(cameraView);

camera = Camera.open(cameraId);
camera.setDisplayOrientation(90);
camera.unlock();
surfaceHolder = surfaceView.getHolder();
mediaRecorder.setCamera(camera);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mediaRecorder.setVideoSize(1280, 720);
mediaRecorder.setVideoFrameRate(20);
mediaRecorder.setPreviewDisplay(plus.android.invoke(surfaceHolder, 'getSurface'));
mediaRecorder.setOutputFile(videoFilePath);
mediaRecorder.prepare();
mediaRecorder.start();
//camera.release();
setTimeout(function(){
mediaRecorder.stop();
camera.release();
}, 3e3);

0 关注 分享

要回复文章请先登录注册

深井菜鸟

深井菜鸟 (作者)

回复 MrCuiStock :
可以通过plus.key.addEventListener
也可以通过plus.nativeObj.View添加按钮
2020-06-04 10:13
MrCuiStock

MrCuiStock

怎么返回主页呢?
2020-05-31 09:08
深井菜鸟

深井菜鸟 (作者)

回复 ReigenDing :
我用的是h5+ app
2019-12-25 11:32
ReigenDing

ReigenDing

回复 深井菜鸟 :
你是在MUI下使用这个视频录制么?我是在uni-app下使用的,报的这个错。
```android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.;at com.android.internal.policy.DecorView.setSystemUiVisibility```
然后我看到有人说这个“NJS暂时不支持UI操作的API”。
2019-12-25 11:31
深井菜鸟

深井菜鸟 (作者)

回复 ReigenDing :
我已经更新了html demo,过程中部分机型可能会报java.io.FileNotFoundException,这个使用java.io.File预创建文件就行了,如果闪退 可以参考MediaRecorder的闪退解决方案
2019-12-25 11:21
ReigenDing

ReigenDing

您好,做视频录制同样使用这个代码,但是在这一行报错 ```mainActivity.setContentView(cameraView);```作者可以分享一下么
2019-12-25 10:53