amcap sample code 분석 초보 - 공통 Filter graph 구축 기술 학습
1 구성 필터
이제 Filter Graph에 AVI Mux Filter 코드를 추가합니다.
IBaseFilter *pMux;
hr=AddFilterByCLSXD(pGraph, CLSID_Avidest, L"AVI Mux", ipMux);
if {SUCCEEDED(hr))
/* …•/
pMux->Release{);
}
모든 Filter가 CoCreatcInstance 함수를 통해 만들어지는 것은 아닙니다. 대부분 Audio Canpressore 디렉터리에 등록된 Filter입니다. (이것들은 CLSID ACMWrapper로 Filter를 포장합니다.)
대부분의 Video Compressors에 등록된 Filter(CLSID AV1Co로 Filter를 포장함)와 하드웨어(WDM 또는 VFW)를 대표하는 포장 Filter는 일일이 열거하는 방식으로 만들어야 한다.
구조 Filter 상황 분석
코드를 보십시오. 모든 CoCreate Instance를 검색하십시오.amcap에 있습니다.cpp에 아는 게 있어요. 다른 건 계속 있어요.
amcap.cpp(893): HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC,
amcap.cpp(2802): hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
amcap.cpp(3907): hr = CoCreateInstance((REFCLSID)CLSID_CaptureGraphBuilder2,
todo: 매거진 사용 유형
후속
2 Filter가 연결되지 않았습니다 pin
코드에서 잠시 사용하지 않았습니다.
2.5 [중요] Filter의 기초 지식 보충
육기명이 추천한mpeg 합성 필터 디자인 추가
여기에는 먼저 그림을 그리지 않고 단도직입적으로 말하다.
Video stream --> mpeg 비디오 encoder --> mpeg mux Filter (합성) --> file writer
오디오 앞 두 개는 독립적이고, 후속은 mux로 통합된다
3 Filter 2개 연결
키워드addFilter
우선 검색 결과를 보십시오. 책에 있는ddfilterbyclsid를 사용하지 않았습니다. 기본적으로 봉인된ddfilter입니다
앞의 검색 결과를 주목하다
amcap.cpp(1104): hr = gcap.pFg->AddFilter(gcap.pVCap, gcap.wachFriendlyName); amcap.cpp(1294): hr = gcap.pFg->AddFilter(gcap.pACap, wachAudioFriendlyName); SampleCGB.cpp(335): hr = graph_->AddFilter( pMPEG2Demux_, L"Dump"); SampleCGB.cpp(640): return graph_->AddFilter( static_cast
다음은 두 번째 매개 변수입니다. 분해를 기다리는 문제입니다.
//Add the video capture filter to the graph with its friendly name hr = gcap.pFg->AddFilter(gcap.pVCap,gcap.wachFriendlyName); if(hr != NOERROR) { ErrMsg(TEXT("Error %x: Cannot add vidcap to filtergraph"), hr); goto InitCapFiltersFail; }
분석connectfilter
connectfilter를 다시 분석합니다. 검색 코드는samplergb만 있습니다.cpp가 있습니다. 메인 프로그램이 없습니다.
결과
SampleCGB.h(190): HRESULT ConnectFilters(CComPtr
분석
SampleCGB.h(190): HRESULT ConnectFilters(CcomPtr
소결
기초로 돌아가면,
Video stream -->mpeg 비디오 encoder -->mpeg mux Filter(합성) -->file writer
현재 encoder와 mux의 연결만 보이고, 다른 파일을 쓰는 등 Filter connect가 추가로 발견될 것입니다.
4 [대량 필요 분석, 미완성] 인터페이스 찾기초보QueryInterface
query Interface를 키워드로 하여 대량으로 사용되는 곳을 보았는데 한마디로 사용 빈도가 높은api이기 때문에 반드시 알아야 한다.
amcap.cpp(146): stdMETHODIMP QueryInterface(REFIID iid, void **p) amcap.cpp(804): if(S_OK == punk->QueryInterface(IID_IBaseFilter, (void **) &pf)) amcap.cpp(1204): if(pP->QueryInterface(IID_IKsPropertySet, amcap.cpp(1441): hr = gcap.pRender->QueryInterface(IID_IConfigAviMux, (void **)&gcap.pConfigAviMux); amcap.cpp(1514): gcap.pSink->QueryInterface( IID_IBaseFilter, reinterpret_cast
키워드findFilter
FindPin 키워드 찾기,findfilter 추가
본질적으로queryInterface 함수를 사용하여 찾습니다
결과가 많은데, 특히amcap 함수에서
키워드 FindPin으로 검색한 결과 다음과 같이 중점 분석 영역을 그립니다.
AMCap\SampleCGB.h(96): stdMETHOD(FindPin)( IUnknown *pSource, AMCap\SampleCGB.h(136): HRESULT FindPin( AMCap\amcap.cpp(1320): hr = gcap.pBuilder->FindPin(gcap.pVCap, PINDIR_OUTPUT, &PIN_CATEGORY_VBI, AMCap\amcap.cpp(1323): hr = gcap.pBuilder->FindPin(gcap.pVCap, PINDIR_OUTPUT, &PIN_CATEGORY_CC, AMCap\SampleCGB.cpp(199):ISampleCaptureGraphBuilder::FindPin( IUnknown *pSource, AMCap\SampleCGB.cpp(207): return graphBuilder2_->FindPin( pSource, pindir, pCategory, pType, AMCap\SampleCGB.cpp(508):HRESULT ISampleCaptureGraphBuilder::FindPin( AMCap\SampleCGB.cpp(804): hr = FindPin( pFilter, pinMedium, PINDIR_INPUT, TRUE, pPin ); AMCap\SampleCGB.cpp(1419): hr = graphBuilder2_->FindPin( AMCap\SampleCGB.cpp(1507): hr = graphBuilder2_->FindPin(
현재 이상findpin을 분석한 결과 주로pin을 찾고 닫기 작업을 수행하는 데 집중된 것을 발견하였다
// create the capture filters of the graph. We need to keep them loaded from
// the beginning, so we can set parameters on them and have them remembered
//
BOOL InitCapFilters()
{
//********//
SkipAudio:
// Can this filter do closed captioning?
IPin *pPin;
hr = gcap.pBuilder->FindPin(gcap.pVCap, PINDIR_OUTPUT, &PIN_CATEGORY_VBI,
NULL, FALSE, 0, &pPin);//------------------
if(hr != S_OK)
hr = gcap.pBuilder->FindPin(gcap.pVCap, PINDIR_OUTPUT, &PIN_CATEGORY_CC,
NULL, FALSE, 0, &pPin);
if(hr == S_OK)
{
pPin->Release();
gcap.fCCAvail = TRUE;
}
else
{
gcap.fCapCC = FALSE; // can't capture it, then
}
메서드 요약:
이상은 국부api로 볼 때 사용하는데 이렇게 기능에서 벗어나는 학습은 일방적이다.
가장 좋은 것은 기능적인 각도에서 출발하는 것이다.다음 단계는amcap의 변경과 결합하여 출발한다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.