[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 12/13 04:59 / Filesize : 187 KB / Number-of Response : 595
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

DirectShowと戦うスレ Part 4



1 名前:デフォルトの名無しさん [2008/06/22(日) 18:38:21 ]
DirectShowプログラマーのみなさん。
メソッドのデッドロックとか、わけわからん現象多くないすか。
このスレに怒りやテクをぶつけましょう。

関連スレ
Win32API質問箱 Build67
pc11.2ch.net/test/read.cgi/tech/1212931246/
くだすれDirectX(超初心者用) part.3
pc11.2ch.net/test/read.cgi/tech/1193605500/
【C++】 DirectX初心者質問スレ Part17 【C】
pc11.2ch.net/test/read.cgi/tech/1207702556/
DirectX総合スレ (Part8)
pc11.2ch.net/test/read.cgi/gamedev/1205306118/
【PureVideo】DirectX Video Acceleration【AVIVO】
pc11.2ch.net/test/read.cgi/tech/1178285897/

449 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 03:25:58 ]
あんま詳しくない俺が答えてもいいかい?

qedit.hでググるとわかるが、そのまま#includeしてもエラーがでて使えないってだけ。
詳しくは自分で調べてくれ

450 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 06:17:59 ]
>>449Thx、その件の対応は下記urlを参考に行い、エラーは出ていないが
ttp://social.msdn.microsoft.com/forums/en-US/windowssdk/thread/ed097d2c-3d68-4f48-8448-277eaaf68252/
こうしとけば、OKってこと?



451 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 07:21:39 ]
どのレスを参考にしたかわからないけど、どの方法でも大丈夫そうだからOKだと思う

というか、なぜわざわざ英語を。英語得意じゃないんだから困った
MSDNか。公式フォーラムだからか。

452 名前:デフォルトの名無しさん mailto:sage [2009/05/31(日) 10:03:08 ]
>>451Thx
そうそう、公式フォーラムだったんで、俺も英語あまり良く分からないけど、参考にしました。
そして、やってみました
To compile qedit.h you must install the DirectX 9 SDK, to obtain the dxtrans.h header.
マニフェストをリソースにコンパイルしています...
Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
Copyright (C) Microsoft Corporation. All rights reserved.
との結果です、要約すると、コンパイラが、DirectX 9 SDKをインストールして、dxtrans.h もインクルーズしているような意味合いですね。
qedit.hの498行でコメントアウトして外したdxtrans.hをインクルーズするなんて、複雑な仕組みですよね??
COMの事をあまりよく知らないので、昨日からDirectShowのライブラリィを作っています、こんな調子で今日中にできるかな(^^;

453 名前:デフォルトの名無しさん mailto:sage [2009/06/02(火) 20:18:07 ]
GraphEditを使って、USBカメラのデータを、ASF形式で出力しWMPで見たいのですが、手順を教えてくださいませ。

454 名前:デフォルトの名無しさん [2009/06/12(金) 17:08:38 ]
VB.NETでDirectShowで動画を再生しながら
他の処理も行っていると動画が遅くなります。
しかし他の処理の中でDebug.Writelineで
イミディトウィンドウに文字を出し続けていると
動画が遅くならない謎の現象になっています。
これだとリリース出来ません。なにか知っている人が
いたら教えてもらえないでしょうか?

455 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 17:17:41 ]
再生を別スレッドに別けるとか

456 名前:454 mailto:sage [2009/06/15(月) 12:33:45 ]
455さんお返事ありがとうございます
別スレッドの中でWhileでDoEventsを呼び続けると
なんとかなりそうでした。まだわかりませんが。
全体の処理時間は少し遅くなりました。

457 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 13:54:47 ]
DirectShow編集サービス(DES)で、ファイルへレンダリング出来なくて困ってます。
流れ的には以下の様な感じで、Runの後にWaitForCompletion()内で例外発生。。

・IRenderEngineをCoCreateInstance()で作る。
・pRenderEngine->SetTimelineObject()でTimelineをセットする。
・pRenderEngine->ConnectFrontEnd()呼び出し
・ICaptureGraphBuilder2をCoCreateInstance()で作る。
・pRenderEngine->GetFilterGraph( &pGraph );
・pBuilder2->SetFiltergraph(pGraph);
・pBuilder2->SetOutputFileName(&MEDIASUBTYPE_Avi..)で出力先指定
・TimelineのGroupのOuputPinを、Builder2でRenderStream()
・IMediaEvent、IMediaControl取得
・Run()
・IMediaEventのWaitForCompletionで、例外発生...orz

ウィンドウへのレンダリングは成功しています。

最終的にはスマートレンダリングしたいのですが、ISmartRenderEngineの
使い方がほとんど資料が無くて困っています。



458 名前:デフォルトの名無しさん [2009/06/25(木) 16:05:52 ]
1フレーム毎の音声データを取得する方法をおしえてください

459 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 00:04:24 ]
>457
うろ覚えで役に立つか分からんけど…
・直接RenderStreamへ接続したら駄目だったはず。(MUXが必要。)
・Timelineを生成するまでの各段階でのエラー判定で色々悩まされた記憶がある。

460 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 15:39:02 ]
>>459
ありがとうございます。
DESは資料が少なくて困りますよねー。
またよろしくです。

461 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 11:02:38 ]
ファイルの変換をしたい。
ICaptureGraphBuilder2::SetOutputFileName()って、MUXを返すけど、
任意のMUXを指定したい場合は、どうするのかな?
AddFilterでMUXとSinkを設定するの?

462 名前:デフォルトの名無しさん [2009/07/09(木) 00:58:42 ]
DirectShowでフィルタを作っているんですが、
フィルタを生成時にモーダレスダイアログを表示するサンプルありませんか?
アプリではないため親ウィンドウが存在せず、
hWndも取れないしインスタンスハンドラも取れないもんでやり方ちょっと難しいっす。

463 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 01:12:59 ]
>>462
コンストラクタかCreateInstanceかQueryInterfaceかでモードレスダイアログを
作るなりポップアップするなりすればいいんでないの?

もしかしてプロパティページの実装の仕方を聞いてる?

464 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 01:16:47 ]
普通にそのスレッドでメッセージループ作って回せば?
窓の作り方知っていれば特に難しい事でないけど。

465 名前:デフォルトの名無しさん [2009/07/09(木) 01:31:07 ]
プロパティページではないです。ちなみにプロパティページは楽に作れます。

こんすとらくたでモーダレスダイアログ作りたい。

ですが、いまいちわからず…
デスクトップからハンドラ引っ張ってメッセージループ処理に飛ばそうとして失敗しました。
そこで参考サイトをみて見比べようと思った次第です

466 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 10:12:12 ]
メッセージループ処理はどう書いてますか?
ウインドウは作れてるけどウインドウを
うまく動かせないとかなら、
メッセージループ処理に問題があるかもしれない。

もう少し問題点を詳しく書いてみたら?

467 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 12:18:57 ]
DirectShow編集サービスでTimelineをMPEG2でレンダリング出力したいのですが、うまく出来ません。
ICaptureGraphBuilder2::RenderStream()に、MPEG2のエンコーダーを指定してます。
Muxは、最初はSetOutputFileName()で返ってきたのを使っていましたが、エラーとなったため、
MPEG2のMuxerとMPEGのFileWriterを作り、2つのピンを繋いで、そのMuxを渡していますが、
やっぱりRenderStream()でE_FAILが返ってきます。
Encoder、Muxer、FileWriterは、GraphEditで繋いで動くのは確認しています。




