ACameraCaptureSession_captureCallbacks* NDKCamera::GetCaptureCallback() { static ACameraCaptureSession_captureCallbacks captureListener{ .context = this, .onCaptureStarted = nullptr, .onCaptureProgressed = nullptr, .onCaptureCompleted = nullptr, .onCaptureFailed = SessionCaptureCallback_OnFailed, .onCaptureSequenceCompleted = SessionCaptureCallback_OnSequenceEnd, .onCaptureSequenceAborted = SessionCaptureCallback_OnSequenceAborted, .onCaptureBufferLost = nullptr, }; return &captureListener; } /** * Process JPG capture SessionCaptureCallback_OnFailed event * If this is current JPG capture session, simply resume preview * @param session the capture session that failed * @param request the capture request that failed * @param failure for additional fail info. */ void NDKCamera::OnCaptureFailed(ACameraCaptureSession* session, ACaptureRequest* request, ACameraCaptureFailure* failure) { if (valid_ && request == requests_[JPG_CAPTURE_REQUEST_IDX].request_) { ASSERT(failure->sequenceId == requests_[JPG_CAPTURE_REQUEST_IDX].sessionSequenceId_, "Error jpg sequence id") StartPreview(true); } } /** * Process event from JPEG capture * SessionCaptureCallback_OnSequenceEnd() * SessionCaptureCallback_OnSequenceAborted() * * If this is jpg capture, turn back on preview after a catpure. */ void NDKCamera::OnCaptureSequenceEnd(ACameraCaptureSession* session, int sequenceId, int64_t frameNumber) { if (sequenceId != requests_[JPG_CAPTURE_REQUEST_IDX].sessionSequenceId_) return; // resume preview CALL_SESSION(setRepeatingRequest(captureSession_, nullptr, 1, &requests_[PREVIEW_REQUEST_IDX].request_, nullptr)); }
/* 函数: BulidPrivewGraph() 功能: 创建函数 */ int CCaptureAudio::BulidCaptureGraph() { HRESULT hr=NOERROR; if(m_iDeviceId <0) { return -1; } // 解决声卡不存在时出现调用程序异常的问题 [10/23/2014-16:28:00 Dingshuai] if(m_pBaseFilter==NULL) { return -1; } GUID pCategorySuc = PIN_CATEGORY_PREVIEW; GUID pCategoryFail = PIN_CATEGORY_CAPTURE; if(m_nPinType==0) { pCategorySuc = PIN_CATEGORY_PREVIEW; pCategoryFail = PIN_CATEGORY_CAPTURE; } else { pCategorySuc = PIN_CATEGORY_CAPTURE; pCategoryFail = PIN_CATEGORY_PREVIEW; } hr = SetAudioFormat(m_nChannels,m_nBytesPerSample,m_nSampleRate,m_nAudioBufferType,m_nPinType); if(FAILED(hr)) { //ERR_DEBUG("SetAudioFormat Failed"); return -1; } hr = CreateCaptureSampleGrabber(); if(FAILED(hr)) { SAFE_RELEASE(m_pSampleGrabberFilter); SAFE_RELEASE(m_pSampleGrabber); //ERR_DEBUG("CreateCaptureSampleGrabber Failed"); return -1; } hr = m_pCaptureGraphBulid->RenderStream(&pCategorySuc,&MEDIATYPE_Audio,m_pBaseFilter,NULL,m_pSampleGrabberFilter); if(FAILED(hr)) { //ERR_DEBUG("PrivewVideoDev RenderStream Failed "); return -1; } if(m_bThread)//标识是否创建线程 { m_pSampleGrabber->SetBufferSamples(TRUE); m_pSampleGrabber->SetOneShot(FALSE); } else { m_pSampleGrabber->SetBufferSamples(TRUE); m_pSampleGrabber->SetOneShot(FALSE); m_cSampleGrabberCB.SetDataInfo(-1, m_nDataType); int nMode=1;//0--SampleCB,1--BufferCB m_pSampleGrabber->SetCallback(&m_cSampleGrabberCB, nMode); } hr = StartPreview(); if(FAILED(hr)) { return -1; } return 1; }