官方Camera2 video Demo崩溃的修正
来源:互联网 发布:国家电网数据运维 编辑:程序博客网 时间:2024/06/09 05:40
最近在做关于视频(YUV<–>h264)、camera、camera2相关的项目。
首先要赞一下camera2,设计的非常良心。1920*1080的分辨率下帧率依然能保持30fps。接下来就只剩下吐槽了。
花了整整一天的时间做了camera2的在一个界面上录像+拍照的app。唯一的感受就是坑太多!
接下来,步入正题。官方demo,总会在stopRecording()这里崩溃。甚至底层的camera服务崩溃,到了“除了重启别无他法”的境地。稍微理了一下,这个问题还是对数据流向不清楚的缘故,也许是最近被camera2+mediaCodec虐的体无完肤才能看到这一点吧。当然不排除官方大牛故意在这里埋个flag,好让大家都对camera2映像深刻吧!
由于项目紧的原因,先写这么多。当然,我是在已经写好了app的情况下才考虑在这里说一下。看了不少相关的解决办法,要么是在onError()里重新初始化相机,要么就直接finish当前activity,让人感觉不务实求真。
Error信息:
E/CameraCaptureSession: Session 1: Exception while stopping repeating: android.hardware.camera2.CameraAccessException: The camera device has encountered a serious error at android.hardware.camera2.impl.CameraDeviceImpl.checkIfCameraClosedOrInError(CameraDeviceImpl.java:1478) at android.hardware.camera2.impl.CameraDeviceImpl.stopRepeating(CameraDeviceImpl.java:677) at android.hardware.camera2.impl.CameraCaptureSessionImpl.close(CameraCaptureSessionImpl.java:328) at com.example.android.camera2video.Camera2VideoFragment.closePreviewSession(Camera2VideoFragment.java:674) at com.example.android.camera2video.Camera2VideoFragment.startPreview(Camera2VideoFragment.java:491) at com.example.android.camera2video.Camera2VideoFragment.stopRecordingVideo(Camera2VideoFragment.java:687) at com.example.android.camera2video.Camera2VideoFragment.onClick(Camera2VideoFragment.java:313) at android.view.View.performClick(View.java:4909) at android.view.View$PerformClick.run(View.java:20390) at android.os.Handler.handleCallback(Handler.java:815) at android.os.Handler.dispatchMessage(Handler.java:104) at android.os.Looper.loop(Looper.java:194) at android.app.ActivityThread.main(ActivityThread.java:5848) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)05-16 13:44:29.576 8036-8036/com.example.android.camera2video W/System.err: android.hardware.camera2.CameraAccessException: The camera device has encountered a serious error05-16 13:44:29.576 8036-8036/com.example.android.camera2video W/System.err: at android.hardware.camera2.impl.CameraDeviceImpl.checkIfCameraClosedOrInError(CameraDeviceImpl.java:1478)05-16 13:44:29.577 8036-8036/com.example.android.camera2video W/System.err: at android.hardware.camera2.impl.CameraDeviceImpl.createCaptureRequest(CameraDeviceImpl.java:476)05-16 13:44:29.577 8036-8036/com.example.android.camera2video W/System.err: at com.example.android.camera2video.Camera2VideoFragment.startPreview(Camera2VideoFragment.java:495)05-16 13:44:29.577 8036-8036/com.example.android.camera2video W/System.err: at com.example.android.camera2video.Camera2VideoFragment.stopRecordingVideo(Camera2VideoFragment.java:687)05-16 13:44:29.577 8036-8036/com.example.android.camera2video W/System.err: at com.example.android.camera2video.Camera2VideoFragment.onClick(Camera2VideoFragment.java:313)05-16 13:44:29.577 8036-8036/com.example.android.camera2video W/System.err: at android.view.View.performClick(View.java:4909)05-16 13:44:29.577 8036-8036/com.example.android.camera2video W/System.err: at android.view.View$PerformClick.run(View.java:20390)05-16 13:44:29.577 8036-8036/com.example.android.camera2video W/System.err: at android.os.Handler.handleCallback(Handler.java:815)05-16 13:44:29.577 8036-8036/com.example.android.camera2video W/System.err: at android.os.Handler.dispatchMessage(Handler.java:104)05-16 13:44:29.577 8036-8036/com.example.android.camera2video W/System.err: at android.os.Looper.loop(Looper.java:194)05-16 13:44:29.577 8036-8036/com.example.android.camera2video W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5848)05-16 13:44:29.577 8036-8036/com.example.android.camera2video W/System.err: at java.lang.reflect.Method.invoke(Native Method)05-16 13:44:29.577 8036-8036/com.example.android.camera2video W/System.err: at java.lang.reflect.Method.invoke(Method.java:372)05-16 13:44:29.577 8036-8036/com.example.android.camera2video W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)05-16 13:44:29.577 8036-8036/com.example.android.camera2video W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)05-16 13:44:33.518 8036-8092/com.example.android.camera2video E/RequestThread-0: Timed out while waiting for request to complete.05-16 13:44:33.519 8036-8092/com.example.android.camera2video W/CaptureCollector: Preview buffers dropped for request: 105-16 13:44:33.519 8036-8092/com.example.android.camera2video E/CameraDeviceState: Cannot receive result while in state: 005-16 13:44:33.519 8036-8092/com.example.android.camera2video E/CameraDeviceState: Cannot receive result while in state: 005-16 13:44:33.520 8036-8092/com.example.android.camera2video E/CameraDeviceState: Cannot receive result while in state: 005-16 13:44:33.542 8036-8098/com.example.android.camera2video W/MessageQueue: Handler (android.os.Handler) {e372429} sending message to a Handler on a dead thread java.lang.IllegalStateException: Handler (android.os.Handler) {e372429} sending message to a Handler on a dead thread at android.os.MessageQueue.enqueueMessage(MessageQueue.java:337) at android.os.Handler.enqueueMessage(Handler.java:707) at android.os.Handler.sendMessageAtTime(Handler.java:609) at android.os.Handler.sendMessageDelayed(Handler.java:579) at android.os.Handler.sendMessage(Handler.java:516) at android.hardware.camera2.legacy.GLThreadManager.queueNewFrame(GLThreadManager.java:197) at android.hardware.camera2.legacy.RequestThreadManager$4.onFrameAvailable(RequestThreadManager.java:260) at android.graphics.SurfaceTexture$1.handleMessage(SurfaceTexture.java:203) at android.os.Handler.dispatchMessage(Handler.java:111) at android.os.Looper.loop(Looper.java:194) at android.os.HandlerThread.run(HandlerThread.java:61)05-16 13:44:33.550 8036-8115/com.example.android.camera2video E/BufferQueueProducer: [unnamed-8036-2](this:0xae51d800,id:2,api:4,p:289,c:-1) queueBuffer: BufferQueue has been abandoned05-16 13:44:33.551 8036-8058/com.example.android.camera2video E/BufferQueueProducer: [unnamed-8036-2](this:0xae51d800,id:2,api:4,p:289,c:-1) dequeueBuffer: BufferQueue has been abandoned05-16 13:44:33.747 8036-8057/com.example.android.camera2video E/BufferQueueProducer: [unnamed-8036-2](this:0xae51d800,id:2,api:4,p:289,c:-1) cancelBuffer: BufferQueue has been abandoned05-16 13:44:33.748 8036-8115/com.example.android.camera2video E/BufferQueueProducer: [unnamed-8036-2](this:0xae51d800,id:2,api:4,p:289,c:-1) cancelBuffer: BufferQueue has been abandoned05-16 13:44:33.749 8036-8058/com.example.android.camera2video E/BufferQueueProducer: [unnamed-8036-2](this:0xae51d800,id:2,api:4,p:289,c:-1) cancelBuffer: BufferQueue has been abandoned05-16 13:44:33.749 8036-8057/com.example.android.camera2video E/BufferQueueProducer: [unnamed-8036-2](this:0xae51d800,id:2,api:4,p:289,c:-1) cancelBuffer: BufferQueue has been abandoned05-16 13:44:33.750 8036-8115/com.example.android.camera2video E/BufferQueueProducer: [unnamed-8036-2](this:0xae51d800,id:2,api:4,p:289,c:-1) cancelBuffer: BufferQueue has been abandoned
解决办法:
private void stopRecordingVideo() { // UI mIsRecordingVideo = false; mButtonVideo.setText(R.string.record); //必须将这一句放置到MediaRecorder停止释放的前面, //否则就会造成,接收数据方(Encoder)已经停止了,而发送数据的session还在运行。才会造成以上错误。 startPreview(); // Stop recording mMediaRecorder.stop(); mMediaRecorder.reset(); Activity activity = getActivity(); if (null != activity) { Toast.makeText(activity, "Video saved: " + mNextVideoAbsolutePath, Toast.LENGTH_SHORT).show(); Log.d(TAG, "Video saved: " + mNextVideoAbsolutePath); } mNextVideoAbsolutePath = null; }
这样就能保证在stopRecordingVideo的时候不会崩溃了。
代码地址:Camara2-Video-Demo-fixed
2 0
- 官方Camera2 video Demo崩溃的修正
- 微信支付官方demo修正版
- 官方说明文件的修正
- Camera2 Android相机Demo
- H5的video元素实现的Demo
- Android camera2官方API文档中文翻译
- camera2
- camera2
- AR Video Demo
- video全页面 demo
- 关于官方的micropython demo 的使用
- Extjs4 学习portal 的官方demo
- apple 苹果官方的demo 下载地址
- 解析Tensorflow官方PTB模型的demo
- 百度地图官方Demo的运行使用
- 关于JFinal官方Demo的理解
- 适合新人学习的iOS官方Demo
- 解决AndroidCamera2官方Demo的bug
- Way to Go
- 删除链表中的元素
- React Native 页面之间传值、回传数据
- 面试复习—网络知识点
- TCP之深入浅出send和recv
- 官方Camera2 video Demo崩溃的修正
- TCP/IP 三次握手与四次挥手详解
- 本原根和离散对数
- mapper提示Could not autowire. No beans of … type found?
- 面试复习—操作系统知识点
- lucene6按照整形数据排序搜索结果
- Codeforces Round #404 (Div. 2) B题
- (二)jmeter beanShell jar调用
- 数据库-数据库、基本表、视图的创建,触发器的使用