468 名前:467続き mailto:sage [2009/07/09(木) 12:20:03 ]
IRenderEngine* pRenderEngine; 事前に作ってあります
ICaptureGraphBuilder2* pBuilder2; 事前に作ってあります

pRenderEngine->SetTimelineObject( pTimeline );
pRenderEngine->ConnectFrontEnd();

IGraphBuilder* pGraph;
pRenderEngine->GetFilterGraph( &pGraph );
m_pBuilder2->SetFiltergraph(pGraph);

// File Writer作成
CComPtr<IBaseFilter> DS_FileWriter;
CComPtr<IFileSinkFilter> DS_FileSink;
DS_FileWriter.CoCreateInstance(CLSID_MpegFileWriter);
DS_FileWriter.QueryInterface<IFileSinkFilter>(&DS_FileSink);
DS_FileSink->SetFileName(L"c:VideoTest.mpg", NULL);
pGraph->AddFilter( DS_FileWriter, L"MPEG File Writer");

// Mux作成
CComPtr<IBaseFilter> DS_Mux;
DS_Mux.CoCreateInstance(CLSID_MPEG2_Muxer);
pGraph->AddFilter( DS_Mux, L"MPEG2 Muxer");

// ピン接続
CComPtr<IPin> p, pin;
DS_Mux->FindPin(L"Output", &p);    // Muxerの出力ピン
DS_FileWriter->FindPin(L"Input", &pin);// Writerの入力ピン
pGraph->Connect(p, pin);        // ピン接続

(続く)

469 名前:467続き mailto:sage [2009/07/09(木) 12:21:43 ]
// グループ内をループし、出力ピンを取得する。
long NumGroups;
pTimeline->GetGroupCount(&NumGroups);
for (int i = 0; i < NumGroups; i++)
{
    IAMTimelineGroup* pGroup = NULL;
    pTimeline->GetGroup((IAMTimelineObj**)&pGroup, i);
    IPin *pPin;
    if (pRenderEngine->GetGroupOutputPin(i, &pPin) == S_OK)
    {
        CComPtr<IBaseFilter> DS_Compressor;
        if(i == 0){
          // Videoグループ用のコンプレッサフィルタを作成する。
          DS_Compressor.CoCreateInstance(CLSID_MPEG2_Compressor);
        }
        // ピンを接続する。
        hr = m_pBuilder2->RenderStream(NULL, NULL, pPin, DS_Compressor, DS_Mux); ←これがE_FAIL
        SAFE_RELEASE(pPin);
    }
}

470 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 13:08:26 ]
DESは使ったことないので見当違いかもしれませんが、
DS_Compressorをフィルタグラフに登録(AddFilter)してないのは問題ないんですか?

471 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 14:23:02 ]
>>470
それです、それでした!!
とりあえずエラーなしでMPEG2ファイル書き出せました!!
自分でAddFilterしなくちゃダメなんですねー。
有難うございますーm(__)m

472 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 01:23:12 ]
質問です
DirectShowでGeekなページを参考に動画再生をするプログラムを作りました
www.geekpage.jp/programming/directshow/change-rate.php
参考URLでは『put_Rateの引数を2.0などに変更すると倍速再生になります。
put_Rateの引数に負の値(マイナスの値)を渡すと巻き戻し再生になります』
とありますが、

put_Rateの引数を負の値にしても大部分のフィルタは逆再生をサポートしていないため実行されません。

そこでIMediaSeekingかIMediaPositionを用いて巻き戻しをするプログラムを作りたいのですが、
どうすればよいのやら困っています。
何か良い考えはないでしょうか?
是非知恵をおかしください!

473 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 02:03:09 ]
DirectShowのスレでも質問したのですが、スレの勢いを考えてこちらにも質問させていただきます。

DirectShowでGeekなページを参考に動画再生をするプログラムを作りました
www.geekpage.jp/programming/directshow/change-rate.php
参考URLでは『put_Rateの引数を2.0などに変更すると倍速再生になります。
put_Rateの引数に負の値(マイナスの値)を渡すと巻き戻し再生になります』
とありますが、

pMediaPosition->put_Rate(0.5);
のput_Rateの引数を負の値にしても大部分のフィルタは逆再生をサポートしていないため実行されません。

そこでIMediaSeekingかIMediaPositionを用いて、または用いなくてもいいのでdirectshowで
動画の巻き戻しをするプログラムを作りたいのですが、どうすればよいのやら困っています。
何か良い考えはないでしょうか?
是非知恵をおかしください!

474 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 02:04:06 ]
誤爆しました。すみません

475 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 04:43:47 ]
どんな動画をどんな風に逆再生するのかわからんけど
自前で逆再生をサポートしたフィルタを作成するか、
適当に逆方向にシークさせていくかぐらいしかないんじゃない?

てかマルチポスト・・・

476 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 10:41:06 ]
Pause状態にしておいて、10秒、9秒、8秒…てな感じにシークしていけばいいんじゃない?
逆方向再生をサポートしてない限りスムーズには出来ない。

477 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 11:19:00 ]
なぜ「大部分のフィルタは逆再生をサポートしていない」のかよく考えてください。
キーワードは「MPEG」「フレーム間予測」・・・

これらを理解した上で、あなたならどのように逆方向再生を実現しますか?
たぶんMPEG系ではTIME_FORMAT_FRAMEが使えないので、
1枚ずつシークとか難しいと思います。



478 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 14:11:33 ]
MPEGならSBE以外でもビデオアナライザフィルタは使えるのかな。
使えてもかなりガックリな結果しか得られないけど。

479 名前:デフォルトの名無しさん [2009/07/10(金) 19:57:34 ]
>>466
未だフィルタでモーダレスダイアログを表示するプログラムが出来ない
ので教えてください。

詰まっている箇所はインスタンスハンドルの取得だと思います。

コンソールアプリにて以下のソースでダイアログが表示することを確認。
main()
{
printf("ddd");

g_hDlg = CreateDialog( NULL, (LPCTSTR)IDD_DIALOG1, NULL,(DLGPROC)DlgProc);
ShowWindow( g_hDlg, SW_SHOW );

}

これをそのままDirectShowサンプルのNULLフィルタに移植
CNullNull::CNullNull(TCHAR *tszName, LPUNKNOWN punk, HRESULT *phr)
: CTransformFilter(tszName, punk, CLSID_Algorithm)
{
g_hDlg = CreateDialog( NULL, (LPCTSTR)IDD_DIALOG1, NULL,(DLGPROC)DlgProc);
ShowWindow( g_hDlg, SW_SHOW );
}
すると「g_hDlg」は0になりメッセージループ処理には飛びません

480 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 00:32:58 ]
そんだけわかってなんで、リファレンスを読まないの?
NULLって何?アフォ?
そしてスレ違い

481 名前:デフォルトの名無しさん [2009/07/11(土) 01:19:00 ]
>>480
反応ありがとうございます。
コーディングする前からDirectShowフィルタでの
インスタンスハンドルの取得方法を悩んでいました。

CreateDialogの3つめの引数NULLの
hWndはデスクトップを親にするために0でいいと思う。

1つめの引数はインスタンスハンドルを書けばいいのですが
何を書いたらよいかわかりません。

