mCamera.set$p$pview{@override在previewFrame()}不起作用 [英] mCamera.setpreview{@override onPreviewFrame() } not work
本文介绍了mCamera.set$p$pview{@override在previewFrame()}不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
- 我要的录制视频并分析当前位图的服务。
- 于是我在
onStartCommand
功能寄存器surfaceHolder.addCallback
。 - ,并设置
mCamera.set previewCallback
在surfaceCreated
功能。 - 当我启动服务,似乎
上previewFrame
函数不工作。
我不知道为什么,任何人都可以给我一个忙吗?
下面是服务 onStartCommand
函数的我的code。
@覆盖
公众诠释onStartCommand(意向意图,诠释标志诠释startId){
如果(Util.checkCameraHardware(本)){
mCamera = Util.getCameraInstance();
如果(mCamera!= NULL){
SurfaceView SV =新SurfaceView(本); 窗口管理WM =(窗口管理器)getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams PARAMS =新WindowManager.LayoutParams(1,1,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSLUCENT);
SurfaceHolder SH = sv.getHolder(); sv.setZOrderOnTop(真);
sh.setFormat(PixelFormat.TRANSPARENT);
sh.addCallback(新SurfaceHolder.Callback(){
@覆盖
公共无效surfaceCreated(SurfaceHolder持有人){
Camera.Parameters PARAMS = mCamera.getParameters();
mCamera.setParameters(PARAMS);
Camera.Parameters p值= mCamera.getParameters(); 清单< Camera.Size> LISTSIZE; LISTSIZE = p.getSupported previewSizes();
Camera.Size米previewSize = listSize.get(2);
Log.v(TAG,preVIEW宽度=+ M previewSize.width
+preVIEW高度=+ M previewSize.height);
P.SET previewSize(M previewSize.width,男previewSize.height); LISTSIZE = p.getSupportedPictureSizes();
Camera.Size mPictureSize = listSize.get(2);
Log.v(TAG,捕获宽度=+ mPictureSize.width
+捕获高度=+ mPictureSize.height);
p.setPictureSize(mPictureSize.width,mPictureSize.height);
mCamera.setParameters(P);
尝试{
mCamera.set previewDisplay(支架); / ******************* ************ /
mCamera.set previewCallback(新相机。previewCallback(){
@覆盖
在previewFrame(字节[]数据,相机摄像头){公共无效
如果(_calibrationsLeft == -1)
返回; 如果(_calibrationsLeft大于0){
//做校准! 如果(_currentFaceDetectionThread!= NULL
&功放;&安培; _currentFaceDetectionThread.isAlive()){
//删除帧
返回;
} //没有人脸检测启动或已完成
_processTimeForLastFrame = System.currentTimeMillis的()
- _lastFrameStart;
_lastFrameStart = System.currentTimeMillis的(); 如果(_currentFaceDetectionThread!= NULL){
_calibrationsLeft--;
updateMeasurement(_currentFaceDetectionThread.getCurrentFace()); 如果(_calibrationsLeft == 0){
doneCalibrating();
返回;
}
} _currentFaceDetectionThread =新FaceDetectionThread(数据,
_ previewSize);
_currentFaceDetectionThread.start(); }其他{
//简单的测量 如果(_currentFaceDetectionThread!= NULL
&功放;&安培; _currentFaceDetectionThread.isAlive()){
//删除帧
返回;
} //没有人脸检测启动或已完成
_processTimeForLastFrame = System.currentTimeMillis的()
- _lastFrameStart;
_lastFrameStart = System.currentTimeMillis的(); 如果(_currentFaceDetectionThread!= NULL)
updateMeasurement(_currentFaceDetectionThread.getCurrentFace()); _currentFaceDetectionThread =新FaceDetectionThread(数据,
_ previewSize);
_currentFaceDetectionThread.start();
}
}
});
/ ******************* *************************** /
}赶上(IOException异常五){
e.printStackTrace();
}
mCamera.start preVIEW();
。MessageHUB.get()的sendMessage(MessageHUB.LOG_ preVIEW,NULL);
mCamera.unlock();
校准();
} @覆盖
公共无效surfaceChanged(SurfaceHolder架,INT格式,诠释的宽度,高度INT){
} @覆盖
公共无效surfaceDestroyed(SurfaceHolder持有人){
}
});
wm.addView(SV,则params); }其他{
Log.d(TAG,====从服务中获得相机失败); }
}其他{
Log.d(TAG,====有设备上没有摄像头的硬件。);
} 返回super.onStartCommand(意向,旗帜,startId);
}
解决方案
您似乎停止surfacechanged
里面的摄像头preVIEW mCamera.stop preVIEW();
请尝试重新启动内部onSurfaceChanged preVIEW
在preVIEW还必须在preVIEW类重启
surfaceChanged()回调方法。
块引用>
- I want to record videos and analysis the current bitmap in service.
- So I register
surfaceHolder.addCallback
inonStartCommand
function.- And set
mCamera.setPreviewCallback
insurfaceCreated
function.- When I start the Service, it seems that the
onPreviewFrame
function never work.I don't know why, Can anybody give me a hand?
Here is my code of
onStartCommand
function in Service.@Override public int onStartCommand(Intent intent, int flags, int startId) { if (Util.checkCameraHardware(this)) { mCamera = Util.getCameraInstance(); if (mCamera != null) { SurfaceView sv = new SurfaceView(this); WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); WindowManager.LayoutParams params = new WindowManager.LayoutParams(1, 1, WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, PixelFormat.TRANSLUCENT); SurfaceHolder sh = sv.getHolder(); sv.setZOrderOnTop(true); sh.setFormat(PixelFormat.TRANSPARENT); sh.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { Camera.Parameters params = mCamera.getParameters(); mCamera.setParameters(params); Camera.Parameters p = mCamera.getParameters(); List<Camera.Size> listSize; listSize = p.getSupportedPreviewSizes(); Camera.Size mPreviewSize = listSize.get(2); Log.v("TAG", "preview width = " + mPreviewSize.width + " preview height = " + mPreviewSize.height); p.setPreviewSize(mPreviewSize.width, mPreviewSize.height); listSize = p.getSupportedPictureSizes(); Camera.Size mPictureSize = listSize.get(2); Log.v("TAG", "capture width = " + mPictureSize.width + " capture height = " + mPictureSize.height); p.setPictureSize(mPictureSize.width, mPictureSize.height); mCamera.setParameters(p); try { mCamera.setPreviewDisplay(holder); /***************************************************************************/ mCamera.setPreviewCallback(new Camera.PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { if (_calibrationsLeft == -1) return; if (_calibrationsLeft > 0) { // Doing calibration ! if (_currentFaceDetectionThread != null && _currentFaceDetectionThread.isAlive()) { // Drop Frame return; } // No face detection started or already finished _processTimeForLastFrame = System.currentTimeMillis() - _lastFrameStart; _lastFrameStart = System.currentTimeMillis(); if (_currentFaceDetectionThread != null) { _calibrationsLeft--; updateMeasurement(_currentFaceDetectionThread.getCurrentFace()); if (_calibrationsLeft == 0) { doneCalibrating(); return; } } _currentFaceDetectionThread = new FaceDetectionThread(data, _previewSize); _currentFaceDetectionThread.start(); } else { // Simple Measurement if (_currentFaceDetectionThread != null && _currentFaceDetectionThread.isAlive()) { // Drop Frame return; } // No face detection started or already finished _processTimeForLastFrame = System.currentTimeMillis() - _lastFrameStart; _lastFrameStart = System.currentTimeMillis(); if (_currentFaceDetectionThread != null) updateMeasurement(_currentFaceDetectionThread.getCurrentFace()); _currentFaceDetectionThread = new FaceDetectionThread(data, _previewSize); _currentFaceDetectionThread.start(); } } }); /****************************************************************************/ } catch (IOException e) { e.printStackTrace(); } mCamera.startPreview(); MessageHUB.get().sendMessage(MessageHUB.LOG_PREVIEW, null); mCamera.unlock(); calibrate(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { } }); wm.addView(sv, params); } else { Log.d("TAG", "==== get Camera from service failed"); } } else { Log.d("TAG", "==== There is no camera hardware on device."); } return super.onStartCommand(intent, flags, startId); }
解决方案It seems you're stopping camera preview inside surfacechanged
mCamera.stopPreview();
Try restarting preview inside onSurfaceChanged
The preview must also be restarted in the preview class surfaceChanged() callback method.
这篇关于mCamera.set$p$pview{@override在previewFrame()}不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文