Camera应用在调试中遇到的一些问题
2014-10-21 17:17
369 查看
调试的过程中遇到过这样一个问题,不知道有没有人遇到过。另外我目前程序的做法不知道是不是合理暂且也难说,就单说问题吧。
因为根据需求需要在应用中同时调用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异常的时候卡住。修改过后测试暂没问题,有知道更多相关的问题的同学可一起交流。
因为根据需求需要在应用中同时调用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异常的时候卡住。修改过后测试暂没问题,有知道更多相关的问题的同学可一起交流。
相关文章推荐
- 用ads调试时遇到的一些问题
- 在向数据库中插入客户端IP调试时遇到的一些问题
- 关于解决真机调试时DDMS里不能打开data文件夹时遇到的一些列问题
- 调试I2C遇到的一些问题
- cocos creator配置原生平台调试遇到的一些问题
- Kettle 在应用中遇到的一些问题和解决方法
- 调试笔记之 Flash Magic 下载程序 遇到的一些问题
- rk3126 平台上调试遇到的一些问题总结
- HadOOP部署和调试遇到的一些问题 V1.0.2
- 关于VS 使用GDB工具调试ADT下JNI时遇到的一些问题的解决
- Centos 部署rails应用遇到的一些问题
- 关于开发Android应用时写从图库选择头像功能时遇到的一些问题。
- DWR在实际项目中的应用以及在调试过程中遇到的问题
- 调试USB遇到的一些问题
- 最近oracle开发中遇到的一些问题及解决办法(四):调试存储过程--待续
- 创建Windows Azure应用中遇到的一些问题
- 做Camera应用时遇到的问题
- WebLogic 上部署Spring应用遇到的一些问题的解决
- 为安卓应用添加手势密码功能,遇到的一些问题以及解决方法
- 触摸评上调试应用遇到的问题