普通WinAPIではWinMainの引数として与えられていたり
GetWindowLong、GetModuleHandleなどで取得できます。
しかしFilterでは出来ないのです。

よかったら取得方法を教えてください。

482 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 01:23:23 ]
IDD_DIALOG1 のあるモジュールのハンドルに決まってるだろ。

483 名前:デフォルトの名無しさん [2009/07/11(土) 09:27:25 ]
>>482
IDD_DIALOG1 のあるモジュールのハンドル

これがわかりません。
IDD_DIALOG1はフィルタ自身が持っています。

メッセージボックスやオープンCVの窓は表示出来る。なんでダイアログが上手くいかないんだろう

484 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 10:43:05 ]
たしかdllmainの引数に入ってるからそれをどっかに保存すればいい

正直フィルタにダイアログを生成させる仕様から考え直したほうがいいと思うけど

485 名前:デフォルトの名無しさん [2009/07/11(土) 14:30:36 ]
>>484
ありがとう。確認してみます。
仕様についてはデバッグ用であり、グラフエディット上でパケットモニタしたいと考えてました。
フィルタで枠実装しておけばアプリケーションで問題あっても容易にデバッグできるから…

486 名前:デフォルトの名無しさん mailto:sage [2009/07/13(月) 12:06:25 ]
質問です。

ハードディスク上ではなく、メモリ上に(ごく小さい)AVIファイルを読み込んでから
再生させたいと思っているのですが、ソースフィルタには何を使えば良いでしょうか?
もしくは、IGraphBuilder::RenderFile()で直接メモリを指定する方法などは
ありますでしょうか?

487 名前:デフォルトの名無しさん mailto:sage [2009/07/13(月) 12:42:37 ]
msdn.microsoft.com/ja-jp/library/cc354489.aspx
これの互換フィルタ作ればいい



488 名前:486 mailto:sage [2009/07/13(月) 13:18:35 ]
>>487
それを見てMemFileってサンプルがあったのを思い出しました。
多分それを使えばOKです。
どうもありがとうございました!

489 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 15:56:39 ]
自分のウィンドウ内に再生表示したいのだが、
IGraphBuilder::put_Owner()が、E_NOINTERFACEを返して来て、
別のウィンドウが開いてしまう、何故だろう?

hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, reinterpret_cast<void **>(&pGraphBuilder));
hr = pGraphBuilder->QueryInterface(IID_IVideoWindow, (LPVOID *)&pVideoWindow);
hr = pVideoWindow->put_Owner((OAHWND)hWnd); <- E_NOINTERFACE

hWndは、自分(Dialog)のハンドル。

490 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 16:15:59 ]
BDAチューナからの生(MPEG2-TS)データを取得するアプリを作成したく、graphedtで
試行錯誤してます。(DirectShow初挑戦)

まず、グラバを作成する代わりに"Infinit Pin Tee"+"Dump"(SDKのサンプル)を用いて
DVB-S Network Provider
 ↓
DVB-S Tuner
 ↓
DVB-S Capture
 ↓
Infinit Pin Tee → Dump → ファイル
 ↓
MPEG2 Demultiplexer
 ↓
BDAMPEG2 Transport Information Filter
の構成で、生TSデータを(ファイルに)取得するところまではできました。
が、ここで問題発生。記録したデータを見ると、所々でデータが欠落しています。
一度Runした後に"MPEG2 Demultiplexer"/"BDAMPEG2 Transport Information Filter"
を削除してRunすれば、欠落の無いデータが録れることから、これらの処理が重く
Captureからの出力がブロックされデータが失われているのではないかと予想して
います。

アドバイスいただきたいのは、
(1) 欠落原因の確認のため、CaptureとTeeの間にバッファリング(FIFO)してくれる
ようなフィルタを入れたいが、既存の物で何か良い物は無いか?
(2) 以上全体を通して、間違いやもっと良い方法は無いか?
の2点です。

よろしくお願いいたします。

491 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 16:22:50 ]
>>489
普通はレンダラから、IVMRWindowlessControl や IVMRWindowlessControl9 で設定する。

492 名前:デフォルトの名無しさん mailto:sage [2009/07/17(金) 23:55:12 ]
>>490
そもそもTeeを通さず直接Dumpして欠落無いか確認した?

493 名前:490 mailto:sage [2009/07/18(土) 00:18:46 ]
>>492
Demultiplexer/Transport Information Filterが無いとチューニングが行えない(「Microsoft統合
チューニングモデル」参照)ため、Dumpを接続するには必ずTeeが必要になります。
いったんチューニングが行われた後、Demultiplexer/Transport Information Filterを削除する
とデータ欠落が無くなるのは前記のとおり確認しています。(これが「Teeを通さず直接Dump」
と実質的に同じ状態と思われます。)

494 名前:デフォルトの名無しさん mailto:sage [2009/07/18(土) 00:59:10 ]
あとはGraphEditじゃ無理だろうがDemux通したあとのPID指定したのをDumpするとか。

495 名前:デフォルトの名無しさん [2009/07/19(日) 01:11:24 ]
スレ違いかもしれないのですが

デコードされた、PCM(5.1ch)を、PCM(2ch)*3に分割すうような
動作をするフィルターを探しています。

用途は、ステレオ*10の出力はあるけど、5.1ch出力は出来ない
オーディオカードから5.1chを吐かせたいのです

何かよいフィルタ(スプリッタ?)はごぞんじないでしょうか?

496 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 01:38:29 ]
スレ違で、しかもやろうとしている事の意味がわからない。そんなへんてこストリームを再生してもまともな音響にならないと思うが・・・。
仮にpinを3つに分岐させたとして、どうやってレンダラに繋ぐんだ?
ステレオ*10ってのがまず謎だ。

497 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 01:50:08 ]
ffdshowフィルタを使ったプログラムをくみたいのですが、
フィルタの作り方わかる方、教えてください。

まずこれ↓をやりたいのですが・・・
input.avi -> スプリッタ -> ffdshowデコーダ -> ffdshowエンコダ ->mux ->out.avi




498 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 02:03:45 ]
>>497
フィルタの作り方、っていうのが何か勘違いされているような・・・
とりあえずGraphEdtで自分のやりたいことができてますか?

499 名前:497 mailto:sage [2009/07/19(日) 02:09:44 ]
>>498
GraphEditではできています。
それをプログラム上で再現したいのですが、CLSIDなど
どう設定してよいかがわかりません。

500 名前:デフォルトの名無しさん [2009/07/19(日) 02:15:38 ]
>>496
レンダラを
ステレオ1,ステレオ2,ステレオ3
に割り振るだけだと思うのですが

www.m-audio.jp/products/jp_jp/Delta1010LT.html
www.synthax.jp/fireface-800.html
www.musetex.co.jp/index.php?option=com_content&task=blogcategory&id=2&Itemid=338


こういう、ステレオ出力が10系統とか15系統ついている奴です
あと、後段でディレイをかけるので問題はないです




501 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 13:27:21 ]
>>497
既存のフィルタを組み合わせるだけならフィルタを作る必要は無い

なんにせよ大体のことは>>2あたりを見るだけで事足りる
それでもわからないことがあったらまた聞きにきな

502 名前:497 mailto:sage [2009/07/19(日) 14:08:05 ]
>>501 ありがとうございます。

一応、ここ↓を参考にして、
ttp://geocities.yahoo.co.jp/gl/akt_trade/view/200906

