■過去ログ置き場に戻る■ 1- 前250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

DirectShowと戦うスレ Part 2
251 名前:デフォルトの名無しさん :2007/03/09(金) 00:51:33
フィルタをビルドするためにstrmbasd.libとstrmbase.libが必要なのですが、それを作成するための
ビルドがどうしてもできません。
お持ちの方がおられましたらお譲りください。
お願いします。

アップローダ
ttp://www.rupan.net/uploader/

環境
WindowsXP SP2
Platform SDK for Windows Server 2003 SP1
Visual Studio 2005 Express Edition

252 名前:デフォルトの名無しさん :2007/03/09(金) 02:40:17
baseclasses.sln をダブルクリックして開いてビルドを実行するだけだろ。

253 名前:251 :2007/03/09(金) 03:08:44
>>252
いえ、最近になって.slnや.dswのファイルが付属しなくなりまして、makefileがついているんです。
それで
ttp://www.shader.jp/xoops/html/modules/xfsection/article.php?articleid=17
このページと同じように進めてもcl.exeが見つからないようなことを示すエラーが出て、
それじゃあとcl.exeのあるフォルダを環境変数のPathに設定してやると今度はmspdb80.dllが
見つからないと言われて失敗します。

254 名前:デフォルトの名無しさん :2007/03/09(金) 04:01:11
さすがマイクロソフト


255 名前:デフォルトの名無しさん :2007/03/09(金) 04:16:23
俺の所の 2006 9月版には、baseclasses.slnがあるけどな。
お前の最近は2年前か?

256 名前:251 :2007/03/09(金) 04:29:10
>>255
え!?そうなんですか!?
ttp://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en
ここのPSDK-x86.exeをダウンロードしてインストールしたのですが、違うのでしょうか?
>>255さんの入手経路を教えてください。

257 名前:デフォルトの名無しさん :2007/03/09(金) 05:18:47
http://blogs.msdn.com/windowssdk/

258 名前:251 :2007/03/09(金) 07:07:13
できました!!
ttp://ugd555.blog1.fc2.com/page-13.html
同じ症状を解決した方のページを見つけました。
最終的に別のフォルダから5つファイルを持ってこなければいけませんでした。
この問題に18時間費やしました・・・

259 名前:251 :2007/03/09(金) 09:44:34
早速、いろいろなフィルタサンプルのビルドを試してみましたが、どれもPC内に存在しない
ライブラリファイルが無い、と言われどうしようもありません。
そういえば、VC2005EEでDirectShowフィルタを開発したという話を聞いたことがありません。
ちゃんとしたVCを買え、ということでFAでしょうか?
もしそうなら、観念して買いに行きます・・・

260 名前:デフォルトの名無しさん :2007/03/09(金) 09:45:26
EEどうかは関係ない気がする、2005だといろいろ不便

261 名前:デフォルトの名無しさん :2007/03/09(金) 16:37:13
いい加減最新のSDKダウンロードしろ。うざい。

262 名前:デフォルトの名無しさん :2007/03/09(金) 16:42:53
>>259
初心者スレにでも行け
DirectShowスレで語るべき内容ではないだろ

263 名前:デフォルトの名無しさん :2007/03/10(土) 01:13:37
どんな内容なら語ってもいいのですか?玄人の>>262さん。


264 名前:デフォルトの名無しさん :2007/03/10(土) 02:25:22
>>251>>263みたいな質問以外ですな

265 名前:デフォルトの名無しさん :2007/03/10(土) 05:35:57
キャプチャフィルタ→変換フィルタ→色空間変換フィルタ→VMR9
という構成の中の変換フィルタで、キャプチャフィルタからサンプルが1枚くる度に
サンプルに対し処理Aを実行→出力→表示
サンプルに対し処理Bを実行→出力→表示
というように2回の処理、出力を行いたい(フレームレートを倍化したい)のですが、
どうすればよいでしょうか?
なお、キャプチャ出力のフレームレートは上限に設定しています。
タイムスタンプをいじるだけではうまくいきませんでした。
IMemInputPin::Receiveを使うにしても、それを呼び出す頻度をどのようにすれば
合わせられるかが分からずできません。

266 名前:デフォルトの名無しさん :2007/03/10(土) 07:16:47
出力ピンのメディアタイプのレートを2倍に設定して、サンプルを1つ受け取ったら2つ出力すればいいのでは

267 名前:デフォルトの名無しさん :2007/03/10(土) 11:46:39
タイムスタンプは修正してやらないと駄目だろう。
仮にキャプチャフィルタが30f/secで投げてくるなら0.033...秒間隔のスタンプが設定されているだろうから
自分でつくる変換フィルタは2枚目に0.033.../2秒のタイムスタンプを足して設定してやる。
んで自分が出力ピンからDeliverするときに、自分で送りたい2枚分、下段の入力ピンReceiveを呼ぶ。
2回送信完了してから、上段にDeliverの結果を返す。

268 名前:デフォルトの名無しさん :2007/03/10(土) 17:49:27
http://pc11.2ch.net/test/read.cgi/tech/1168354839/
の658です。
たぶんこっちで質問したほうがいい気がしたので。

何度やっても同じところ(CopyMemory)で落ちます。
原因として思い当たる件があったらご教示願います。

269 名前:デフォルトの名無しさん :2007/03/10(土) 18:11:41
サイズチェックくらいしろ。
24bit以上のソースなら、BITMAPINFOHEADERだな。

270 名前:268 :2007/03/10(土) 18:21:52
>>269
つまり、サイズが足りないということでしょうか?

271 名前:268 :2007/03/10(土) 19:24:59
サンプルファイルを出力したところ、24bitであることは確認しました。
どこが悪いんでしょう?

272 名前:デフォルトの名無しさん :2007/03/10(土) 19:32:55
>>268

これか、
CopyMemory( &BitmapInfo.bmiHeader, &(pVideoHeader->bmiHeader), 
                sizeof(BITMAPINFOHEADER));

探すの面倒だから直リンして欲しいな。
http://pc11.2ch.net/test/read.cgi/tech/1168354839/658

コピー先と、コピーするサイズとか確認してみれば。

&BitmapInfo.bmiHeader が有効なメモリを指してる?
&(pVideoHeader->bmiHeader) が有効なメモリを指してる?
sizeof(BITMAPINFOHEADER) これはあっていると思うけどさ。


273 名前:268 :2007/03/10(土) 19:37:59
&BitmapInfo.bmiHeader:1000E380
&(pVideoHeader->bmiHeader):30
むう?

274 名前:268 :2007/03/10(土) 19:41:33
Bitmapinfoをローカルにすると
&BitmapInfo.bmiHeader:12F044
&(pVideoHeader->bmiHeader):30
&BitmapInfo.bmiHeaderが怪しいですね。

275 名前:268 :2007/03/10(土) 19:42:42
で、怪しいのはわかったんですが対処方法がわかりませんorz

276 名前:デフォルトの名無しさん :2007/03/10(土) 19:49:11
何かおかしいときはリビルドすると直ったりするんだよ

277 名前:デフォルトの名無しさん :2007/03/10(土) 19:50:18
ヘッダに書いただけで動かなくなるとは思えないしさ!

278 名前:デフォルトの名無しさん :2007/03/10(土) 19:51:15
>>276
もう8回くらいリビルドしてますorz
手動でbmiHeaderを初期化したりしてもダメでした。

279 名前:デフォルトの名無しさん :2007/03/10(土) 20:06:49
初心者スレに戻りなはれ

280 名前:268 :2007/03/10(土) 20:09:10
そうします。orz

281 名前:265 :2007/03/10(土) 23:31:42
>>266
その方法を試すために、まず出力ピンのメディアタイプを取得しようとしたのですが、
原因不明のエラーが出ます。
何がまずいのでしょうか?

HRESULT (作成した変換フィルタクラス名)::Transform( IMediaSample *pIn , IMediaSample *pOut ){
    
    ・・・

    //出力ピンのメディアタイプを探す
    IEnumPins *pEnumPins;
    IPin *pPin;
    PIN_DIRECTION PinDirThis;
    AM_MEDIA_TYPE *pmt;

    this->EnumPins( &pEnumPins );
    pEnumPins->Reset();
    while( pEnumPins->Next( 1 , &pPin , NULL ) == S_OK ){
        pPin->QueryDirection( &PinDirThis );
        if ( PinDirThis == PINDIR_OUTPUT ){
            pPin->ConnectionMediaType( pmt ); ←定義されてないのに使ってるというようなエラー
        }
    }
    DeleteMediaType( pmt ); ←上と同じエラー

    ・・・

}

282 名前:265 :2007/03/10(土) 23:36:19
>>267
タイムスタンプ修正は行えるのですが、下段の入力ピンのIMemInputPin::Receiveを
どのようにすれば呼び出せるのかが分かりません。
>>281で示したようなコードでIPinクラスは取得できるのですが、
ttp://msdn.microsoft.com/library/ja/jpdx8_c/ds/ref/class/CBaseInputPin.asp?frame=true#CBaseInputPin
ここを見ると、IMemInputPinはIPinの子クラスなので、それに実装されているReceiveメンバに
アクセスできません。
ご教授願います。

283 名前:デフォルトの名無しさん :2007/03/11(日) 00:38:34
トランスフォームフィルタのソースがベースクラスとして公開されてるんだから勉強するといいよ
CTransformFilter、CTransformInputPin、CTransformOutputPinね
入力サンプルがどう入ってきてどこで変換してどうやって出て行くのか
更にしたのベースクラスの知識も必要になるだろうけどさ

既に下段に接続してる相手のメディアタイプが欲しいなら
出力ピンのCurrentMediaTypeでいいだろ

284 名前:デフォルトの名無しさん :2007/03/11(日) 01:14:56
>>282
m_pOutput->Deliver するだけでOK

285 名前:265 :2007/03/11(日) 03:49:55
>>283
ありがとうございます。
m_pOutput->CurrentMediaTypeでメディアタイプを取得し、pbFormat(VIDEOINFOHEADER)内の
AvgTimePerFrameを変更してやることでフレームレートの変更を試みてみました。
しかし、今まで通りの10000000/29.97[100ns]であれば下流のフィルタ(色空間変換フィルタ)に
繋がるのですが、倍の10000000/59.94[100ns]では接続できませんでした。
残念ながら対応していないようです。

286 名前:265 :2007/03/11(日) 03:50:22
>>284
ありがとうございます。
一枚のサンプルに対し二度出力できるようになりました。
しかし、fpsがきれいに倍化する期間と倍にならない期間が移り変わってうなりのようになっています。
二度の出力中、一枚目のスタートと二枚目のエンドのタイムスタンプはいじっていないので、
そこでの同期は保障されていると思ったのですが・・・
どのようにすれば改善できるでしょうか?
一枚のサンプルに対して行う処理を以下に示しておきます。

