Camera应用在调试中遇到的一些问题

在Android应用中同时使用Camera进行录像和拍照时,有时会出现录像过程中拍照导致程序卡死的问题,表现为ANR。经过调试,发现在`CameraSource.cpp`中存在等待视频帧的超时问题。通过修改循环限制避免程序卡住,解决了该问题。此外,USB热插拔可能导致设备状态无法更新,从而引发连接错误。在`CameraService.cpp`中,前一个Camera对象未释放导致新连接被拒绝。通过注释掉返回NULL的代码,使应用在异常情况下仍能继续运行。目前修改后未再出现上述问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       调试的过程中遇到过这样一个问题,不知道有没有人遇到过。另外我目前程序的做法不知道是不是合理暂且也难说,就单说问题吧。

       因为根据需求需要在应用中同时调用Camera设备进行录像,并同时还要实现边录边拍照的功能,功能实现倒是都实现了。但是有个问题就是有概率会出现在录像的过程中操作拍照后程序会卡死,录像停止。继续操作则会出现ANR的问题。

      看过log如下

            W/CameraSource(  855): Timed out waiting for incoming camera video frames: 1273404957 us

        当程序卡住时会反复弹此log。看的出事某个操作超时导致的,因此继续跟进log打印的代码中

            \android\frameworks\av\media\libstagefright下的    CameraSource.cpp

             函数status_t CameraSource::read内找到相关代码如下:

             while (mStarted && mFramesReceived.empty()) {
                    if (NO_ERROR !=  mFrameAvailableCondition.waitRelative(mLock,
                           mTimeBetweenFrameCaptureUs * 1000LL + CAMERA_SOURCE_TIMEOUT_NS)) {
                   if (mCameraRecordingProxy != 0 &&
                           !mCameraRecordingProxy->asBinder()->isBinderAlive()) {
                           ALOGW("camera recording proxy is gone");
                         return ERROR_END_OF_STREAM;
                        }
                      ALOGW("Timed out waiting for incoming camera video frames: %lld us",
                      mLastFrameTimestampUs);
               }

            可以看到出现此情况可能是卡在while循环中导致的,因此做了修改使其在循环到5次的时候自动跳出循环向下执行,即使有问题也不至于卡住界面,后来测试的时候暂时未发现有再死的情况。


        另外一个问题是经常因为USB的热插拔会引起设备状态无法在系统中更新,因此会有如下的log出现。

             W/CameraService(  855): CameraService::connect X (pid 5335) rejected (existing client).

         跟进源码后找到打印的相关代码

           \android\frameworks\av\services\camera\libcameraservice下的CameraService.cpp

            Mutex::Autolock lock(mServiceLock);
                    if (mClient[cameraId] != 0) {
                    client = mClient[cameraId].promote();
                    if (client != 0) {
                         if (cameraClient->asBinder() == client->getCameraClient()->asBinder()) {
                                LOG1("CameraService::connect X (pid %d) (the same client)", callingPid);
                                return client;
                       } else {
                                ALOGW("CameraService::connect X (pid %d) rejected (existing client).",callingPid);
                               return NULL;
                        }
                  }
           mClient[cameraId].clear();
    }

           暂时理解的就是因为前一个Camera的对象没有释放,导致后面应用resume的时候会重新初始化client但是connect的却是最开始初始化的client,因此被之前的client拒绝了,并且后面又清空了client。我的改动是注释了return NULL,使其不会在connect异常的时候卡住。修改过后测试暂没问题,有知道更多相关的问题的同学可一起交流。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值