このようにコーディングしてみたのですが、
CoCreateInstance(CLSID_FFDSHOW, NULL,CLSCTX_INPROC_SERVER, IID_IffDecoder, (void**)&iff);
ヘッダはどうしたらよいのか・・・・
そもそもこのコードがあっているのでしょうか?

503 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 15:11:26 ]
>>502
そのページには
>この辺は、海外のffdshowのソース?みたいなところを漁ったら出てきます。(ライセンス的にどうなのかはわかりません)
って書いてあるからどうやらヘッダはffdshowのソースからとってきてるみたい
使うならちゃんとライセンス確認してから使うこと
ただffdshowっていろんなバージョンがあったと思うけど互換性は大丈夫なのかな

504 名前:497 mailto:sage [2009/07/19(日) 15:36:47 ]
>>503 なるほど、ありがとうございます。
もう少し調べてみます。

普通、ffdshowのフィルタはプログラム上からはあまり使わない感じなんですかね?


505 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 17:52:17 ]
>>504
というよりもエンコーダ/デコーダを特定のものに固定することが少ないんじゃないかな
ffdshow固有の機能を使いたいというなら別だけどね

そうでなくて単にAVIを変換したいというだけならこことか見てみるといいかも
AVI ファイルの再圧縮
ttp://msdn.microsoft.com/ja-jp/library/cc370561.aspx

506 名前:497 mailto:sage [2009/07/19(日) 22:19:55 ]
>>505 ありがとうございます。
考えていたのはaviファイルをリサイズ、音量操作などをしてから再圧縮保存したいと考えていたので
多機能のffdshowをプログラム上で使えれば楽かなっと思っていました。


507 名前:デフォルトの名無しさん mailto:sage [2009/07/19(日) 22:37:00 ]
編集フィルタ標準であるやん



508 名前:497 mailto:sage [2009/07/19(日) 23:37:59 ]
>>507 本当ですか? 調べなおしてみます・・・


509 名前:デフォルトの名無しさん mailto:sage [2009/07/21(火) 12:46:44 ]
>>491
Thanks!

510 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 00:30:28 ]
キャプチャデバイスからの映像を再生するアプリを作っているのですが、
開発が進むにつれて、ブルースクリーンになってOS毎落ちるようになりました。

フィルタ群を一度切り離して、キャプチャデバイスやVMRを切り替えて再度接続する、
という動作をさせるようにしてから落ちるようになりました。(何度か繰り返していると起こる)

原因としては何が考えられそうでしょうか??
はっきりは分からなくても、怪しく感じるところでも良いので、ご助言お願いします。

ピンのアロケータのデータがうまく解放されていないのでしょうか?
また、それを確認もしくは解消する術はあるのでしょうか?

[ 落ちるときの詳細 ]
1. グラフを停止
  ( pMediaControl->Stop() )
2. AVIデコンプレッサや色空間フィルタ、VMRのピンを切断
3. キャプチャデバイスと繋がっているスマートティーフィルタを削除
  ( pGraphBuilder->RemoveFilter( xxx ) )
4. キャプチャデバイスをグラフから削除
  ( pGraphBuilder->RemoveFilter( xxx ) )
5 キャプチャデバイスをグラフに追加
  ( pGraphBuilder->AddFilter( xxx ) )
6. フィルタグラフを再構築
  ( pGraphBuilder->RenderStrem( xxx ) )
7. ビデオ転送矩形を設定
8. グラフを再生
  ( pMediaControl->Run() )

511 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 01:55:00 ]
再生側でOS落ちるのはレアだから、ソースフィルタ側のドライバの問題でない?
テンプレート使っていないなら、参照カウンタあたりが怪しいけど。
破棄されているのに、更にReleaseしてアドレスがたまたま有効なために不正にコードが実行されてしまったケースを想定。
チェックが甘い実装だとこのケースで落ちそうな気がする。

512 名前:510 mailto:sage [2009/07/27(月) 02:14:56 ]
>>511
ありがとうございます。

>ソースフィルタ側のドライバの問題でない?
その可能性もあると思います。
使っているキャプチャボードがIntensityProとSAA7103-TVPCIなのですが、
IntensityProのほうはドライバがあまり安定していないという報告をよく聞きますし。

>破棄されているのに、更にReleaseして
一応、以下のようなSAFE_RELEASEマクロでそういったことが起こらないよう心がけています
SAFE_RELEASE( x ) { if( x ) { ( x )->Release(); ( x ) = NULL; } }
しかし、Releaseし忘れの恐れは残りますが・・・(慎重にチェックはしているものの(汗))

もう一つ、少し心配なのが、>>510の3番のスマートティーフィルタのフィルタグラフからの削除です。
このスマートティーはインテリジェント接続により生成されるもので、
基本的にはDirectShow側で生成、解放等の管理をしてくれていると思うのですが、
それに対してアプリ側でRemoveFilterするのは問題ないのだろうか?と・・・

しかし、>>511さんのご意見通り、ドライバの問題が有力な気がします。
もう一枚キャプボがあるので、怪しいIntensityProを外して他の2枚で切替を行うテストをして、
問題がないかを試してみようと思います。
ドライバのせいにできれば、アプリ作成者側としては気が楽になりますので期待してます(笑)

どうもありがとうございました。

513 名前:デフォルトの名無しさん mailto:sage [2009/07/27(月) 03:52:51 ]
CComPtrとかで参照を自動化してやると間違いが起きないぜって話

514 名前:510 mailto:sage [2009/07/28(火) 00:37:34 ]
よく調べてみると、参照カウントが予想外の挙動をしていました。

例えば、

pCaptureGraphBuilder->FindInterface( &PIN_CATEGORY_CAPTURE, 0, pCapDev, IID_IAMStreamConfig, ( void** )&pConfig )

として、pConfigの参照カウントを調べてみると、1ではなく、いきなり2や6になったりするんです。

キャプチャデバイスフィルタ(上のpCapDev)も、
pMoniker->BindToObject()では1上がるだけですが、その直後のpGraphBuilder->AddFilterで
3とかになったりしました。

ここらへんが悪さをしていたようで、どうしたものかと思いましたが、
>>513さんが教えてくださったCComPtrに変えたところ、うまくいきました!

CComPtrを使うと、
ttp://www.hamusuta.net/openbbs/pc/prg/wtl.html#msg9
に書いてあるように、使いまわし利用ができず、プログラムが止まります。
これで問題箇所が分かる上、xxx.Release()とすればちゃんと
解放(おそらく参照カウントを必要なだけ複数下げてくれている)してくれます。
この対処をした後はブルースクリーンクラシュは起こらなくなり、安定して動いています。

とてもよい解決策を教えてくださって、ありがとうございました!

515 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 00:58:01 ]
ReleaseよりNULL入れるほうが安全。
CComPtr以外にBoostでもテンプレートがあったきがす。
最初から入っているCComPtr使うほうが楽だけどね。

516 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 01:10:54 ]
直接関係ないけど、CComPtrで使いまわす場合はDetachするとよか

517 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 02:23:30 ]
>>514
いやCComPtr::Releaseは参照カウント一つしか減らさないぞ…。ヘッダファイルにソース書いてあるから読んでみるといい。
まぁ元のプログラムで参照カウントの増減おかしかったのが正しくなったんだろう。
なんにせよCComPtrを使っておくのは正しい対処だ。