//一枚目の処理
・・・
// 入力サンプルのタイムスタンプを取得する
pIn->GetTime( &TimeStart , &TimeEnd );
//エンドタイムを1/59.94[s]早める
TimeEnd -= 166833; //[100ns]
pOut->SetTime( &TimeStart , &TimeEnd );
//下流フィルタにDeliverする
m_pOutput->Deliver( pOut );

//二枚目の処理
・・・
// 入力サンプルのタイムスタンプを取得する
pIn->GetTime( &TimeStart , &TimeEnd );
//スタートタイムを1/59.94[s]遅くする
TimeStart += 166833;//[100ns]
pOut->SetTime( &TimeStart , &TimeEnd );
//下流フィルタにDeliverする
m_pOutput->Deliver( pOut );

287 名前:デフォルトの名無しさん :2007/03/11(日) 05:56:40
>>266 でも書かれているが、GetMediaType時にAvgTimePerFrameの時間を半分にして接続を完了させればいいんでね?

部分的コードなのでわからないが、サンプル使いまわしたりはしていないよね?

288 名前:265 :2007/03/11(日) 09:37:13
>>287
試しに
AvgTimePerFrame /= 2;
としてみましたが、やはり受け付けませんでした。
AvgTimePerFrame /= 1;
だったら大丈夫です。
>サンプル使いまわしたりはしていないよね?
他の方が作られたサンプルを使いまわししてます。
ですが、Transformメソッドをいじるだけくらいのシンプルな変換フィルタでして、その処理部分に関しては
すべて書き換えています。

289 名前:デフォルトの名無しさん :2007/03/11(日) 11:18:23
タイムスタンプの変更は問題ないです。EndTimeが0で来る場合もあるのでチェックして下さい。

> Transformメソッドをいじるだけくらい
CTransformFilter::Receive内でもDeliverしてるからな。その辺り大丈夫だよね?

文面から察するに
OutputPin::CurrentMediaTypeでメディアタイプ取得できるってことはピンが繋がっている状態なのだが
一旦Pin接続解除した後にフレームレート倍のメディアタイプを色変換に提示(OutputPin::GetMediaTypeで設定)して
再接続を試みてるんだよね?

290 名前:265 :2007/03/11(日) 11:56:35
>>289
>EndTimeが0で来る場合もあるのでチェックして下さい。
チェックしてみましたが、EndTimeが0で来る様子は見られませんでした。
>CTransformFilter::Receive内でもDeliverしてるからな。その辺り大丈夫だよね?
どうなんでしょう・・・影響があるかは判断しかねます・・・
メディアタイプ変更の件ですが、グラフエディタ上で接続が断たれた状態からピンを繋ごうとしたとき、
キャプチャフィルタのメディアタイプから変更しなかった場合は成功し、変更すると失敗する、というかんじです。

フレームレートの不安定ですが、もしかしたら処理負荷が大きいためかもしれません。
表示ウィンドウのサイズを大きくする(ネイティブサイズは同じ)とフレームレートが落ちていきます。
CPUの使用率は60〜70%ですが、VMR9側の問題でこのようなことになっているのかもしれません。

この負荷の原因として、変換フィルタとVMR9との間に挟まっている色空間変換フィルタが挙げられます。
キャプチャフィルタから直接VMR9に繋ぐときは介在せず、CPU負荷も小さいです。
ところが、同じメディアタイプを設定しているにも関わらず、変換フィルタを挟むと、その後に色空間変換フィルタ入ってきます。
キャプチャから直接VMR9の場合はシステムメモリは介さず、直接ビデオRAMに移す、というようなことでもしているから
こんなことになるのでしょうか?
もし変換フィルタから直接VMR9に繋げられるような方法がありましたら教えてください。

291 名前:268 :2007/03/11(日) 16:50:34
別のソースを元にいろいろいじってたんですよ。
(そっちのソースはCopyMemoryで落ちないので)
で、そっちのBitmapInfoのbmiHeaderを調べてみたところ、他の値は想定の範囲内なんですが
BitmapInfo.bmiHeader.biCompression = 1685288548
とdでもない値が入っていて、どうやらこいつが原因だと判明。

これって何なんでしょ?
ぐぐったらdvsdとか出てきたんですがよくわかりません。

292 名前:268 :2007/03/11(日) 16:54:12
ちなみに
BitmapInfo.bmiHeader.biCompression=BI_RGB;
なんてことをやると一応動くようにはなりました。
ただ取得できる値がおかしいので正確に動いてる感じではありませんが。

293 名前:268 :2007/03/11(日) 17:04:27
取得部分は以下のような感じです。
void Cam::getImage()
{
HRESULT hr;

// ビットマップ ヘッダーから DIB を作成し、バッファへのポインタを獲得する。
hBitmap = CreateDIBSection(0, &BitmapInfo, DIB_RGB_COLORS, (void **)&buffer, NULL, 0);
firstDIB = FALSE;

// イメージをバッファにコピーする。
DIBBuffer = (long *)GlobalAlloc(GPTR,bufsize);

hr = pGrab->GetCurrentBuffer(DIBBuffer,NULL);

hr = pGrab->GetCurrentBuffer(DIBBuffer,(long *)buffer);

}

AVIを無理やりBITMAPにしているから無理が生じているような予感がちらほら。

294 名前:デフォルトの名無しさん :2007/03/11(日) 18:34:30
帰れといっただろ

295 名前:デフォルトの名無しさん :2007/03/11(日) 18:42:48
>>290
レンダラに直接接続したければ、すべてのフォーマットを出力で対応する必要がある。
まあでも32bitでだいたいの環境はいける。

接続できなければレンダラが対応していないのだろう。正しい接続の仕方ならばね・・・。

296 名前:268 :2007/03/11(日) 20:31:37
>>294
向こうで聞くべき質問じゃないと思ったので・・・。orz

297 名前:デフォルトの名無しさん :2007/03/11(日) 20:32:01
FilterのサンプルにNullInplaceフィルタってのがあるんだけどさ
それをキャプチャデバイスとレンダラの間に入れてみてくれ。
やっぱり色空間変換フィルタが必要とされるか?されないか?

298 名前:デフォルトの名無しさん :2007/03/11(日) 20:35:02
dvsdはDVのSD形式。それがわかんねーなら帰れw

299 名前:265 :2007/03/11(日) 21:09:48
>>297
自前のWindowsSDKにないのでDirectXのExtrasをダウンロードし、その中からNullInplaceフィルタを見つけたのですが、
ビルドすると、PC内に存在しないatlbase.hが無いと言われてしまいます。
無念です・・・

300 名前:デフォルトの名無しさん :2007/03/11(日) 21:44:59
> >CTransformFilter::Receive内でもDeliverしてるからな。その辺り大丈夫だよね?
> どうなんでしょう・・・影響があるかは判断しかねます・・・

どう実装してるかわからんけど、もしかしてTransformメソッドの中で2回Deliverしてる?
CTransformFilter::Receive良く読んで理解してるよね?


301 名前:デフォルトの名無しさん :2007/03/12(月) 08:02:05
俺もフレームレート変換フィルタを作って断念した者ですが、
上流フィルタからの映像が来る来ないに関わらず非同期でフレームレートを作るフィルタが出来なかったんだよな。
今悩んでいる子がここまでやるのなら全力でサポートするよ

302 名前:デフォルトの名無しさん :2007/03/12(月) 08:04:43
最近変換フィルタの話題がちょくちょく出ててうれしい。


303 名前:265 :2007/03/12(月) 08:07:00
>>300
そうです、Transformメソッドの中で2回Deliverしてます。
サンプルの流れがいまいち理解できないです。
そこで今行っている処理の流れを分かる範囲でまとめてみました。

[キャプチャフィルタ]-[変換フィルタ(自作)]-[色空間変換フィルタ]-[VMR9]

[色空間変換フィルタ]の入力ピンからの[変換フィルタ]への呼び出し
CTransformFilter::Receive (CTransformFilter::InitializeOutputSampleを呼び出す)
 ↓
CTransformFilter::InitializeOutputSample (新しいサンプルを[キャプチャフィルタ]の出力ピンから取得する)
 ↓
CTransformFilter::Transform
  (サンプルの処理)
   ↓
  CBaseOutputPin::Deliver (IMemInputPin::Receiveを呼び出す) ←これを>>286のように2回呼び出しています
   ↓
  IMemInputPin::Receive ([変換フィルタ]の出力サンプルを取得する)
   ↓
  [色空間変換フィルタ]での処理
   ↓
  [VMR9]が付与されたタイムスタンプに従って画面に表示

疑問点
>>289さんの言う、CTransformFilter::Receive内でもDeliverしている、という記述がMSDNで見つけられませんでした。
 上記で言えばどの時点で発生するのでしょうか?
・最初のCTransformFilter::Receiveが呼び出されるタイミングが分かりません。
 サンプルが変換フィルタで処理されるサイクルはどのようになっているのでしょうか?

304 名前:265 :2007/03/12(月) 10:06:54
この問題に関していろいろと試してみた結果を書いておきます。

・タイムスタンプがないプレビューピンからの映像に対して変換を行ったところ、同じうなり現象(>>284)が起きた。
・一枚のサンプルに対して二度の処理を行うが、片方の絵を真っ黒にしてみると、フレームが倍化していないときは
二枚目の絵のみが表示される状態であることが分かった。
・二度目のDeliverを外したところ、フレーム倍化の時間が若干延び、倍化していない期間においても
一枚目の絵と二枚目の絵が交互に表示された。
このとき、キャプチャーピンからの映像では倍化していない期間で絵が0.5秒ほどストップすることが頻繁に起こった。
プレビューピンからの映像ではこのストップ現象は起きない。

305 名前:265 :2007/03/12(月) 10:08:49
すみません、
>>284じゃなくて>>286です。

306 名前:268 :2007/03/12(月) 13:35:12
>>298
SD形式はいいんですが、これって普通にBITMAPINMFO構造体として取り出せないんでしょうか?

307 名前:265 :2007/03/12(月) 17:31:09
特定の場合についてのみですが、フレームレートの倍化(30fps→60fps)ができました。
(同時にこの手法のダメさを裏付けるものでもありましたが・・・)
条件は
・キャプチャフィルタのプレビューピンに繋げる(よってタイムスタンプの設定は意味なし)
・二度目のDeliverを無くす(あるともたつきが起こる)
・画面表示をビデオのネイティブサイズである640×480に対し、約2倍以上にするとフレームレートのうなり現象が
無くなり約60fpsで一定となる。
このとき、CPUの使用率はサイズが大きくなるにつれて上がる。

これらの現象から導き出される結論として、
一度目のDeliverと二度目の(本来行われる)Deliverは連続ですぐに行われ、二度目のDeliverにより送信された
二枚目は一枚目で設定したタイムスタンプがあろうが無かろうが即座に描画される。
CPUの負荷が上がり、すぐに二度目のDeliverが処理できない場合、その間一枚目が表示されることとなり、この時間が
ちょうど1/60秒となるときキレイにフレームが倍化されることとなる。
描画サイズが小さいときはCPUに余裕がある期間が存在し、そのときは二枚目のみが表示される。(フレームが倍化されない)
ということが言えると思います。

