DirectShowシステムを休出にて構築中
関連記事
- 不具合解析オワタ デバイスドライバの不具合じゃねぇ~か(汗 【2015年03月13日(金)】
- 【C#】DirectShow.net + LogicoolのカメラでサンプルDxSnapがうまく動かない! 【2012年03月21日(水)】
- 出来た! 【2007年11月29日(木)】
- IBaseFilter 【2007年11月28日(水)】
- ぴ~~~~んち! 【2007年11月28日(水)】
某所にてお仕事中
大トラブル大会,開催になってしまい
午前中で終わる予定が,午後いっぱいまでかかってしまったり
う~む,DirectShowは奥が深い(爆
1.カメラキャプチャユニットがなぜか,PAL映像信号入力がデフォルト
NTSC信号にモード切替やってやる必要が出てきた
2.カメラキャプチャユニットから送られてくる映像データは
これまた変態の,UYVYフォーマット.これをRGBフォーマットに変換する必要あり
これらの対策に,えらい目にあったり...
1.は,キャプチャデバイスフィルタ(最上位段)を
IAMAnalogVideoDecoderインターフェースにキャストして
put_TVFormat()メソッドを叩けばOK
2.は,SmartTeeを使って,出力を2つにわけ,サンプルグラバとレンダラーに結合
それぞれの出力に,AVI デコンプレッサ フィルタ(CLSID_AVIDec)を挟めばOKでしたわん
こんな感じ?
でもまぁ,そろそろ,目処付きそうな予感
山は完全に越えたしねぇ~
そろそろ,帰るべ 😳
通りすがりの書き込みですm(_ _)m
ちょうどDirectShowをやっていて同じようにキャプチャデバイスが
PALになっておりそのまま取り込むと砂嵐の画像になります
ググるとココが検索されました(なんてタイムリーな話題)
1のIAMAnalogVideoDecoderをキャプチャデバイスフィルタにキャストするコードを
ご教授いただけませんか?
COMの知識余り無くTips意外に自分でコードが書けない初心者です
よろしくお願いいたします
>>メロン さま
ようこそ!
IAMAnalogVideoDecoderを利用したPAL->NTSCの切り替え,見つけるのけっこう大変でしたよぉ(汗
なお,前提として
うちでは,
Directshow.net
http://directshownet.sourceforge.net/
を利用して,C#にて実装してます
C++の場合は,C#のソース読み取って理解していただけると 🙂
あと,実際動いているコード中,必要部分を抜粋しましたんで
そこいらも注意です 😉
private void VideoInit()
{
DsDevice[] capDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
if (capDevices == null)
{
ErrorCD = ERRORCD_NOTDEVICE;
return;
}
try
{
// Set up the capture graph
bool fl = false;
foreach(DsDevice dv in capDevices)
{
if (dv.Name == devName)
{
SetupGraph( dv, iWidth, iHeight, iBPP, hControl); //Graphの初期化内で,PAL->NTSCのモード変換をやります
// tell the callback to ignore new images
m_PictureReady = new ManualResetEvent(false);
fl = true;
break;
}
}
if (fl == false)
{
ErrorCD = ERRORCD_NOTFOUNDDEVICE;
return;
}
}
catch
{
Dispose();
throw;
}
}
private void SetupGraph(DsDevice dev, int iWidth, int iHeight, short iBPP, Control hControl)
{
int hr;
ISampleGrabber sampGrabber = null;
IBaseFilter capFilter = null;
IPin pCaptureOut = null;
IPin pSampleIn = null;
IPin pRenderIn = null;
IAMAnalogVideoDecoder vdDec;
// Get the graphbuilder object
m_graphBuilder = new FilterGraph() as IFilterGraph2;
try
{
#if DEBUG
m_rot = new DsROTEntry(m_graphBuilder);
#endif
// add the video input device
hr = m_graphBuilder.AddSourceFilterForMoniker(dev.Mon, null, dev.Name, out capFilter);
DsError.ThrowExceptionForHR( hr );
vdDec = capFilter as IAMAnalogVideoDecoder; //PAL->NTSCのモード切替はこの2行です
vdDec.put_TVFormat(AnalogVideoStandard.NTSC_M);
//以下,永遠と初期化コードが続きます...
}
}
>くまさん
昨夜は素早くレス下さり有り難うございました
確かにIAMAnalogVideoDecoderを扱った日本語のサイトってないですね
(検索するだけで半日かかりました)
くまさんが書いて下さったのでこのブログが唯一のIAMAnalogVideoDecoderを扱った日本語ページということですね
お察し通りC++なので頂いたソースとMSDNの恐ろしく言葉足らずな説明を元に以下のようにくんでみたところなんとかNTSCでプライマリが変わるようになりました。
[キャプチャソース一部]
ICreateDevEnum *pDevEnum = NULL;
IMoniker *pMoniker = NULL;
IEnumMoniker *pClassEnum = NULL;
IAMAnalogVideoDecoder *pAVD = NULL;
(中略)
//ビデオキャプチャデバイス列挙子を取得
pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pClassEnum, 0);
if(pClassEnum == NULL)
{
MessageBox(NULL,”有効なビデオキャプチャデバイスは存在しません”,
“ERROR!”, MB_ICONERROR | MB_OK | MB_SETFOREGROUND | MB_TASKMODAL);
return ;
}
//最初に見つかったビデオキャプチャデバイスのフィルタ
pClassEnum -> Next(1, &pMoniker, &cFetched);
pMoniker -> BindToObject( 0, 0, IID_IBaseFilter, (void**)&pbf );
pbf->QueryInterface(IID_IAMAnalogVideoDecoder, (void**)&pAVD);
pAVD -> put_TVFormat(AnalogVideo_NTSC_M); //ココでNTSCに切り替え
無事コレで設定値を変更することはできたのですが
残念なことに砂嵐は治りませんでした(涙)
一度立ちあげ砂嵐画像をキャプチャした後、ソフトを落として再起動すると今度はちゃんとキャプチャできています
つまり、NTSCに切り替える前にデバイスがアナログ入力を内部の設定値で行ってしまっているため最初のキャプチャが治らない
ということですね
うざいのでソフトの中で同じ関数を2回回して回避しました・・・エンジニアにあるまじき暴挙です(反省)
>>メロン さま
m_pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pMediaControl);
m_pMediaControl->Run();
する前に,put_TVFormat()を呼び出すと
うちのキャプチャボックスは,PAL->NTSCへ綺麗に切り替わりましたです
キャプチャボックスの仕様ですかねぇ...
>>うざいのでソフトの中で同じ関数を2回回して回避しました・・・エンジニアにあるまじき暴挙です(反省)
動かすために,うちでも,けっこう強引なことやってますですよぉ(爆