>>515
CComPtrにNULL代入するのとCComPtr::Releaseは全く同じことしかやらないような。



518 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 03:19:00 ]
>>517
NULLの代入とReleaseが同じなのはその通りだけど、
hoge.Release();は、間違えてhoge->Release();としてもコンパイルが通ってしまうから
避けるべきだと>>515は考えているのだと思う。

519 名前:デフォルトの名無しさん mailto:sage [2009/07/28(火) 08:29:06 ]
いつからかわからないけど、
CComPtrで ->AddRef と ->Release はコンパイル通らないようになってるよ。
確かVC6の頃は通ってたな。

520 名前:510 mailto:sage [2009/07/29(水) 01:35:32 ]
ダメです!再びブルースクリーン炸裂です・・・
CComPtrを使う前よりは耐性(?)は増したか・・・と思うと、
再起動直後、数回のデバッグ起動でガチャン・・・
CComPtrを以ってしても敵わないとは・・・恐るべしDirectShow・・・!

>>516
具体的にはどうするのでしょうか??
Detachだと、CComPtrが対象生ポインタの所有権を棄却するだけで、
解放は施されないようですが・・・

>>517
たしかにそうでした(汗)
となると、例の参照カウント異常上昇分を抑え切れてない可能性もありますね・・・

>>519
その通りで、->Releaseのほうはコンパイラに怒られました。

一度、怪しいCOMポインタについては、CComPtrを使わず、ソフト終了寸前に、
参照カウントが0になるまでRelease()を繰り返すといった方法を試してみようと思います。

521 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 02:11:03 ]
>>参照カウントが0になるまでRelease()を繰り返すといった方法を試してみようと思います。
これはやってはいけない。そもそもAddRedやReleaseの返す値は使用してはいけないルールです。
参照値なんて自分で作ったもの以外は基本的にわからんよ。

再利用すると挙動不審になるデバイスなんでね。破棄して再生成してしまえ。
実行時間が同じくらいなら安定した方法で手抜き実装。

522 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 07:27:54 ]
BMDSDKだとキャプチャフィルタは削除せずにグラフ変更やっているみたいだから
それに沿ったら?

523 名前:デフォルトの名無しさん mailto:sage [2009/08/02(日) 19:39:32 ]
avi(音声あり)とwavファイルを多重化してaviに保存したいのですが、
directshowの既存のフィルタでプログラムできますか?
aviの音声そのままでwavの音声も重ねたいのですが・・・

524 名前:デフォルトの名無しさん mailto:sage [2009/08/02(日) 21:26:39 ]
GraphEditで作れるか試せばいいだろ

525 名前:510 mailto:sage [2009/08/03(月) 07:37:49 ]
>>521
ありがとうございます!
確かに怖いですねw
>実行時間が同じくらいなら安定した方法で手抜き実装。
DirectShowって、フィルタ開発とかを除けば、基本的に時間を気にしないといけないところは
少ないですし、おっしゃる通り、遠回りでも、じじぐさくても、安定するように組むのがセオリーのようですね。

>>522
ありがとうございます!
その方法でやってみました。
はじめは、それでもOS毎落ちる事態は発生していましたが、どうもセットで生成されるスマートティー
を削除するのがよくないようで、これも残すようにし、再接続の際はスマートティー(在れば)から
接続してグラフを構築するようにしたところ・・・ついにブルースクリーンが出ないようになりました!!
何度も再接続を繰り返し、それまでであればほとんど落ちていたような回数でもぜんぜん落ちる
気配がありません。

みなさん、良いご助言を下さり、ありがとうござました!!

526 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 16:14:48 ]
自分はCanonのHV10っていうDVカメラしか持ってないんですが
IVideoWindow::SetWindowPosition で、ソース画像の1/2以下の
Windowエリアに割り当てると描画しなくなります(SetWindowPosition はS_OKを返します)
その後 SetWindowPosition で再設定しても描画されず、グラフを再作成するしかないようです。
他のDVカメラでも画像の1/2以下に割り当てると同じようなことが起きますか?

Windowリサイズ時に(ソース画像の1/2+1)ピクセル以上に割り当てるようにしていますが
この1/2で他のDVカメラに通用するのかが知りたいです。

527 名前:デフォルトの名無しさん mailto:sage [2009/08/07(金) 21:26:16 ]
サンプルグラバについて、
SetOneShot( true )
でワンショットモードにしてから再生しているのですが、
いつまでたってもグラフが停止しません。
(キャプチャデバイスからのライブソースです)

ワンショットモードでは、サンプルを1枚受け取ると、グラフを停止するとmsdnにも書いています。

WaitForCompletion( INFINITE, &evCode );
を挿入し、この関数から返ってくるのを待っても、一向に返ってこず、再生が続いたままになります。

とりあえず、Sleep( 100 )として対応していますが、
このようなことをせず、ちゃんとサンプルの受信が完了したのを確認してから
サンプルを取得できるようにするにはどうすればよいでしょうか??



528 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 03:19:27 ]
Intensityをお持ちの方にお聞きしたいのですが、
入力設定を「HD 1080 PsF 24」にして、グラフ構築ができるでしょうか?
GraphEditを使ったのですが、自分の場合、どのフィルタも繋がらりません・・・
「接続に必要な中間フィルタの組み合わせが見つかりませんでした。」
のエラーメッセージが出てしまいます。

構築ができる方や、実際にPS3などからの24p出力を取り込められている方が
おられましたら、フィルタグラフの構成を教えてください。

よろしくお願いします。

529 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 00:56:04 ]
プログラムを終了する際は、すべてのフィルタをグラフから削除(RemoveFilter)すべきでしょうか?
また、そのときは、インテリジェント接続で自動的に生成されたフィルタについても、
アプリ側で検索して削除すべきでしょうか?

削除しなくても問題は(一見)起こっていませんが、行儀よく終わる方法を知りたいと思いました。

530 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 01:10:00 ]
>>528
メディアサブタイプがHDYCのはずだから、Blackmagic Designe DecoderDMO挟んでみるとか

>>529
自分で追加したフィルタと、グラフを解放するだけで問題ない、はず。

531 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 11:31:03 ]
>>529
後片付けのためにRemoveFilterを使う必要はない

532 名前:529 mailto:sage [2009/08/10(月) 12:26:12 ]
>>530
>>531
ありがとうございます!
安心しました。

533 名前:528 mailto:sage [2009/08/11(火) 07:26:53 ]
>>530
ありがとうございます。
しかし、24fps設定ではBlackmagic Design Decoder (DMO)すら繋がりませんでした(汗)

534 名前:デフォルトの名無しさん [2009/08/14(金) 23:40:51 ]
有識者の皆様にご教授願いたいことがあります。

カメラとマイクそれぞれのキャプチャピンから別々にデータを拾って保管しておき、
あとでそれらをプッシュソースフィルタからAVIMUXフィルターで合体させ、AVIファイルを作ろうと思っています。

キャプチャピンから拾うデータはIMediaSampleのデータ(GetPointer)と開始時間と終了時間(GetTime(Start,Stop))です。

問題は、20秒くらいのAVIデータを作成すると、2秒くらい画像が縮んでいることです。
取得時に実時間を画像に描画していますので、それを見ていると、18秒くらいで20秒目の画像まで来てしまいます。
音声は割りと正確に入っていまして、画像が停止した状態から+2秒できっちり20秒ぶん出来ています。