よって、一度のTransformメソッドで二度のDeliverを用いる作戦はアウトということになりました・・・。

308 名前:デフォルトの名無しさん :2007/03/12(月) 18:47:41
何度も書かれているけど、接続状態がその倍のレートでないと、レンダラはそのfpsで処理してくれないと思うよ。つまり余計に送られてきたサンプルは捨てる。
出力メディアタイプと違うサンプルを出力しても、期待した通りに動かないよね。
あと処理が間に合わない時も、どこかのフィルタが捨てると思う。

一度CPU負荷がほとんど発生しないプロトタイプを作って実験して、処理遅れなのかそれとも別の問題なのか調べて見ては?接続の問題も解決を。

リアルタイムで処理したいんだよね?

それとDirectShowで「サンプル」といえば、IMediaSample2などのデータの事をしめします。
>>287 は、一度ダウンストリームに送信したサンプルをまた再利用するなよってこと。

309 名前:デフォルトの名無しさん :2007/03/12(月) 21:53:42
ビデオレンダラからの品質メッセージをNotifyで受け取ってQuality::Lateを見てみると良いよ。
これがマイナスだとレンダラに間に合って届いている。
プラスだと間に合ってないので到着したとたんにレンダリングされたりして
動きがギクシャクしたり捨てられてカクついたりする

310 名前:デフォルトの名無しさん :2007/03/12(月) 22:14:45
休日の夜中になっても頑張ってるから応援したくなるよ あんまり教えすぎはよくないんだけど

>303 サンプルの流れについて

まず上流(キャプチャデバイス)の出力ピンが、変換フィルタの入力ピンCTransformInputPin::Recieveにサンプルを渡す。
入力ピンRecieveはCTranscormFilter::Receiveを呼ぶ。んでTransformメソッドでサンプルを変換した後、
出力ピンから下流(色変換フィルタ)のRecieveを呼び出す(サンプルを渡す) という流れ

>289で「Deliverしてる」って表現したのはマズかったかな。要は下流にサンプルを渡すってことなんだ。
下流の入力ピンのReceiveを呼び出す(サンプルを渡す)。コレがDeliverの正体。
CBaseOutputPin::Deliverメソッドのソースを見てみるといいよ(Baseclassesのamfilter.cppな)

んでTransformフィルタなんだけど、出力ピンのDeliverメソッドは呼んでいないんだ
どうやって送信してるかというと、CTransformFilter::Receiveの中に次のコードがある

hr = m_pOutput->m_pInputPin->Receive(pOutSample);

これ。ここで送信してる。直訳(?)すると、自分の出力ピンに繋がってる入力ピンのReceiveに
Transoformメソッドで変更を加えたサンプルを渡す ってこと。

長いので続く

311 名前:デフォルトの名無しさん :2007/03/12(月) 22:48:26
303のカキコミについて説明していくよ

> CTransformFilter::InitializeOutputSample (新しいサンプルを[キャプチャフィルタ]の出力ピンから取得する)

InitializeOutputSampleは出力するサンプルの準備をするメソッドなんだ。
ここでは送信するサンプルのバッファをサンプルと結びつける(バッファ自体は出力ピンが確保してる)

