调试的过程中遇到过这样一个问题,不知道有没有人遇到过。另外我目前程序的做法不知道是不是合理暂且也难说,就单说问题吧。
因为根据需求需要在应用中同时调用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异常的时候卡住。修改过后测试暂没问题,有知道更多相关的问题的同学可一起交流。