かなりの時間を割いて調べましたが、良い資料にめぐり合いません。
ちなみに、カメラから取ったデータを仮に(AvgTimePerFrame=)10fpsとすると、GetTimeで取得したStartとStopの間は0.1秒ぶん(1000000)ですが、
データとデータの間が必ずしも連続ではありません。1つ目のデータのstopが100000として、次のデータのstartが102000とかだったりします。(本当は100000が理想ですよね)
ですので、10フレーム分のデータの最初のstartから最後のstopまでが1秒以上になっているようです。(カメラがコマ落ちしているようです。)

(長くなりましたので分割いたしました。次のレスに続きます。)

535 名前:デフォルトの名無しさん [2009/08/14(金) 23:43:08 ]
データなどを10個おきに確認したところ、1秒間に10個データを必要とするならば、ちょうど、コマ落ちの遅延分が画像の短縮と同じ割合のような感じでした。
音声のデータは、0.5秒おきに正しく取得できているので、問題がないようです。Stopから次のStartとの間が連続しています。

同じカメラとマイクを直接AVIMUXフィルタに繋げてAVIファイルを作成すると、きちんとしたAVIが出来上がりますので、コマ落ちなどはIMediaSample.SetTimeでちゃんとフレーム補間されるものと思っていましたが、
違うのでしょうか?

直接つなげた場合と、いったんデータを横取りした場合と、何が違うのでしょうか?

ただし、かといって、MediaSample.SetTimeをでたらめな数値にするとだめなことから、一応SampleTimeは参考にされているようですね。
一応、今回はコマ落ち分のフレームを直前のフレームで代用して、サンプルタイムを調整して姑息的に対応しようと思っています。しかし、これが正しい方法でしょうか?きちんとした使い方を知っておきたいのです。

AVIMUXの正しい使い方、同期の取り方等を教えていただける方を待望しております。
八方ふさがりで、このスレに期待しております。
よろしくお願いします。

536 名前:デフォルトの名無しさん mailto:sage [2009/08/15(土) 02:00:15 ]
試しに自分でサンプルに時間設定してみれば?または取得時間とサンプルの時間差を計測するとか。
オーディオのタイマーとビデオで使われるタイマーが別なのはよくあること。
本来ずれないものだが、ずれる環境もある。

537 名前:デフォルトの名無しさん [2009/08/15(土) 10:26:39 ]
>>536
早速のアドバイスありがとうございます。
サンプルの取得時の時間は、カメラやマイクが起動してからの時間なので、
AVIMUXにかけるときには、各々の頭のタイミングが0になるように各サンプルの時間を差し引いています。
具体的には、画像の取得開始が50000なら、取得したデータの各サンプルの時間を50000減じてからAVIMUXに送っています。
音声データも同じです。ただ、起動時間にずれがあるので、開始が60000とかになります。
しかし今回の問題は、開始時間がずれているのではなく、徐々にずれていくのです。
ビデオでたとえますと、音はそのまま、画像は早送り(0.05倍速くらいの微妙)です。
タイマーは同じPCにマイクとカメラを接続してますので、同じだと思います。

>>534-535で疑っているのは、
カメラでリアルタイムに取得した画像は、10fpsとしても、1秒に10枚取れるときもあれば、8枚や9枚しか取れないときもあります。
10秒で100枚ほしいところ、結局90枚しか取れなかったということが普通にあります。
それをAVIMUXに入れたときにはきっちり10fpsでレンダリングされて9秒しか動画が得られない。
取得時間はきちんとしていますが、AVIMUXであいまいに処理されているんじゃないかと、
疑っています。




538 名前:デフォルトの名無しさん [2009/08/15(土) 11:13:17 ]
ちなみにAVIMUXのインターリーブのモードはINTERLEAVE_NONEでした。
これをINTERLEAVE_CAPTUREやINTERLEAVE_FULLにしましたら、固まりました。
このモードはソースがプッシュだとだめでしょうか?
カメラやマイクなどのキャプチャフィルタはプッシュだと思うんですが。

私のAVIMUXに対する期待は、AVIMUXに1秒間に何枚送ろうが、サンプルに付けたタイムを元に、
適当に表示時間を調整してくれることです。
これが過大な期待なのかどうか、機能の正確なところが知りたいです。
よろしくおねがいします。

539 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 03:36:37 ]
GraphEdit のフィルタ挿入選択ダイアログボックスの様に、フィルタの登録情報を取得する方法を探しています。
具体的には、その中でもPIN情報を取得する方法です。条件としてフィルタの生成は行いません。
何か情報がありましたらお知らせください。

540 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 17:39:59 ]
directshowって動画をフレーム単位で表示したり総フレーム数や現在の表示フレームナンバーとかで再生制御できる?

541 名前:デフォルトの名無しさん mailto:age [2009/08/22(土) 18:37:12 ]
トランスフォームフィルタのCheckTransformについて質問です。

CheckTransform( const CMediaType *mtIn, const CMediaType *mtOut )

この mtIn と mtOut ですが、

[ UpstreamFilter ][ Out ] -> [ A:In ][ TransformFilter ][ B:Out ] -> [ C:In ][ DownstreamFilter ][ Out ]

上図でいえば、それぞれはA〜Cのどれに対応するのでしょうか?

mtOutはBに違いないと思います。
mtInに関しては、MSDNの例を見ている限りはAを指していそうに思うのですが、
他の個人Webサイトの例などを見ていると、C(ダウンストリーム側が提示)と取れるような記述もありました。

よろしくお願いします。 m(_ _)m

542 名前:デフォルトの名無しさん mailto:sage [2009/08/22(土) 20:07:31 ]
ソース読めよ

543 名前:541 mailto:age [2009/08/24(月) 22:04:59 ]
>>542
ありがとうございました。 m(_ _)m

544 名前:デフォルトの名無しさん [2009/08/24(月) 23:26:02 ]
SampleGrabberを使ってAviUtlのDirect Show File Readerっぽいもの(Aviutl用ではありませんが)
を作りたいんですが、うまくいきません。

なるべく速度が低下しないように、
・動画の1フレーム目を読み出した後、2フレーム目の読み出しが要求されたときは
IMediaControlのRunを呼び出して再生を再開→すぐ一時停止
・1フレーム→10フレームのように読み出すときだけシークする

ようにしたいんですが、一回Runを呼び出すと、SetOneShotをtrueにしても、サンプルグラバのコールバックで
IMediaControl→Pauseを呼び出してもちゃんと止まっていないようなのです。
ポーズした後もBufferCBが呼び出されてるし、
映像だけをデフォルトレンダラに変更してウィンドウを動かすと勝手に映像が進みます。
どうすればいいでしょうか?

*.flv→FLV Splitter→MP3のデコーダー→SampleGrabber(Audio)→NullRenderer
    FLV Splitter→ffdshow Video Decoder→SampleGrabber(Video)→NullRenderer

545 名前:デフォルトの名無しさん [2009/08/27(木) 01:13:50 ]
>>543
Aだろ

説明ではアップストリームを基準にトランスフォームフィルタの説明してるんじゃないかな

546 名前:541 mailto:age [2009/08/27(木) 07:50:01 ]
>>545
やはりそうですよね。
ありがとうございました。 m(_ _)m

