Camera录像中出现的卡死问题,会导致其他操作ANR

发布时间 2023-10-11 15:47:22作者: 苏小七

调试的过程中遇到这样一个问题,在停止录像恢复预览的时候会卡住,导致再做其他操作时出现ANR.

看过log如下

2023-09-27 15:11:43.167 514-6236/? W/CameraSource: Timed out waiting for incoming camera video frames: 828023629 us
2023-09-27 15:11:46.168 514-6236/? W/CameraSource: Timed out waiting for incoming camera video frames: 828023629 us

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

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

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

status_t CameraSource::read(
        MediaBufferBase **buffer, const ReadOptions *options) {
    ALOGV("read");

    *buffer = NULL;

    int64_t seekTimeUs;
    ReadOptions::SeekMode mode;
    if (options && options->getSeekTo(&seekTimeUs, &mode)) {
        return ERROR_UNSUPPORTED;
    }

    sp<IMemory> frame;
    int64_t frameTime;

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

        frameTime = *mFrameTimes.begin();
        mFrameTimes.erase(mFrameTimes.begin());
        mFramesBeingEncoded.push_back(frame);
        *buffer = new MediaBuffer(frame->pointer(), frame->size());
        (*buffer)->setObserver(this);
        (*buffer)->add_ref();
        (*buffer)->meta_data().setInt64(kKeyTime, frameTime);
    }
    return OK;
}

卡在循环里不能出来,是什么原因导致的呢?烦请大佬们指教