HRESULT hr = m_pOutput->m_pAllocator->GetBuffer(

その後で、上流から受け取ったサンプルのプロパティ(各種フラグと言ったほうがわかりやすいか)や時間情報を
出力するサンプルに設定していく。これがInitializeOutputSampleの役割。
このことから、上流から受けたサンプルと、自分で送るサンプルは全くの別物であるということがわかる。
送信が済んだら、このサンプルをリリースすることでバッファの開放などが行われる
(CTransformFilter::Receiveの最後の方 pOutSample->Release(); )

ちなみに上流から受けたサンプルをダイレクトにそのまま下流に出力するのはCTransInPlaceFilterだ

つづく

312 名前:デフォルトの名無しさん :2007/03/12(月) 23:10:36
早い話、君は2回送ってるつもりでも、3回送っていると思われる
しかも3回目のサンプルの時間情報は上流から受けた時間そのもの

313 名前:デフォルトの名無しさん :2007/03/12(月) 23:13:13
Transformメソッドはサンプルの内容を変更するだけじゃないと ブー
そういう設計なんでこざいます だからここから送信したら ブーブー
TransformInputPin::Receiveをオーバーライドしないとアカンねん

314 名前:デフォルトの名無しさん :2007/03/12(月) 23:23:29
まちがえた TransformFilter::Receiveな 酒のんでるからすまんの

サンプルのタイムスタンプ見てレンダラが表示のタイミングを待ったり、時には捨てたりするアルよ
サンプルの不連続性(Discontinuity)とか同期ポイント(SyncPoint)を示すフラグの扱いとか
注意してくれよ キレイなフィルタを作りましょう。んじゃ頑張れ



315 名前:265 :2007/03/12(月) 23:33:31
>>308
了解です。
>それとDirectShowで「サンプル」といえば、IMediaSample2などのデータの事をしめします。
そういうことでしたか・・・
失礼しました。
>>309
ありがとうございます。
調べてみます。
>>310-314
とても丁寧にありがとうございます。
がんばります。

316 名前:デフォルトの名無しさん :2007/03/14(水) 22:52:01
>>306
dvsdなんかではCreateDIBSectionに失敗しそうな気がするけど、それはないの?

あと、フィルタいじれるなら入力ピンのCheckMediaTypeでMEDIASUBTYPEの
RGB24かRGB32以外を弾くようにすれば、その辺不問にできるような気がするけど・・・。

317 名前:デフォルトの名無しさん :2007/03/15(木) 01:14:32
すみません。
DVDをAVIにして保存したいんですが、YUYをRGBに変換するフィルタとAVIを書くフィルタは自前で作るのですか?
色々やってみてダメだったらヒントください。
ちょっと頑張ってくる。


318 名前:268 :2007/03/15(木) 14:03:14
>>316
はい、失敗します。orz
他の方法でやらなきゃいけないんでしょうか?

319 名前:デフォルトの名無しさん :2007/03/15(木) 14:11:19
>>318
(1) 普通のDIBを用意して、そこにDrawDibDrawで描く
(2) 入力ピンのフォーマットをRGB24/RGB32に限定して、フィルタグラフ側で変換してもらう
(3) 自分でDVをでコードする

1,2は実質的にはaviのというかvfwのdvコーデックが使われる。

「やらなきゃいけない」かどうかは自分で決めればいい。
やりたくないならやらなくていいんじゃない?

320 名前:268 :2007/03/15(木) 16:40:18
>>319
うお、ありがとうございます!
ちょっくら試してみます!

321 名前:268 :2007/03/15(木) 18:38:43
とりあえず(1)はDrawDibOpenの時点で落ちるので保留。
(2)を試してみます。

ttp://webcamxtra.sourceforge.net/
これを活用すればいけそうな気もしてるんですけどね・・・。
今までウェブカメラは自力で処理できていたのでどうにかしたいもんです。orz

322 名前:268 :2007/03/15(木) 18:52:30
ん、DrawDibOpen動いた。
あとはDrawDibDrawの引数だけだと思うので、ちょっくら追ってみます。

323 名前:デフォルトの名無しさん :2007/03/15(木) 23:07:58
ICaptureGraphBuilderを利用してSetOutputFileNameやって、
DVD Navigaterのフィルタを取ってRenderStreamすればAVIにできると思ったのにダメでした。

DVDをAVIにして保存する方法って何かあるんでしょうか。
サンプルグラバつなげられれば保存できる気もするんだけどPINをつなげられない。

324 名前:デフォルトの名無しさん :2007/03/16(金) 00:54:44
ビデオ形式
ビデオ タイプについては、サンプル グラバは VIDEOINFOHEADER 形式を必要とします。VIDEOINFOHEADER2 や DVINFO などの
他の形式タイプを必要とするフィルタに接続することはできません。
このため、MPEG-2 や DV ビデオ、またはフィールド ベースの (インターレース)
ビデオとの互換性はありません。
http://www.microsoft.com/japan/msdn/directx/techart/grabbersample.aspx#limitationsofthedirectshowsamplegrabber

うぉー、絶望的なことかいてあった。orz....
サンプルグラバに繋がらないわけだ。
Overlay Mixer −> サンプルグラバ −>AVIMUX という流れができるか明日ためしてみる。

325 名前:268 :2007/03/16(金) 16:53:10
DrawDibBeginがfalseを返す・・・。orz
というわけで他の方法試してみます。

326 名前:デフォルトの名無しさん :2007/03/16(金) 16:55:37
BeginとEndは実は要らない。

327 名前:268 :2007/03/16(金) 17:12:04
>>319
> (3) 自分でDVをでコードする
って、サンプルとかないですよね・・・。orz

328 名前:326 :2007/03/16(金) 17:19:30
>>326
ま、マジですか。
ちょっくら試してみます。

329 名前:368 :2007/03/16(金) 17:20:05
あせって名前間違えた。orz
>>328は自分です。

330 名前:268 :2007/03/16(金) 17:24:46
うーん、DrawDibDrawがやっぱりfalse。
何か記述が足りない気がしてきた。

サンプル探してるんですけど全然見つからないんですよね。orz

331 名前:デフォルトの名無しさん :2007/03/16(金) 21:58:23
>>330
サンプルグラバ使ってるんですよね?
SetMediaTypeでMEDIASUBTYPE_RGB24指定して
dvsdで流れてこないようにしたらどうですか?

あなたのレスをすべて追っかけてるわけじゃないんで、外してるかもしれませんが。

332 名前:デフォルトの名無しさん :2007/03/16(金) 23:26:24
散文だし小出しだし追いかける気になれない。

333 名前:デフォルトの名無しさん :2007/03/17(土) 01:06:17
OverlayMixerの後ろにサンプルグラバはつながらないと思うよ。
OverlayMixerはレンダラとつながる。そしてオーバーレイで自分が描画している。
後ろにつながっているビデオレンダラはメディアサンプルを受け取っておらず、
ウインドマネージャを提供しているに過ぎない。
つまりたとえつながってもサンプルを取ることはできない。

はず。


334 名前:デフォルトの名無しさん :2007/03/17(土) 01:23:46
>>333
はい。そうでした。全く繋がらなくて1日無駄にしました。
DVDをAVIにしなきゃ行けないんで作り方を模索中。
やるならOverlayの上流にあるDVD用デコーダフィルタですかね。
GraphEditでRendererとサウンドをぶった切ってASFライタを入れると
DVDをWMVにできたりします。
この方式で画質設定と開始位置と終了位置を設定して保存できればいいのかもしれない。

最後にWMVをAVIに変換して終了させるという最低の方法を選ぶ。
AVIMUXにつなぐ方法ありましたらヒントください。

最近のライブラリから外れたBaseClassのCtransなんたらで自作フィルタを作るしかないんですかねぇ。
それでYUYをRGB24とかに変換。

DVD Navigater -> 何かフィルタ -> Video Commplessor -> AVI MUX -> File Writer
という形で保存できればいいんですが。

335 名前:268 :2007/03/17(土) 21:42:01
動きますた!(・∀・)
原因は>>316>>331あたりが正解だったようです。
ボスに言われてイチから書き直したらうまく動きました。

というわけで、本当にありがとうございました。
DirectShowと戦うことができたのはこのスレのおかげです。

336 名前:デフォルトの名無しさん :2007/03/17(土) 22:04:51
>>335
おめっとさん、その二つはいずれも私ですがw
実はDirectorのXtraに興味があってちょっと追いかけてました。
Xtraの描画周りって何を参考にしました?
キャプチャした画像を直接Director上で表示するのでしょうか?

ちょいスレ違いスマソ

337 名前:268 :2007/03/18(日) 22:28:43
>>336
自分はDirector上での描画はやってないですね。
CreateDIBSectionで取得したピクセル毎のBGR値の差分を比較して使っています。

今回DVカメラを扱う上で参考にしたのは↓ですね。
http://wwwdoi.elec.nara-k.ac.jp/html/jisyu/dxm/cap2/index.html
処理部分コピペでもとりあえず動きます。
# コンソールも出せるみたいです。

Xtra開発者は海外の人ばっかりなので、日本人も増えてほしいもんです。

338 名前:336 :2007/03/19(月) 21:42:14
>>337
なるほどどうもっす。
DirectShowのフィルタ書いてお茶を濁そうと思っていたのですが、
クライアントの意向によりXtraを直接弄る必要があり、
ちょいとハマってたところでした。

DirectShowも情報ない方だけど、Xtraはもっと険しい道だなこりゃ・・・。

339 名前:デフォルトの名無しさん :2007/03/21(水) 10:49:02
asfを再生しようとすると
DirectShow フィルタ グラフに存在しないピンに操作を実行しようとしました。
になって再生できません、対策はありませんか?

340 名前:デフォルトの名無しさん :2007/03/21(水) 20:05:39
どうやって再生しようとしてんの?それじゃ意味わからんよ。

341 名前:デフォルトの名無しさん :2007/03/21(水) 20:42:03
若いの オラが村では派遣労働の問題を口にしちゃなんねーだ
お前さんはまだわけぇから言いたいこともあるべぇ
だべな、派遣問題を口にするとバカにされたと思ってムキになって怒る者がおるでよぉ
てめぇでの責任で派遣やってる癖に派遣問題に触れると逆ギレするバカなんだけどよぉ
そんでもこの問題の指摘は駄目だっぺぇ
派遣のことは口にしちゃなんねぇ
この村みたいな民度ゼロの会社で現実忘れるためにはよ
北朝鮮とか宗教団体と一緒でよ、駄目なものを駄目と言ってはなんねえだべさ
タブーを口にしちゃいけねぇだ


342 名前:デフォルトの名無しさん :2007/03/25(日) 16:03:45
変換フィルタを作っているんですが、そのフィルタのコンストラクタでmallocを使って
メモリを確保し、デコンストラクタでfree()で解放するようにしているのですが、
アプリ側でRemoveFilter()をしても、デコンストラクタが起こらないのかメモリが解放されません。
どうすればデコンストラクタを起こすことができるでしょうか?

343 名前:342 :2007/03/25(日) 16:05:53
↑すみません、デコンストラクタじゃなくてデストラクタです。

344 名前:デフォルトの名無しさん :2007/03/25(日) 16:30:43
RemoveFilterってグラフからフィルタを切り離すだけだろ
そりゃデストラクタは呼ばないんじゃねーの?

345 名前:342 :2007/03/25(日) 18:09:19
>>344
そうみたいですね。
いろいろ考えたんですが、完全に削除できないのなら、そのまま残しておいて再利用しよう、という
方針で組んだところ、望む動作を実現できました。
いちいち削除する必要がなかっただけの話でした・・・。

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

346 名前:デフォルトの名無しさん :2007/03/25(日) 21:29:18
Releaseが完全に行われていないだけだろ。参照のチェック汁。

347 名前:342 :2007/03/25(日) 23:33:06
>>346
なるほど。
調べてみます。

348 名前:デフォルトの名無しさん :2007/03/26(月) 09:07:56
新規質問です。

ピン接続時のメディアタイプを調べたいのですが簡単に調べる方法がないため今回「メディアタイプチェックフィルタ」を作る事にしました。

質問1.調べるフィルタを誰か作ってませんか?

時間をかけず作りたい為、「TranceForm」をベースにしているのですが、このフィルタで入力ピンのみの構成のフィルタはできますか?(テンプレートのピン数を1本にしても2本になってしまいました何故…?)

349 名前:デフォルトの名無しさん :2007/03/26(月) 10:16:35
いくら出す?

350 名前:デフォルトの名無しさん :2007/03/26(月) 10:17:19
20円

351 名前:デフォルトの名無しさん :2007/03/26(月) 12:14:35
>>349
自分なら作るのに3〜4時間位かかってしまいそうなので、
時給1000円×4hまでならなんとか。。

でも誰か作っていそうなんでそれを使いたいです。

352 名前:デフォルトの名無しさん :2007/03/26(月) 12:53:47
>>348
Dumpフィルタベースじゃダメなんかいね?
あれは入力ピン1コだけど。

353 名前:デフォルトの名無しさん :2007/03/26(月) 13:07:03
IBaseFilter::EnumPins
IPin::ConnectionMediaType

それともこっちか
IPin::EnumMediaTypes

簡単だろ?

とりあえず、リファレンスくらい読め。

354 名前:デフォルトの名無しさん :2007/03/26(月) 22:49:48
TransformFilterならそのまんまCheckMediaTypeで全部拾えばよかばってん

355 名前:デフォルトの名無しさん :2007/03/26(月) 23:39:39
>>354
考え同じ。せっかくだから上位フィルタに優先接続して欲しいタイプも入れられるようにしようかなと検討しとるですばい。

IBaseFilter::EnumPins
これはピンごとに管理したい時につかうメソッドだよ。ピン1つでは実装いらないよ
IPin::ConnectionMediaType
これは再生途中にタイプ変更したい時に実装したほがよさそ

356 名前:デフォルトの名無しさん :2007/03/27(火) 00:10:35
突然思い出したんだけどsampleの中にnullnullフィルタだかなんだか
プロパティページで接続タイプ一式が表示されるやつがあったような ないよーな

357 名前:デフォルトの名無しさん :2007/03/27(火) 00:40:51
何か違うと思って調べてみたらNullInPlaceだったわ ごめんな
nullprop.cppのNullIPProperties::OnApplyChangesみるといいアルよ

358 名前:デフォルトの名無しさん :2007/03/27(火) 00:56:20
なるほどなるほど。
NullIPPropertiesはなかなか難しいことやってますねぇ。。。
理解しずらいや。。

取り敢えず。
上位フィルタとの接続された
フォーマットタイプ、
メディアタイプ、
メディアサブタイプ
をプロパティページで表示できる変換フィルタを作成できました。
フォーマットタイプが「VIDEO」だったら解像度とかフレームレートとか付加情報を
表示できるようにしてみるか。。

このフィルタ欲しい人いる?
まぁきっとだれかもっといいものを作っている人がいるかとは思うのですが

359 名前:デフォルトの名無しさん :2007/03/27(火) 01:23:35
ノシ

360 名前:デフォルトの名無しさん :2007/03/27(火) 01:30:21
了解。じゃあ
人に使ってもらうには汚すぎなんで
(改造しながら他のフィルタのデバッグしてるんで・・・)
週末にでも機能を絞り込んで
見やすくしてみます。

終わったら、
h ttp://ragesakai.web.fc2.com/
にWebpageもってるんであげてみます。


361 名前:デフォルトの名無しさん :2007/03/27(火) 11:29:14
ありがたいっす。マタリ待ちます。

362 名前:デフォルトの名無しさん :2007/03/28(水) 07:41:45
自分が知らないメディアタイプが結構あるね。
メディアタイプ一覧がわかるサイトさがさなきゃ

接続メディアタイプチェックフィルタでは、最悪知らないGUIDが出てきたら
そのまま貼っとくか…




363 名前:デフォルトの名無しさん :2007/03/28(水) 21:21:39
uuids.hでよかばってん

364 名前:デフォルトの名無しさん :2007/03/28(水) 21:41:53
九州男児さんありがとう


365 名前:デフォルトの名無しさん :2007/03/30(金) 01:03:46
AVIファイルの一部を切り出して 拡大縮小したAVIつくりたいんだけど
元AVI(640,480)でRECT(120,120,440,320)の範囲だけきりだして320x240のAVIにしたり
範囲を拡大して640x480にしたいんですが、サンプルグラバのコールバックつくって
中で処理しなきゃダメですかね?



366 名前:デフォルトの名無しさん :2007/03/30(金) 08:24:20
「中」ってどこを指してる?

自分なら映像切り抜きフィルタを作って解決するけどフィルタグラフ側でもできるよ。
フィルタグラフ側でAVIの切り抜きを行った時のサンプルグラバの制御は凄く大変そう…ってか自分には無理なレベル



367 名前:デフォルトの名無しさん :2007/03/30(金) 08:30:25
あ、切り抜きの手段としてグラバを使うのか。
グラバで取得した画像は元AVIと同じサイズなんね。なら出来…るかな?

だけどやっぱり、「切り抜き拡大縮小フィルタ」作るほうが簡単なのは間違いない。

368 名前:デフォルトの名無しさん :2007/03/30(金) 20:49:08
>>367 TransformFilterで切り抜けばよかばってん。
んで後ろにAviMux、FileWritterとつなげればよかよ。

369 名前:365 :2007/03/30(金) 21:25:10
サンプルグラバのコールバック=「中」です。

TransformFilterって、ベースクラスのライブラリから自分で作るフィルタですか?
最初から用意されててAddFilterで追加できるなら使ってみたいかも。



370 名前:デフォルトの名無しさん :2007/03/30(金) 21:38:03
> TransformFilterって、ベースクラスのライブラリから自分で作るフィルタですか?
んだよ自分で作るんだよ Transformメソッドで好きにいじってよし

んで後ろにAviMuxが繋がる時にね、ビデオの縦横サイズはオリジナルサイズじゃなくて
自分が変更するサイズを提示するったい Muxは提示されたサイズをヘッダ情報に
書いてた気がするばってん

371 名前:デフォルトの名無しさん :2007/03/30(金) 22:23:31
IRenderEngine2とかで何とかなるんでしょうか。
DirectShowの編集サービスっての使えますか?


372 名前:デフォルトの名無しさん :2007/03/30(金) 22:37:06
質問に答えてくれた皆様ありがとうございました。
ちょっくらトランスフォームフィルタつくってみます。
コンプレッサの前にトランスフォームでサイズ変える処理いれてみます。
CreateDIBSectionでHBITMAPつくってストレッチビルドして試してみます。

373 名前:デフォルトの名無しさん :2007/03/31(土) 00:03:12
>>372
作り方は大正解◎。
コツを少々・・・
流す映像のサイズをかえちゃうと
設計が大変になるから
「切り出し」→「拡大」でもとのBMPサイズに合わせるようにすると
いいよ。
それとストレッチベルトを「CTransform::Transform」内でつかうんだけど
ストレッチベルトの関数1つで全体のCPU負荷が15%ぐらい上がってしまう。

もし気になるなら、画像処理ライブラリで置き換えするとよいよ


俺ここんとこ九州男児さんと考え方が似てる。。同じような職種&年齢なんだろうな。


374 名前:デフォルトの名無しさん :2007/03/31(土) 00:27:00
おいどんは昔printfをプリンテフと読んで笑われた苦い経験があるばってん
一応つっこんでおくけど、「ブリット」ですたい。
StretchBlt ストレッチブリット BitBlt ビットブリット

375 名前:デフォルトの名無しさん :2007/03/31(土) 00:37:23
>>374
ほへ〜。初めて知りました。
呼び方は「Blt」⇒「ベルト」と呼んでました。。
言い訳しまくると、自分組み込み系出身でwinアプリ作るの今年から初めた門で。
WinAPIを知らなさすぎる。。この機会に他の呼び方も覚えよう

今後直しますありり^^

そして、メディアタイプチェッカーも明日だらだらし終わったら修正に取り掛かるっす

376 名前:デフォルトの名無しさん :2007/03/31(土) 00:42:28
関数の呼び方議論↓
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200508/05080002.txt



377 名前:デフォルトの名無しさん :2007/03/31(土) 00:46:01
>>373
なんか、映像のサイズ変えて保存したいって突然いわれたんで
変更しなきゃいかんのです。
切り出して切り出したサイズで保存なんですよ。

切り出して元の再隋拡大だったらサンプルグラバでおわったのに。

サンプルグラバでCreateDIBSectionかけてmediasampleからバッファとって
データ加工して代入。ここまでは出来てOKだった・・・
ストレッチビルトして正しく終わったのに・・orz...

378 名前:デフォルトの名無しさん :2007/03/31(土) 01:09:59
ぶりっとっていう呼び方なんかアレだよね。アレ。
DirectX8からPresent()になったのはホント良かったと思うよ。

379 名前:デフォルトの名無しさん :2007/03/31(土) 01:26:56
>>377
ごめん。。
内容的には以前自分が作った「解像度リサイズフィルタ」
これの仕組みがまんまメインになってくるんだが
教えてあげられない。。
自分で調べてくれ。

380 名前:デフォルトの名無しさん :2007/03/31(土) 01:57:15
>>379
できたから問題無し。

381 名前:デフォルトの名無しさん :2007/03/31(土) 02:28:31
TransformFilterを使わずにビデオソースの拡大縮小と切り出しする方法って無いのかな。
切り出しと拡大縮小ぐらい用意されてるような気がして探し回ってた時期があった。



382 名前:デフォルトの名無しさん :2007/03/31(土) 16:37:52
一口にビデオソースといってもRGBやらYUVやら色々あるけんね
拡大、縮小にも色々なアルゴリズムがあるったい 自分の好きなようにつくるのが一番よかよ
どうせつくるならそのへんプロパティページで色々指定できるとうれしいね

383 名前:デフォルトの名無しさん :2007/03/31(土) 22:24:58
ここもネガティブさんが沸いてるよ。
自分で調べれって話なら書く必要ないじゃん。
教えて上げられないレス増えるからネガティブさん消えてくれwwwwwwwwwww

384 名前:デフォルトの名無しさん :2007/03/31(土) 23:03:57
>>383
DirectShowやってる人の総人口が少ない。
そしてそれが理由なのかここのスレの回答側に立つ人も少ない。
このスレで役に立てばと思って結構回答をしているが、
何が難しいかわかるけど教えてあげられない状況だったので、
放置されるよりはいいと思って書き込みました。

(本スレ後半でageてるやつはほとんど自分)
>>383さんもそんなこと書き込んでないで回答側に回ってくれ

385 名前:デフォルトの名無しさん :2007/04/01(日) 00:08:34
まあ内容はともかく、少しでも盛り上がってくれるのは嬉しいわな。
その昔サンプルグラバを知らなかった自分は自前のフィルタ作っちゃったし、
話の流れで知ることもそれなりに多い・・・。かな?

386 名前:デフォルトの名無しさん :2007/04/01(日) 03:12:34
>>363
uuid.hではすべてのメディアタイプは乗ってない。
「MEDIASUBTYPE_I420」
が入っていなかった。


387 名前:C++ :2007/04/01(日) 08:46:54
 C++は今最も優れているプログラミング言語だ。C++さえあればなんでも出来る。CGI一つにしたって、今はPerlなんて使わなくても全部C++で出来る。そんなC++を使わないでどうする。

388 名前:デフォルトの名無しさん :2007/04/01(日) 13:44:39
「全て」のメディアタイプって概念をどう捉えるかだな
まずはDirectX SDKのindlude、DirectShowのBaseclasses ここのソースで定義されてるものを
押さえておけば良いんじゃないの?
極端な話、guidgen使って自分で独自のMediaType作れちゃうわけだし。

389 名前:デフォルトの名無しさん :2007/04/01(日) 22:43:15
MEDIASUBTYPE_I420ってGUIDとしては存在するかもしれないけどどっかのメーカーが勝手に作っただけじゃないの?
DirectShowのオフィシャルな定義としてはMEDIASUBTYPE_IYUVじゃないのか。


390 名前:デフォルトの名無しさん :2007/04/01(日) 23:22:10
そういや自分もmplayerの公開されているソースを見て
普通にMEDIASUBTYPE_I420という定義があるものと思い込み、
いざ実装してみたらものの見事に未定義だった、ということがあったなあ。

IYUVとI420は同じフォーマットのようなので、
私もMEDIASUBTYPE_IYUVを使ってますが・・・。

391 名前:デフォルトの名無しさん :2007/04/02(月) 09:52:04
拡張可能なばっかりにかえって不毛になってるのか

やれやれ

392 名前:デフォルトの名無しさん :2007/04/02(月) 11:49:43
ホントにDirectShowって資料少ないのね。VfW勉強した時も思ったけど
こういう動画処理インターフェースってプログラムとして人気ないのかな?

393 名前:デフォルトの名無しさん :2007/04/02(月) 13:56:56
資料は少ないなりに充実してると思うけど・・・
漏れにはACLの方がワケワカメだよ。

394 名前:デフォルトの名無しさん :2007/04/02(月) 14:27:52
動画処理に興味をもつほど自由に弄れる動画素材を持ってる人が少ない、
という事情もあるのではないか。

後は仕事になるかどうかとか。

395 名前:デフォルトの名無しさん :2007/04/03(火) 20:48:20
+  三ミヽ、⊂⊃
 +  三ミ |∧η∧
  /⌒\ (,,・Д・)<ただいまんこ〜オレも便乗して質問だぞ。
 + 川川 l l/つ つ━☆ トランスフォーマーとかいうのをつかって
     〜(  / CTransformFilter::DecideBufferSizeここでメモリを確保する所までたどり着いたぞ。
      (/"U 俺も拡大縮小をやりたくて書き込みするぞ。オマンコクロスだぞ。
       C言語は7年目だぞ。切実だぞ。

396 名前:デフォルトの名無しさん :2007/04/03(火) 22:27:40
>>395
俺は3年目だけど苦労したができたぞ。
で、何がしりたいんだぼけぇ

397 名前:デフォルトの名無しさん :2007/04/03(火) 22:32:34
・質問のただしいしかた悪いしかた
【いい例】
ぽまえら!おしえやがれぃい。
QVGAをVGAにリサイズしようと思うんだがDecideBufferSizeというめそで
115200byteしかとれねええんじゃUZEEEEEE!!
これを230400byteとれるようにする方法を教えやがれ

【悪い例】
いつも大変このスレッドを読ませていただき参考にさせてもらっております。
今回拡大縮小をやりたいのですがどのようにしたらいいかわかりません。
C++、MFCはできます。
また自分は過去XXXということをやっておりました。
大変恐縮ですがなにとぞご指導をよろしくお願いいたします



398 名前:デフォルトの名無しさん :2007/04/03(火) 22:37:54
まちがえた〜
×115200
○230400

×230400
○460800
用は質問の観点を絞り込んでくるかどうかの差だからな


399 名前:デフォルトの名無しさん :2007/04/03(火) 23:59:22
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<>>396 ポンドルウォーリアを特殊召喚する方法がしりたいぞ。
  ヽ    |フ ナニがしたいのか忘れたぞ!
   /_ _| AVIを半分の解像度にして保存したいんだぞ!これが目的だぞ。
        逆もあるぞ。オパンツ丸見え!
>>397 うんこちんこまんこ?キョカカカ!あばーあばばー!
参考にさせてもらったぞ。面倒だから、ゴゾブログで質問に答えてくれればそれでいいぞ。
オマンコクロッサー!

400 名前:デフォルトの名無しさん :2007/04/04(水) 00:59:12
・・・>>397で極端に書いたのに意味を理解しとらんのでヌルーする

401 名前:デフォルトの名無しさん :2007/04/04(水) 01:28:29
メディアタイプチェックフィルタ
作ったぞ

実は裏で機能をいろいろ盛り込んでみたが、
普通の使い方だけしてくれ。

http://zetubou.mine.nu/itoshiki/upload.cgi
っ【 [zetubou6474.bin] メディアチェックフィルタ 96 application/octet-stream 2007年04/04(水)01:25
これをリネーム
⇒0Mediachk.ax
それをregsvr32で登録

402 名前:デフォルトの名無しさん :2007/04/04(水) 01:52:35
ここはム板だ

403 名前:デフォルトの名無しさん :2007/04/04(水) 08:59:19
ゴゾブログのプロフ欄の写真の子カワイイ。
写真と引き換えならオニーサンがAVI半分にするフィルタ作ろう。(ただしソースはやれないがな)

404 名前:デフォルトの名無しさん :2007/04/04(水) 14:50:04
http://www.free-codecs.net/Moonlight_Scalar_DirectShow_Filter_download.htm

405 名前:デフォルトの名無しさん :2007/04/04(水) 16:48:36
>>404
このムーンライトフィルタってさ、カメラがI420の時は接続すらしてくれないんだね。

解像度もメディアタイプも変更してくれるいいフィルタだと思ったんだけど残念

406 名前:359 :2007/04/04(水) 17:35:35
>>401(>>360の人?)
ありがとう、ダウンロードしてみました。
個人的には結構重宝しそうな感じです。

407 名前:デフォルトの名無しさん :2007/04/04(水) 18:23:20
>>360=>>401
です。

ちゃんと動きましたか?
バグを見つけたら速やかに報告よろ。

時間見つけ次第ちゃんとウェブページに反映しとくです。
感謝されるのに生き甲斐を感じた。ありり

408 名前:デフォルトの名無しさん :2007/04/04(水) 19:27:31
CBaseVideoRendererでフィルタを作っていて、一時停止中に画面の再描画を
行うためGetCurrentSample()でサンプルを得ています。
サンプルの取得は成功しているのですが、このあとに再生するとDoRenderSample()が
呼ばれなくなって固まってしまいます。

どうしてでしょうか?

409 名前:デフォルトの名無しさん :2007/04/04(水) 20:04:25
>>408
Releaseし忘れっぽい

410 名前:デフォルトの名無しさん :2007/04/04(水) 21:07:23
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<ただいまんこ〜拡大縮小できたぞ。BokkingFilterの完成だぞ。
  ヽ    |フ ビデオのサイズが変わらなかったのはフィルタ接続後にサイズ変えてたからだぞ。
   /_ _|
CheckTransformでサイズを変更したぞ。
変更したサイズからRGB24で必要なバッファサイズを計算して保存だぞ。
ストレエッチDIBitmapだぞ。それに対してソースからストレッチDIBitsして
完成したぞ。

そして完成した後に次の問題が出たぞ。
時間指定して3分の動画で1分目から2分目を抽出したいんだが
ControlStreamにS_OK帰ってきてもダメポだぞ。

AVI再圧縮で時間指定して抜き出すテクを知ってたら教えて欲しいぞ。オマンコクロスだぞ。切実だぞ。

411 名前:デフォルトの名無しさん :2007/04/04(水) 21:12:04
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<あと、AVI MuxフィルタをキャプチャグラバからFindInterフェラして
  ヽ    |フ IAMStreamControlを生み出してStartAtとStopAtする方法を作ったんだが
   /_ _|  ム圧縮AVIなら何とか成功してWMVとかコーデック使うと画像が表示されんぞ。
あと、保存してない間も無駄に待たされて酷い目にあったぞ。
誰かオレがナニをすべきか教えて欲しいぞ。

412 名前:デフォルトの名無しさん :2007/04/04(水) 21:36:48
ControlStream(&PIN_CATEGORY_CAPTURE,ぬるぽ,ぬるぽ,開始時間,終了時間、0,0);
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<キャプチャビルダのコントロールストリームはこんな具合になってるぞ。
  ヽ    |フ オマンコクロスだぞ。ソースを持って変えれないので具体的に説明できんぞ。
   /_ _|

413 名前:408 :2007/04/04(水) 22:46:10
ありがとうございます。
まさにそれでした。SDKのヘルプに書いてありましたね

414 名前:デフォルトの名無しさん :2007/04/04(水) 23:23:04
>>410
素直にこれ使えば?
http://www.microsoft.com/japan/msdn/directx/techart/cplusvbappdevs.aspx
http://www.microsoft.com/japan/msdn/directx/techart/wm_des.aspx


415 名前:414 :2007/04/04(水) 23:23:49
貼り忘れた
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdx8_c/ds/des/Oview/whatisDES.asp

416 名前:デフォルトの名無しさん :2007/04/04(水) 23:35:12
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<>>415 それも考えたんだぞ。大人の都合ってヤツでダメなんだぞ。
  ヽ    |フ くやしいぞ。オマンコクロスファイヤーハリケーンだぞ。
   /_ _| 明日、ためしに作ってみるぞ。

417 名前:デフォルトの名無しさん :2007/04/04(水) 23:45:11
いいから↑はほっといてやれ。


418 名前:359 :2007/04/04(水) 23:57:28
>>407
今のところ問題なさそうですよ。
ただ、スレの流れを見ると私以外で使ってみた人いないのかな?w

もう少し使ってみて気がついたことがあったら報告しますね。

419 名前:デフォルトの名無しさん :2007/04/05(木) 00:03:51
>>418
>私以外使ってる人いない…
(´・ω・`)ショボーン




420 名前:デフォルトの名無しさん :2007/04/05(木) 21:34:17
おまえら便利なフィルタの一覧サイト作ろうぜ!
あと、××の製品かうと着いてくるフィルタは…とか語ろう

421 名前:デフォルトの名無しさん :2007/04/06(金) 11:53:29
http://pc11.2ch.net/test/read.cgi/avi/1030190329/
・・・とはいえ、思いっきり過疎ってるスレだし>>419のニーズには合わんかな。


ところで質問です。
AddSourceFilterで追加したファイルソースの
出力ピンのメディアタイプを指定する方法はないでしょうか?

あるファイルを指定したとき、ただRender()しただけでは期待しているフィルタに
繋がらない(ファイルソースのメディアタイプがGUID_NULLになっている)ので
強制的に指定してみたいのですが・・・。

422 名前:デフォルトの名無しさん :2007/04/06(金) 12:41:37
>>421=>>359さん??
質問は>>419に聞いてるのかな?
だったら応えます。

上流フィルタがカメラとかの入力デバイスの場合は「フィルタのピンプロパティ」から出力タイプを変更できるものがほとんどです。

仮に「動画」などのファイルであれば変換フィルタを噛ます事で変更は出来ますが新たに付けてやることは出来ません。

新規にフィルタを作成すればメディアタイプを付加しる物を作れるよ。
他の方法はわかりません

423 名前:デフォルトの名無しさん :2007/04/06(金) 13:13:09
>>422
> >>421=>>359さん??
うわー、なんで分かるの?w

> 新規にフィルタを作成すればメディアタイプを付加しる物を作れるよ。
> 他の方法はわかりません
やっぱりそれしかなさそうですね。
AsyncRdrサンプル辺りをベースに1つ作ってみます。

424 名前:デフォルトの名無しさん :2007/04/07(土) 01:07:30
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<無圧縮タイプのAVIなら時間切り出しできたぞ。
  ヽ    |フ ただ、無駄に時間がかかるぞ。切り出すまでフィルタにデータが流れて処理してるんだぞ。
   /_ _| ポンドルウォーリア特殊召喚だぞ!ゴルァ!

425 名前:デフォルトの名無しさん :2007/04/08(日) 10:32:36
>レンダラは知らないけど、画面の上側にプレーヤを持っていくと少し(体感しないけど)
>速くなるらしい。なんかPresent(?)の戻りが早くなるとか言ってた。

これ本当?

426 名前:デフォルトの名無しさん :2007/04/08(日) 11:42:57
>>425
画面描写しないぶんタイムスタンプに忠実になるだけかと。。
>>424の話とは全然違う話

427 名前:デフォルトの名無しさん :2007/04/08(日) 17:03:02
Presentの戻りって何?
プリロールかな?としても意味通じないし…
予測ツカナス

428 名前:デフォルトの名無しさん :2007/04/08(日) 17:45:38
IDirect3DDevice9::Present()の話だな。

429 名前:デフォルトの名無しさん :2007/04/09(月) 21:41:47
 初心者です。SDKサンプルで分からない点があるのですが、お教え頂けないでしょうか。

 プログラム動作としては、3つのmp3ファイルをタイマーで順繰りに再生するだけです。※1
 この中でソースフィルタを変更してグラフを再構成する部分で分からない点があります。

流れ
 1.新しいソースフィルタをグラフに追加する。
 2.古いソースフィルタをグラフから削除する。
 3.新しいソースフィルタの出力ピンからRenderする。


2の部分の詳細は以下のようになっています。

 A.グラフ内のフィルタを列挙する。
 B.列挙された全フィルタについて

     a.一旦グラフから削除する
     b.古いソースフィルタでなければグラフに追加する

疑問点
 b.の部分がある意味がわかりません。自分としては、グラフ内の全フィルタを削除して、新しい
ソースフィルタを追加して、Renderすれば簡単に思えるんですが...
 
 どうかよろしくお願いします。

※1 ソースはSDK_Path\Samples\C++\DirectShow\Players\BGMusicです。

430 名前:デフォルトの名無しさん :2007/04/09(月) 22:16:14
SwapSourceFilterのメソッドのこと?


431 名前:デフォルトの名無しさん :2007/04/09(月) 23:29:52
>>429
Render は重いから。

432 名前:デフォルトの名無しさん :2007/04/10(火) 00:46:05
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<>>429 サウンドってのは、レンドルァすると全部のcodecを試すんだぞ。
  ヽ    |フ だから、全て消して再構築すると連続再生とかできんぞ。
   /_ _| アイマスの魔法をかけて!から、とかちつくちての連続技の間に途切れるって事だぞ。

433 名前:デフォルトの名無しさん :2007/04/10(火) 01:13:25
>>432
やべぇ見直した。。

434 名前:デフォルトの名無しさん :2007/04/10(火) 01:55:46
ありがとうございます。
なるほど、それで以前使ったフィルタは残してたんですねφ

ところでその時、つながっていないフィルタがグラフ上に散在している状態ですよね。

その状態でRenderしたら、全Codecを試さず、散在しているフィルタを繋げてくれるんですか?
それともRenderを使わず、ピンを繋ぐ方法が別にあるのでしょうか?

この板のレベルに達するまで勉強して、出直してきます。(時間かかりそう...)

435 名前:デフォルトの名無しさん :2007/04/10(火) 07:21:49
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<>>434 朝勃ち中だが答えるぞ。
  ヽ    |フ レンダーすっと、フィルタが追加されている物から試すんだぞ。
   /_ _| そのため、レンダーする前にvmr9のフィルタとかを入れておくとただのビデオレンダーじゃなくなったりするぞ。
      だから、先に自分で作ったフィルタを入れておくと正しく繋がったりするぞ。
もちろん、Renderを使わずにグラフビルダのほうでConnectすることができるぞ。
IPinってのをフィルタから抜き出して接続できるみたいなんだぞ。
使った事無いからうまんちんまんだぞ。

436 名前:デフォルトの名無しさん :2007/04/10(火) 07:39:07
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<なんか、間違ってるかもしれんが許してほしいマンコ!んじゃ為替予想書いてくるぞ。
  ヽ    |フ
   /_ _|

437 名前:デフォルトの名無しさん :2007/04/10(火) 12:02:08
すみません、質問いいですか?
今、DirectShowでUSBカメラからサンプルグラバでBMPをキャプチャするプログラムを作っています。
コールバックを使用してキャプチャをしようとしているのですが、
SetOneShotを使って1フレームだけキャプチャすることは出来ないのでしょうか?
ためしにSetOneShot(TRUE)としてみても、コールバックされ続けてしまいます。

438 名前:デフォルトの名無しさん :2007/04/10(火) 17:56:39
出力ピンがオーディオとビデオの2つある、Splitterフィルタを作成しています。
フィルタのGetMediaTypeでは、ピンによって2通りの設定が必要と思っています。
(オーディオの方の出力ピンからGetMediaTypeが呼ばれた場合はオーディオの値をセット、
ビデオの出力ピンからGetMediaTypeが呼ばれた場合はビデオの値をセットというように。)
しかし、GetMediaTypeでは、現在どちらの出力ピンから呼ばれているのか判別できないのですが、
どうしたら良いでしょうか。

出力ピンのクラスは同じものを使っているのですが、オーディオ用のピンクラス、ビデオ用の
ピンクラスと別に作成しなければならないのでしょうか?


439 名前:デフォルトの名無しさん :2007/04/10(火) 19:30:13
>>438
自分がどっちのピンかを区別して処理を変えればいいじゃん。

440 名前:デフォルトの名無しさん :2007/04/10(火) 21:10:34
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<>>437 ただいまんこー!ドピュンコしたあとに、コールバックを外せばOKだぞ。
  ヽ    |フ コールバックをセットしたままだと永遠にデータが流れるぞ。
   /_ _| オレだったらSampleCBのあるクラスに BOOL m_Ochinpoいれて
データを流したくない時はfalseいれて SampleCBのなかでreturn S_OKしちゃうぞ。
オマンコクロッサー!


441 名前:デフォルトの名無しさん :2007/04/10(火) 21:13:06
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<>>438 IPin淫乱フェラにあるQueryPinInfoで解決できる気もするぞ。
  ヽ    |フ 俺も調べないと分らんぞ。スマソだぞ。力になれんぞ。
   /_ _|

442 名前:デフォルトの名無しさん :2007/04/10(火) 22:06:54
VBプログラマにVisual C++を教えるスレ★ Part25

443 名前:デフォルトの名無しさん :2007/04/11(水) 00:10:36
>>441タソ
フィルタ内部の話だからQueryはちがうとおもうぞ。
自分も>>439の意見に賛成です。
@純粋仮想メソッドGetPinを実装してピン番号を取得
AGetMediaTypeにてまず@を呼び出す。
Bピン番号が「1」ならビデオだから・・・メディアタイプ「Video」を要求
Cピン番号が「2」ならAudioだから・・・・メディアタイプ「PCMAudio」を要求
iPositionにて要求するものをそれぞれ数個書いてやればいいかな。。


444 名前:デフォルトの名無しさん :2007/04/11(水) 00:49:17
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<>>443 オレはトランスフォーマーフィルタで1対1の戦いしかやったこと無かったぞ。
  ヽ    |フ これでピンが複数あるフィルタも手だせそうだぞ。
   /_ _|

445 名前:デフォルトの名無しさん :2007/04/11(水) 00:50:19
>>444
コンボイの謎を2週くらいクリアしとけ

446 名前:438 :2007/04/11(水) 14:38:35
返事ありがとうございます。

>>439
僕はどっちのピンか区別できなくてコマッてます…

>>443
GetPinはピン番号を指定して、その番号のピンを取得するのだと思うのですが。
それだとピンの区別はできなくないですか?

実際には、フィルタはm_pOutputAudioとm_pOutputVideoの二つの出力ピンを持ってます。GetMediaTypeの中で、CBasePin::Name()でピンIDを取得して、判断しようかと思いましたが、結局ピンの指定によって取得値が変わってしまいます。
m_pOutputAudio->Name() とすればAudioが返るし、
m_pOutputVideo->Name() とすればVideoが返るので、
結局どちらのピンかわかりません。(両方が存在するので当たり前ですが)
※m_pOutputAudio,m_pOutputVideoはフィルタ作成時に作られます。

どうしたらよいですかね…


447 名前:デフォルトの名無しさん :2007/04/11(水) 14:59:29
>>446
if (pOutputAudio == this) {
 //オーディオピンの処理
} else {
 //それ以外
}

448 名前:448 :2007/04/11(水) 17:09:38
>>447
参考にします。

フィルタのGetMediaTypeでピンを判別するから良くなかったみたいです。
フィルタのGetMediaTypeは、出力ピンのGetMediaTypeからコールされるので、
出力ピンのGetMediaTypeでどっちのピンか判断し、それを記憶しておくことにしました。
CSplitterOutputPin::GetMediaType()
{
if(0==lstrcmpW(this->m_pName, L"Audio")){
//フィルタのメンバ変数にオーディオだと記憶させる。
m_pSplitterFilter->m_bOutputPinAudio=true;
}
else{
//フィルタのメンバ変数にビデオだと記憶させる。
m_pSplitterFilter->m_bOutputPinAudio=false;
}
return m_pSplitterFilter->GetMediaType();
}

↑のようにして、フィルタのGetMediaTypeでは、m_bOutputPinAudioを見て、
オーディオ、ビデオの設定をするようにしました。
一応接続はこれで上手くいきました。何かとても簡単な質問をしてしまった気がしますが…


449 名前:デフォルトの名無しさん :2007/04/18(水) 22:36:27
1500円の2割引はいくら?
時速80km/hで走る車が1時間何キロ走る?

・・・ポカーン

450 名前:デフォルトの名無しさん :2007/04/19(木) 00:29:28
    ⊂⊃
★  ∧η∧
 \_(,,・Д・)<1500円の2割引きは計算不能だぞ。俺の脳が再起不能(リタイア)したぞ。
  ヽ    |フ 時速80kmでオレは走れないので1時間も車を見張れないぞ!
   /_ _| 果てしなく遠くが答えだぞ。

451 名前:デフォルトの名無しさん :2007/04/19(木) 06:23:08
都合でDirectshowを使い始めることになりました初心者です。
Webカメラで取った映像を扱いたいので、SDKにあるAMCapを参考に機能を探しているのですが

キャプチャした動画をaviではなくmpeg1等で圧縮して吐き出したいのですが
フィルタを何処の関数で挟めばよいのでしょう。
あと、映像のガンマや彩度等がプロパティで調整できてしまいますが、これはなんのフィルタを使用しているのでしょうか?

初心者質問すいません。

452 名前:デフォルトの名無しさん :2007/04/19(木) 07:35:23
>>451

プロパティはソース見りゃわかるんじゃない。
以下推測
色調節のフィルタが存在するのではなくて
キャプチャデバイスやそのピンのプロパティじゃないのか。
Webカメラのデバイスドライバが変わればその機能も変わる。

MPEG-1エンコーダって標準装備か?
俺持ってない。存在しないフィルターは使えんよな。

453 名前:デフォルトの名無しさん :2007/04/19(木) 07:54:41
沖縄県の方へ(命に関わる注意事項です)

沖縄県での選挙ですが、どうか民主党だけは避けてください。県民の生命に関わる可能性があります。
民主党の最大の公約は一国二制度(※)ですが、一度「一国二制度 沖縄」等で検索をお願いします。
この際、民主党のHPで調べても良いです。以下の注釈↓と矛盾することは書いてないはずですから…

※一国二制度
 簡単に言えば沖縄を中国と日本の共有物にし、そこに3000万人の中国人を入植させます。
 (つまり沖縄人口の 96% を中国人にして、実質、沖縄を中国人の居住地とします。)
 さらに「自主」の名の下、沖縄で有事が起きても自衛隊は干渉できません。
 3000万人の中国人が、少数派となった130万人の日本人に何をしても、です。
 そして中国人の反日感情の強さは、ほとんどの日本人の理解を超えるものです。

今回の選挙で民主党が勝った場合、「自主」「発展」を連呼しつつ段階的に進めていくことになります。
自主と言っても、自主を認めるのが「住人の96%が中国人となった」後だということに気をつけてください。
発展と言っても、新沖縄の少数派となった「少数民族日本人」の発展ではないことに気をつけてください。

454 名前:451 :2007/04/19(木) 14:09:38
>>452
えっと、回答ありがとうございます。
トライ&エラーしながら死んでおります。

>色調節のフィルタが存在するのではなくて
>キャプチャデバイスやそのピンのプロパティじゃないのか。
...確かに、自宅で違うWebカメラで試したときは、設定ダイアログの内容がぜんぜん違っていましたね。

>MPEG-1エンコーダって標準装備か?
もう一度探しなおしたデコーダーだけで、エンコーダーはありませんでした。死んできます。
aviだと保存するにも重いから、実用的なサイズに直して自動保存しておいてって言われたんですが、asfかモーションJPEGかDVか、しか使えないのかな?

まぁ、いくらか頑張ってみます。

455 名前:デフォルトの名無しさん :2007/04/19(木) 21:04:09
TMPEGEnc買っちゃいなYO!

456 名前:デフォルトの名無しさん :2007/04/19(木) 23:22:24
>>455
GRAPHEDTがあれば買わなくてもいいな俺は。

>>454
MPEG4のコーディック2なら標準装備であるよ。

GraphEdtで↓な構成を書いてみるよろし
「WebCam」→「MPG4Codec2」→「AUXMix」→「FileWriter」

んで「WebCam」のPinプロパティを開いてみる

自分の思った通りに出来る場合
⇒そのままコーディング

自分の思った通り出来ない場合
⇒出来る方法を模索

をやっといた方がはやい

457 名前:454 :2007/04/20(金) 10:39:55
どうもです、回答ありがとうございます。
一応あの後がんばった結果、DV形式とモーションjpegでは圧縮に成功しました
「うーん、なんかサイズ大きいね。asfで圧縮できない?」
といわれたわけで、メディアフォーマットSDKを読んで泣いています。
小さければ文句言われないのでmpeg4の方が楽かもしれません。
なんか進歩日記みたいになってすいませんが...。

458 名前:デフォルトの名無しさん :2007/04/20(金) 20:55:50
>>457
御礼を言うのは大変素晴らしいが、どこまで書いたことを理解できたのか
解るように(回答が的外れでなかったか知りたい)
内容についても一言触れて欲しかったな

と、会社では立場が最下層回答者の愚痴。

459 名前:デフォルトの名無しさん :2007/04/20(金) 21:39:00
最後志貴の方、速度で無い中、対戦お疲れ様でした。
飯食うので、この辺で。

460 名前:デフォルトの名無しさん :2007/04/20(金) 22:14:15
あ、はい。もうなんか恥ずかしいですがこの際だから正直に言います。

>GraphEdtで↓な構成を書いてみるよろし
>「WebCam」→「MPG4Codec2」→「AUXMix」→「FileWriter」
ここらへんから実は分かっていません。
GraphEdtは分かるのですが、圧縮用のcodecをどう呼び出せばいいのか…
directshow標準のDVだと
CoCreateInstance( CLSID_DVVideoEnc, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pDvFilter);
と書いたら作れたんだけど、標準外のものはクラスIDを何処で知れば良いんだと悩んでおりました。
そこで摘んだのでasfでの圧縮を模索したのですが、なかなか動くコードにならないで今日が過ぎていきました

461 名前:デフォルトの名無しさん :2007/04/20(金) 22:51:49
>>460
ふむ。成る程。
GraphEdtでのフィルタ登録の操作の仕方なのかそれをコーティングするときの方法なのかわからんです。

Clsid(クラスIDの事ね)がわからないと言ってるから↓↓がわからんのでは??

>自分の思った通りに出来る場合 ⇒そのままコーディング

ClsidはGraphedtでフィルタ登録する時に表示されてるよ。

それとも「Graphedt.exe」のアプリを「フィルタグラフ」(コーティング上の概念)と勘違いしてるのかなぁ…

462 名前:デフォルトの名無しさん :2007/04/20(金) 23:07:45
asfはWM ASF ライターを登録して入力ピンにつないでやるだけだから
圧縮コーデックの列挙が必要なavi再圧縮に比べたらよっぽど簡単だよ。

463 名前:460 :2007/04/21(土) 06:14:41
これは直にソース出してみた方が良さそうなので。
以下asfの書き出しの部分です。(短くするためにエラー処理省略です

IBaseFilter *pAsfFilter;
hr=CoCreateInstance(CLSID_WMAsfWriter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pAsfFilter);
hr = gcap.pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi, L"cccc.asf", &pAsfFilter, &gcap.pSink);
hr=gcap.pFg->AddFilter( pAsfFilter, L"asf filter" );
pAsfFilter->Release();
hr = gcap.pBuilder->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, gcap.pVCap, NULL, pAsfFilter );

このコードだとファイルの書き出しはしてくれるんだけど、何故か無圧縮aviが出力される。何ででしょうね…

> ClsidはGraphedtでフィルタ登録する時に表示されてるよ。
Gapheditでフィルタ選択したときに出るDisplayNameの、 {ランダムな文字} の間の部分って事ですね。
多分理解しました。



464 名前:デフォルトの名無しさん :2007/04/21(土) 12:37:04
MEDIASUBTYPE_Aviだからじゃねーの?

465 名前:デフォルトの名無しさん :2007/04/21(土) 13:49:11
>>463
ちゃんとMSDNでリファレンス見てから書いたほうがいいよ。
CoCreateInstanceでCLSID_WMAsfWriter作らなくても
SetOutputFileNameが作ってpAsfFilterに入れてくれる。
http://msdn2.microsoft.com/en-us/library/ms779904.aspx
http://msdn2.microsoft.com/en-us/library/ms784861.aspx


466 名前:460 :2007/04/23(月) 04:44:00
お返事が送れて申し訳有りません。
一応頂いたアドバイスからちまちまと頑張っております。

>>465
hr=CoCreateInstance(CLSID_WMAsfWriter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pAsfFilter);
hr = gcap.pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi, L"cccc.asf", &pAsfFilter, &gcap.pSink);

上2行からCoCreateInstance関数でのインターフェースの取得をやめて、メディアサブタイプをMEDIASUBTYPE_Asfに改めたのですが、何故かエラー。
どこかまだ問題があるのかも知れません。
というわけで、他のcodecに逃げる方に切り替えて、Graphedit.exeを弄りながらクラスIDを探したのですが書いたグラフをGRFファイルで書き出して、無理矢理テキストエディタで開いたら、それらしいクラスIDがあったので
キャプチャカード -> ffdshow -> File Writer
とフィルタを繋いだ所、無事に書き出しに成功しました。
サイズ的には納得してもらえそうな所にまぁ、落ち着きました。
フォーマットがXViDですが、あはは…。

> >>454
> MPEG4のコーディック2なら標準装備であるよ。
そこなのですが
・MPG4Codec2
・AUXMix
の2つのフィルタがちょっと見たりませんので上の様に逃げています(汗
探し方が足りないのかな?

とりあえず、相手に見せてみます。ありがとうございました。
まだ格闘しなければいけないところがあるので、ほとほと困ったらまた来るかもしれません。

467 名前:デフォルトの名無しさん :2007/04/25(水) 16:01:46
以前に出力ピンが2つある場合の出力ピンの区別のことで質問させてもらったのですが、
スプリッタの2つの出力ピンからデータを出力するようにしました。
が、再生すると何も表示されません(音も映像も)。
一方の出力ピンだけ接続し、もう一方の出力ピンは未接続の状態にすると再生はできます。
しかし、オーディオ、ビデオ両方を同時に再生しようとすると、どちらも
再生されなくなります。
原因は何が考えられるでしょうか。

468 名前:デフォルトの名無しさん :2007/04/25(水) 16:15:00
それはただのバグっぽいぞ・・・
各ピン(のインタフェイス)は別々のスレッドから呼ばれる可能性があることを
ちゃんと考慮した作りになっているか、デッドロック等はないか、など考えてみるべき。

あと「再生されません」ではなく、グラフのステートが再生状態になるのかならないのか、
なる場合には停止で止まるのか止まらないのかなど、プログラマらしい情報の出し方を

469 名前:467 :2007/04/25(水) 19:34:56
>468
もともと1つの出力ピンのソースに、無理やりもう1つの出力ピンを
追加したのが問題かもしれません。
基本的にm_pOutput(元々あった出力ピン)が出てくるところに、
もう1つのピンの処理を追加したような感じです。

>あと「再生されません」ではなく、グラフのステートが再生状態になるのかならないのか、
>なる場合には停止で止まるのか止まらないのかなど、プログラマらしい情報の出し方を
すみません、情報不足でした。GraphEditで確認しているのですが、
再生ボタンを押した後、再生状態にはなっているようです。
しかし、停止ボタンを押すとフリーズし,
The graph was unable to complete pause within 10 seconds.〜
という警告がでる状況です。


470 名前:デフォルトの名無しさん :2007/04/25(水) 19:37:18
deliver で送るプッシュ型のピンですよね。
2つある場合はそれぞれ別のスレッドで動く必要がありますが、
そのあたりは問題ありませんか?

471 名前:467 :2007/04/25(水) 20:27:13
>>470
deliverは使ってませんが、内容は一緒です。
プッシュ型です。
具体的にはフィルタのReceiveでは、下記のようにしてます。

if(m_bOutputSampleAudio)
{
// オーディオならオーディオピンから出力
if(m_pOutput->IsConnected())
return m_pOutput->m_pInputPin->Receive(pSample);
}
else
{ // ビデオならビデオピンから出力する
if(m_pOutputVideo->IsConnected())
return m_pOutputVideo->m_pInputPin->Receive(pSample);
}

1つのスレッドで動かしているような気がします。
スレッドを別々に持つとは、オーディオピンがストップしたとしても、
ビデオピンは関係なく出力できる、みたいな感じですよね。
どう実装すればいいのか…

472 名前:デフォルトの名無しさん :2007/04/25(水) 21:15:13
ビデオレンダラにつながっているピンのReceiveが時間調整のためにブロックすると、
オーディオレンダラにつながっているピンにもデータが来なくなるので、
時間が進まなくなって永遠にブロックするという動作。

出力ピンをCSourceStream から派生させて実装するのが base classes 的には常道。
パースしたビデオ、オーディオのデータをそれぞれのピンの中の Queue (自分で作ること)
に入れておいて、FillBuffer で Queue にあるデータをもとにメディアサンプルを作る。

個人的にはスプリッタを作るなら、ソースフィルタのサンプルコードをもとにして
出力ピンと入力ピンを追加するのが簡単だと思う。

473 名前:デフォルトの名無しさん :2007/05/08(火) 16:19:57
質問です、Direct3Dで、ゲーム中のテクスチャに動画ファイルの映像の
ビットマップを入れ、音声もゲームのカメラ位置に従って右の方にあれば
右寄りの位置から聞こえてくるようにしたいのですが、

とりあえず入門にあるようなSampleGrabberを使う方法ではなく
RendererFilterを継承するのが正解なのだろう、というところまでは
わかったのですが、フィルタを継承して自前で書くのにstreams.hとやらが
ありませんでした。Windows2000ではWindowsSDKがインストールできないので
迂回策を探しています(ちょっと前のPlatformSDKには入ってませんでした・・)。

Windows2000上でフィルタを継承するようなコードを書いてる方は、
どのようにやっているのでしょうか?
他にも「別にRendererFilterを継承しなくてももっといいやり方がある」とか
ツッコミがあればお願いします。

474 名前:473 :2007/05/08(火) 16:25:19
すみません、間違えてさげてしまったΣ
ついでに訂正・・・
×streams.hとやらがありませんでした。
○streams.hとやらが必要みたいですが、ありませんでした。

何がやりたいかわかりやすく書くと、
ゲームの中のテレビに任意の動画を流したい、ということです。

475 名前:デフォルトの名無しさん :2007/05/08(火) 18:11:28
>>473
D3Dのテクスチャに動画をレンダリングするのは、
SDKのサンプルにそのものずばりのがある。

DirectShow 関連のSDK が利用できないのであれば、
動画ファイルをWMVなりAVIで用意して、AVI関連APIや
Windows Media Format SDKでデコードすれば良いと思う。

476 名前:473 :2007/05/08(火) 18:42:40
回答ありがとうございます!
>WMVなりAVIで用意して、AVI関連APIやWindows Media Format SDKでデコード
なるほど!動画関連のAPIに詳しくなかったので盲点でした。
その辺はこれから調べようと思うんですが、一つ質問させてください。

>SDKのサンプルにそのものずばりのがある。
これなんですが、WindowsSDKのことでしょうか?
最初DirectXSDKのサンプルかと思ったのですが見当たらなかったので・・・


477 名前:デフォルトの名無しさん :2007/05/08(火) 19:01:25
>これなんですが、WindowsSDKのことでしょうか?

そうです。
Windows 2000 だと Windows server 2003 SP1 Platform SDK を利用することになります。
SDK の導入あたりから書かれたページを見つけたので読んでみてはいかがでしょうか。
ttp://www.shader.jp/xoops/html/modules/xfsection/article.php?articleid=17

478 名前:デフォルトの名無しさん :2007/05/10(木) 01:38:59
DirectShowに足突っ込んで間もないのですが、質問です。
VMR9を使って動画の再生を行おうとしているのですが、動画の
元サイズとアスペクト比を取得しようと
IVMRWindowlessControl9::GetNativeVideoSizeを使っているのですが、
このメソッドのセットする値が期待した値になりません。

long x, y;
long aspx, aspy;
HRESULT hr = pVMRWindowlessControl9->GetNativeVideoSize(&x, &y, &aspx, &aspy);

このコードで720×480のmpeg2ファイルを読み込むと期待としては
x = 720
y = 480
aspx = 4
aspy = 3

こんな感じになると思っていたのですが、実際は

x = 720
y = 540
aspx = 720
aspy = 540

となってしまいます。元々のサイズとアスペクト比を取得したいのですが、
これではできません。他の方法があるのでしょうか?

ちなみに、IBasicVideo2を使うとちゃんとできるんですよね。他の機能を実装
するためにVMR9を使わざるを得ないのですが・・・



■過去ログ置き場に戻る■ 1- 前250 最新50
DAT2HTML 0.33f Converted.