547 名前:デフォルトの名無しさん mailto:age [2009/08/29(土) 20:45:44 ]
Directshowでプログラムを組んだのですが、開発したPC(Microsoft SDKが入っている)以外のPCだと、
.netFrameworkをインストールしないと「構成が正しくない」というようなエラーが出て立ち上がりませんでした。

Directshowプログラムを動かすには.netFrameworkのインストールが必須なのでしょうか?
それとも、Directshowとは関係ないAPIによるものでしょうか?

Ole系関数やatlcomcli.hの関数が怪しいかと思うのですが・・・



548 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 21:00:17 ]
要るわけない。

549 名前:デフォルトの名無しさん mailto:sage [2009/08/29(土) 21:21:29 ]
>>547
まさかCLRプロジェクトにしていないよな?
そうでなければ、本当に必要なのは.NET FrameworkではなくVisual C++ランタイムだと思う。
2005 www.microsoft.com/downloads/details.aspx?familyid=766a6af7-ec73-40ff-b072-9112bab119c2&displaylang=ja
2008 www.microsoft.com/downloads/details.aspx?familyid=2051a0c1-c9b5-4b0a-a8f5-770a549fd78c&displaylang=ja

550 名前:547 mailto:age [2009/08/30(日) 09:39:39 ]
>>548
やはりそうでしたか(汗)

>>549
>まさかCLRプロジェクトにしていないよな?
いえ、Win32プロジェクトで作成していますし、プロジェクトのプロパティでも
「共通言語ランタイムサポートを使用しない」にしています。
.netテクノロジーは噛んでいないはずですよね。

>そうでなければ、本当に必要なのは.NET FrameworkではなくVisual C++ランタイムだと思う。
URLを教えてくださってありがとうございます。
今はソフトを作り直していて、余計なAPIなどが関わっていないか注意しているので、
これが完成したら、配布テストとしてVisual C++ランタイムでちゃんと動作するか試したいと思います。

どうもありがとうございました。

551 名前:名無しさん@そうだ選挙に行こう [2009/08/30(日) 11:53:25 ]
フレームワークはいらないよ。インストール必要なライブラリーを仕事で洗い出したから間違いないよ


552 名前:名無しさん@そうだ選挙に行こう mailto:sage [2009/08/30(日) 12:34:19 ]
>550
Dependency Walkerかdumpbinで、依存してるdllを洗い出してみるのが手っ取り早いと思うよ。

というか>549の言ってるように、Visual C++ランタイムが無いだけだと思うんだが…
Win32プロジェクトでも純粋にWinAPIだけで組むか、ライブラリをスタティックリンクにしない限り
ランタイムが必要になる。(Cの標準関数(printf等)ですらアウト)


553 名前:デフォルトの名無しさん mailto:sage [2009/09/01(火) 18:56:04 ]
今気づいたんだがDirectShowのビデオレンダリングってクロマキー合成なのな

1.メディアプレイヤーで動画を再生
2.ペイントでキャンバスをRGB(16,0,16)で塗りつぶす
3.ペイントをメディアプレイヤーの上に重ねると下の動画が透けて見える

XPクラシックモード&WMP11で確認

554 名前:デフォルトの名無しさん mailto:sage [2009/09/01(火) 19:19:38 ]
>>553
ビデオオーバーレイを使ってるときはそうなるかもね。


555 名前:547 mailto:age [2009/09/01(火) 19:36:24 ]
>>551
そうでしたか。
.netFrameworkはインストールを要求するには大掛かりで憚られるので、
避けたいと思っていましたし、よかったです。
ありがとうございます。

>>552
便利なツールを教えてくださってありがとうございます。
これで調査して適切なライブラリを洗い出します。

556 名前:デフォルトの名無しさん mailto:sage [2009/09/03(木) 23:48:43 ]
>>547
コンパイラはVisualStudioか?
7月28日にATLに当たったセキュリティパッチの影響で、
dllが足りていても更正が正しくないと出ることがあるぞ。
もしそれだったら、最新版の再頒布パッケージ入れないと動かないぞ。
www.microsoft.com/japan/technet/security/bulletin/MS09-035.mspx

557 名前:デフォルトの名無しさん mailto:sage [2009/09/04(金) 01:03:29 ]
VisualStudioのインストーラープロジェクトで依存洗い出してインストーラー作ってくれるけど、
そういうのは使えないのか?



558 名前:デフォルトの名無しさん mailto:age [2009/09/04(金) 20:28:26 ]
変換フィルタを作っているのですが、720x480を入力し、そのままのメディアタイプでVMR7


出力すると、
ttp://kissho.xii.jp/1/src/1jyou90085.png
こんなふうにおかしな映像が出力されてしまいます。

しかし、自作変換フィルタ後にAVIデコンプレッサを介してVMR7に接続すると、
正しく映像が出力されました。

AVIデコンプレッサは幅768にアラインしているのでしょうか?
その場合、それと同様のことを変換フィルタに組み込むには、
具体的にどこにどう実装すればよいのでしょうか?

よろしくお願いします。

559 名前:デフォルトの名無しさん mailto:sage [2009/09/05(土) 14:04:16 ]
>>558
VMRのメディアタイプのbiWidth見れば分かるが、768とかになってるはず。
>その場合、それと同様のことを変換フィルタに組み込むには、
変換時にアライン分飛ばせばいい。

560 名前:558 mailto:age [2009/09/05(土) 16:13:23 ]
>>559
なるほど!
ありがとうございました!

561 名前:デフォルトの名無しさん [2009/09/06(日) 14:49:43 ]
訳あってdirectshowを学ばなければならなくなった者です
なかなか良い書籍やサイトが見つからないのですが、みなさんはどうやって勉強しているのでしょうか?

562 名前:デフォルトの名無しさん mailto:sage [2009/09/06(日) 15:09:36 ]
>>561
SDKのサンプルとドキュメント1択。


563 名前:デフォルトの名無しさん [2009/09/09(水) 12:44:39 ]
例えばデスクトップをキャプチャしてaviで保存するアプリを作ったとする
このとき無圧縮だったり、そのほかのコーデックで圧縮したりするようにするにはどうすればいいんだ?
どのフィルタの部分でそのコードを書く?のだね 初心者だから教えてみてみ

564 名前:デフォルトの名無しさん mailto:sage [2009/09/09(水) 13:37:02 ]
>>563
VFW使え。それが一番簡単。


565 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 02:21:14 ]
>564
VFWはファイルサイズ2G以下の壁が…
正直grapheditのが簡単な希ガス。

566 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 02:32:51 ]
vfwはビデオコーデックの機能だけだカス

567 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 16:53:30 ]
DirextShow初心者なのですが、
H264のaviファイルの各コマ画像を連続で取り出すことって
簡単に出来るのでしょうか・・・
対応コーデック(フィルタ?)を入れれば再生は簡単に出来そうですが、、




568 名前:デフォルトの名無しさん [2009/09/10(木) 18:36:40 ]
directshowでビデオからの映像をグレイスケールにして二値化するにはどうしたらよいのでしょう


569 名前:デフォルトの名無しさん mailto:sage [2009/09/10(木) 18:54:40 ]
>>567
余裕

>>568
フィルタ作れ

570 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 22:09:06 ]
>>568
EZRGB24っていうサンプルが参考になるよ

571 名前:デフォルトの名無しさん [2009/09/16(水) 03:11:58 ]
二値化フィルターくらい簡単なら作ったげよか?
輝度でばっさり二値化するのでいいのか?
色で判断して二値化するほうがいいの?
閾値はどうする?プロパティページで変更出来るようにしたい?

スライス方式って上下限の閾値ってのもあるぞ

お好みを指定してくれ。
後、ソースはやらん

572 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 02:03:11 ]
>>571
適応的二値化でお願いします
cvAdaptiveThreshold()を呼び出すだけより格段に速いやつを

573 名前:デフォルトの名無しさん [2009/09/17(木) 09:11:36 ]
周囲の環境から最適に二値化するやつか。
それはまんどくさ

574 名前:デフォルトの名無しさん [2009/09/18(金) 22:24:21 ]
cvAdaptiveThreshold()より改善するのは仕事でないと嫌だが、
まんま使うとかはダメなのか?

仕事として受けるなら設計書とソース提出するよ


575 名前:デフォルトの名無しさん mailto:sage [2009/09/19(土) 17:35:55 ]
自力で高速化してみます
ありがとうございました

576 名前:デフォルトの名無しさん mailto:sage [2009/09/22(火) 14:06:10 ]
Visual C++ 2008 を使用しています。

Microsoft SDKs\Windows\v6.1\Samples\multimedia\directshow\baseclasses
にある Streams.h をインクルードしたら
IReferenceClockTimerControl が定義されてないと出ました。
これはどういった対処をすれば良いのでしょうか?

577 名前:デフォルトの名無しさん mailto:sage [2009/09/22(火) 14:10:05 ]
まずはビルドしろよ糞が



578 名前:デフォルトの名無しさん mailto:sage [2009/09/22(火) 16:46:07 ]
基本的な事を知らずにDirectShowに手を出すと泣くよ。
俺が昔そうだったから保障するw

579 名前:デフォルトの名無しさん mailto:sage [2009/09/22(火) 23:12:02 ]
>>576
ヘッダー全部もってこい。
もしくはちゃんとパスを通せばおk

580 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 21:56:54 ]
>>576
MicrosoftSDKや、DirectX SDKと、VC++のヘッダファイルで同名のがあるから
インクルードの順番も注意しろ。

581 名前:デフォルトの名無しさん [2009/10/09(金) 14:15:28 ]
TChartShapeでchasVertLineにしてマークを表示させてるのですが
マークが上と下(Y1とY0)に2つ表示されてしまいます
これを上1つ(Y1)だけ表示されるのにはどうしたらいいですか?

582 名前:デフォルトの名無しさん mailto:sage [2009/10/09(金) 14:16:09 ]
あ、すんません。
誤爆してしまいました

583 名前:デフォルトの名無しさん [2009/10/11(日) 07:36:37 ]
同機種のwebカメラを2つ繋げてもグラフエディットでは1つしか表示されない。

調べてみるとPCによってはちゃんと表示されるものもある(カメラのドライバーは同じ物を使用)
USBコントローラの数が関係してるのかと思うんだけどわからない。

ここには解説出来るような人いる?

584 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 07:47:51 ]
いません

585 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 13:33:39 ]
やっぱり難しいよね。ごめんなさい

586 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 14:14:54 ]
態度が気に食わないので教えない

587 名前:デフォルトの名無しさん mailto:sage [2009/10/11(日) 14:30:02 ]
ttp://img.f.hatena.ne.jp/images/fotolife/T/TamTam/20091004/20091004201621.jpg



588 名前:デフォルトの名無しさん mailto:sage [2009/10/12(月) 21:08:27 ]
>>586
>>587
態度を改めます。私程度の力ではわからないため
お願いします教えてください。
【質問】
同機種のカメラ複数台接続してGrapheditで1個しか表示されない
カメラドライバの問題でなく「PC側によって」使えるものと
使えないものがあるが、何が違うのかわかりません。

【現在わかっている事】
ノートPCの一部ではUSBコントローラが複数あり
別々のUSBポートにつないでいれば同機種のWebカメラでも
利用可能。

また、ググると下記の記述があり私が試してみた感じ同じ考えです。
・同じ型番でもドライバが対応していれば大丈夫
・同じメーカーでも型番が違えば大丈夫
・片方のカメラにUSBハブを挟めば大丈夫
・メーカーが違えば大丈夫

blogs.yahoo.co.jp/honebuto_honebuto/28960469.html

よろしくお願いします。

589 名前:デフォルトの名無しさん mailto:sage [2009/10/16(金) 21:17:21 ]
>>578
よくあるパターンだがDirectShowに限らず初心者はその「基本的なこと」が何なのかすら判らないことが多い
で、ググってもそういう事が書いてあるページがなかなか見つからない罠。結果挫折する・・・

590 名前:デフォルトの名無しさん [2009/10/17(土) 01:48:31 ]
キャプチャーカードやカメラの画像サイズの設定で
入力1080と720などの切り替えをしたいのですが、
DirectShow では IAMStreamConfig を使ってできましたが、
WindowMediaEncoderSDK いわゆるWMEncoderLib.dll系を使って
できないでしょうか?


591 名前:誰か助けて。 [2009/10/18(日) 21:37:48 ]
ISampleGrabberを利用して画面キャプチャを行っています。
mpeg2をビットマップにすることは出来ましたが、
Webカメラで撮影して保存したファイルでは失敗します。
Webカメラの設定ではYUV2で保存されるようで、そのファイルのプロパティーで見ると
MS-YUV(16ビット)と書かれていました。この場合、グラバのSetMediaType()には
一体何を与えればいいのでしょうか? なお、現状で、
media_type.majortype = MEDIATYPE_Video;
media_type.subtype = MEDIASUBTYPE_RGB24;
media_type.formattype = FORMAT_VideoInfo; を与えています。
これだと、GetCurrentBuffer()で失敗します。
そこまでは全部成功します。戻り値はVFW_E_WRONG_STATEでした。

592 名前:誰か助けて。 [2009/10/18(日) 21:40:53 ]
なお、フレーム読み込み箇所は次の通りにしています。

this->seeking->SetPositions(&ulc,AM_SEEKING_AbsolutePositioning,&ulc,
AM_SEEKING_AbsolutePositioning );

// 1フレームレンダリング、完了を待つ
while(this->control->StopWhenReady() != S_OK){}

// レンダリング完了を待つ(不要か?)
OAFilterState fs;
this->control->GetState( INFINITE, &fs);

// バッファを取得
this->grabber->GetCurrentBuffer(
      (long*)&this->media_type.lSampleSize,
      (long*)**this->load_buffer);

593 名前:デフォルトの名無しさん mailto:sage [2009/10/18(日) 22:53:11 ]
>>591>>592です。
解決してないけど解決しました。
どうもよくわかりませんが、そのムービーファイルの数フレームだけ、
GetCurrentBuffer()でVFW_E_WRONG_STATEが返ってくるようです。
しょうもないので、GetCurrentBuffer()でエラーが返ってきても無視すると
うまく行くようになりました。こんなんでええんだろうか・・・


594 名前:デフォルトの名無しさん [2009/10/18(日) 23:13:12 ]
ピクセルフォーマットやメディアタイプを理解せずに、ISampleGrabberを使える事にびっくりした。

>Webカメラで撮影して保存したファイルでは失敗します。
このファイルがどんなファイルなのか、作っているGraphがどうなっているのか、等が分からないと、答える事は難しい。

よく分からないんだったら、IVMRWindowlessControl::GetCurrentImageあたりを使ったほうが無難だと思う。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<187KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef