DirectShowと戦うスレ Part 2
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
2006/11/08(水) 00:25:56http://pc8.2ch.net/test/read.cgi/tech/1026666092/
0002デフォルトの名無しさん
2006/11/08(水) 00:30:59それだけかよ。
0003デフォルトの名無しさん
2006/11/08(水) 02:05:53メソッドのデッドロックとか、わけわからん現象多くないすか。
このスレに怒りやテクをぶつけましょう。
関連スレ
Win32API質問箱 Build46
http://pc8.2ch.net/test/read.cgi/tech/1159158014/
鬱だ氏のう DirectX (Part 16)
http://pc8.2ch.net/test/read.cgi/tech/1133007002/
くだすれDirectX(超初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1132965206/
【C++】 DirectX初心者質問スレ Part11 【C】
http://pc8.2ch.net/test/read.cgi/tech/1159456184/
DirectX総合スレ (Part5)
http://pc8.2ch.net/test/read.cgi/gamedev/1157727402/
0004デフォルトの名無しさん
2006/11/08(水) 02:06:48MSDN Microsoft DirectX9.0 DirectShow
http://msdn.microsoft.com/library/ja/DirectX9_c/directx/htm/directshow.asp
DirectX ホームページ
http://www.microsoft.com/japan/windows/directx/
MSDN ホームページ
http://www.microsoft.com/japan/msdn/
MSDN ライブラリ
http://msdn.microsoft.com/library/ja/
MSDN 2 ライブラリ
http://msdn2.microsoft.com/ja-jp/library/
Geekなページ DirectShowプログラミング [VC++]
http://www.geekpage.jp/programming/directshow/
あひるのホームページ DirectShowをよりよく使いたい人たちのサイト
http://hammer.prohosting.com/%7Earabo/DirectShow.shtml
Windowsでビデオキャプチャを作るため参考資料まとめ
http://www1.bbiq.jp/kougaku/link_videocap.html
奈良高専 土井研究室 動画あれこれ
http://wwwdoi.elec.nara-k.ac.jp/html/jisyu/doga/index.html
東京理科大 Kato Laboratory プログラミングキャプチャ
http://www.katolab.ee.kagu.sut.ac.jp/programing/capture.htm
京大川嶋氏 DirectShowのビデオキャプチャプログラミング
http://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/directshow.html
M.Oshikiri's HomePage
http://www.geocities.jp/konbiki/tips/index.html
DirectShowを利用した透明ウィンドウでのビデオ再生
http://codezine.jp/a/article/aid/322.aspx
http://www.google.com/
0005デフォルトの名無しさん
2006/11/08(水) 07:40:310006デフォルトの名無しさん
2006/11/09(木) 00:26:04効果があったんだかないんだかもよくわからない。
0007デフォルトの名無しさん
2006/11/12(日) 00:36:320008デフォルトの名無しさん
2006/11/12(日) 00:45:55プラットフォームSDKとはPlatform SDK for WindowsServer2003 みたいな名前の奴だよ。
一瞬WindowsServer2003かよ、関係ないね
っと思うところがミソ。
0009デフォルトの名無しさん
2006/11/12(日) 03:38:34フィルタは知らんけどVC6でDirectShowを使うなら
#include <dshow.h>
#pragma comment(lib, "strmbase.lib")
と
Platform SDKの
audevcod.h
DShow.h
specstrings.h
strsafe.h
が有ればビルド出来るはず。
インクルードパスに直接Platform SDK指定しても良いけど
俺は上記ファイルだけ抽出したフォルダをパス指定した。
Platform SDK
http://www.microsoft.com/downloads/details.aspx?familyid=D8EECD75-1FC4-49E5-BC66-9DA2B03D9B92&displaylang=en
(ページ下にWeb Installも有る)
986 :デフォルトの名無しさん [sage] :2006/11/04(土) 19:07:47
DirectX 9.0 SDK (October 2004)のstrmiids.libはVC6でリンク出来た。
VC6でDirectShow使うソースでリンクエラー出た人、エラーでたインターフェイス教えてくれない?
リンク出来るか試してみたい。
※ DirectX 9.0 SDK (October 2004)
http://download.microsoft.com/download/1/5/1/1513e3ec-f6e2-4fb1-bf27-7c8983b3bf91/dxsdk_oct2004.exe
0010デフォルトの名無しさん
2006/11/12(日) 11:03:04Windows SDK以外に
旧式のPlatform SDKも入れないといけないのか
0011デフォルトの名無しさん
2006/11/12(日) 11:58:13Windows SDK(for Vistaのアレ?)はWinXP SP2以降しかサポートしてないから。
0012デフォルトの名無しさん
2006/11/12(日) 11:59:11#include <windows.h>
#ifndef _W64
typedef unsigned long DWORD_PTR;
typedef long LONG_PTR;
typedef unsigned long ULONG_PTR;
#endif
#include <dshow.h>
0013デフォルトの名無しさん
2006/11/12(日) 12:03:110014デフォルトの名無しさん
2006/11/12(日) 12:05:01#include <dshow.h> だけでコンパイル出来たけど。
マクロあたりで引っ掛かるのかな。
0015デフォルトの名無しさん
2006/11/12(日) 12:12:54単体で良いかどうか、出た日付、サポートする環境を書いて一覧ページを置いて欲しい。
BaseClasses入ってたり入ってなかったりするし。
001610
2006/11/12(日) 12:22:010017デフォルトの名無しさん
2006/11/12(日) 16:46:47初期化時に
pAMStreamConfig->SetFormat(*****);
で解像度を変更するには成功。
しかし、
pCaptureGraphBuilder2->RenderStream(****);
を実行してしまうと解像度の変更ができない。
これを解決する方法か、または
RenderStreamで接続したピンを未接続にする方法はないでしょうか?
再起動後ではなく、リアルタイムに解像度を変更したいので。
0018適当に答えてみる
2006/11/12(日) 18:01:27SetFormatして
プレビュー再開じゃだめなの?
0019デフォルトの名無しさん
2006/11/12(日) 19:30:42いえ、Runする前にでもRenderStream後だと
SetFormatが失敗するようなのです。
ですのでRun後、Stopしたとしても
それまでに一度RenderStreamが実行されていると
SetFormatがうまくいかず、苦労しています。
初期化の過程で、RenderStream前に
SetFormatした場合は成功しています。
しかし、リアルタイムに変更するからには
それができずにいます。
なので、RenderStreamをする前の状態に
戻すような方法はないのかと。
0020デフォルトの名無しさん
2006/11/12(日) 21:18:010021デフォルトの名無しさん
2006/11/12(日) 21:30:45再度初期化からやり直しても
やはり二回目のSetFormatが失敗します。
やはりRenderStreamを解除するような手段が必要な気がします。
0022デフォルトの名無しさん
2006/11/12(日) 21:57:59そうか、それは困るね。
CoUninitializeとかプロセス起動し直しでも失敗する?
0023デフォルトの名無しさん
2006/11/12(日) 22:22:39CoUninitializeまでやっても同様でした。
プロセス再起動というのは初耳ですが、
カメラに関する処理以外(DirectShow以外)には
影響を与えたくないんですが、大丈夫でしょうか?
いろいろ調べてますが、
IFilterChain::RemoveChainが怪しいのですがネット上の情報が皆無で
コンパイラを通すところですでに引っ掛かってます。
0024デフォルトの名無しさん
2006/11/12(日) 22:43:25CoUninitializeで無理なら駄目かもね。
インターフェイス使ってどうにかする方は俺には分からない。
0025デフォルトの名無しさん
2006/11/12(日) 22:50:091.IPin::Disconnectでピンの接続解除
2.SetFormat
3.RenderStream
0026デフォルトの名無しさん
2006/11/12(日) 22:55:41解像度変更するのはダメなの?
0027デフォルトの名無しさん
2006/11/12(日) 23:01:340028デフォルトの名無しさん
2006/11/13(月) 17:05:24うおーー!!
成功しました。ありがとうございます。
FindPinで2つのフィルタ間の出力ピンと入力ピンとを見つけ、
そのピンをDisconnectで接続を外し、SetFormat。
そののちRenderStreamでできました。
ヘルプのDisConnectの欄をを見るとIPin::Disconnectの方は
「アプリケーションからこのメソッドを呼び出さないこと」
とか書いてて「じゃあヘルプに載せるなよ」とか思いました。
なんとかIFilterGraph::Disconnectの方で成功。
本当に助かりました。1つの問題で何時間も悩み、
DirectShowのクセの強さを痛感しました。
0029デフォルトの名無しさん
2006/11/13(月) 19:51:12あれでちょっと調べてみれば接続済みのときには設定変更できないとか
あれこれ挙動もわかるし悩まずにプログラミングできるんだけど。
0030デフォルトの名無しさん
2006/11/13(月) 21:24:480031デフォルトの名無しさん
2006/11/14(火) 14:14:48前スレにも過去スレにも話題も出てないし
スレも立っていないようですが
もはや今の時代こんなの使うべきじゃない
って解釈でOKでしょうか?
0032デフォルトの名無しさん
2006/11/14(火) 23:03:160033デフォルトの名無しさん
2006/11/15(水) 00:20:58今後改善・改良されないだけ。
0034デフォルトの名無しさん
2006/11/15(水) 00:22:11フィルタも64bit用DLLを用意しないとダメ?
0035デフォルトの名無しさん
2006/11/15(水) 09:13:550036デフォルトの名無しさん
2006/11/15(水) 12:41:43DirectShowフィルタのプロパティー画面を制作しているのですが、
タブを追加する方法がわかりません。
CBasePropatyという基底クラスにタブ追加メソッドがないのでどうしたらいいのかがわからんです。
WindowsAPIでいうところの「TabContrl_InsertItem」みたいなことをするにはどうしたらよいでしょうか?
0037デフォルトの名無しさん
2006/11/15(水) 12:46:31どっかで廃止って見て、かなり前に作ったVideos for Windoews使いまくりのアプリを
どうしようって思ってたんだけど、勘違いだったか。
よかったよかった。
0038デフォルトの名無しさん
2006/11/15(水) 17:22:27正しく動作しないことも多いような...。
0039デフォルトの名無しさん
2006/11/15(水) 17:55:43ISpecifyPropertyPages::GetPagesで複数のCLSIDを返せば良いだけでは?
0040デフォルトの名無しさん
2006/11/15(水) 18:30:090041デフォルトの名無しさん
2006/11/15(水) 23:17:00せっかく教えてもらったのにヽ(´ー`)ノ
0042デフォルトの名無しさん
2006/11/16(木) 01:01:490043デフォルトの名無しさん
2006/11/16(木) 02:01:34入れて変換開始ボタンを押すと<DirectShowフィルタが構築されません>
とでて変換出来ません。どなたか親切な方教えて下さい。ちなみに私は初心者です。
宜しくお願いします
0044デフォルトの名無しさん
2006/11/16(木) 07:56:150045デフォルトの名無しさん
2006/11/16(木) 08:09:05保管したファイルを解凍の時点でわかんない
向こうで質問するにしても気をつけれ
0046デフォルトの名無しさん
2006/11/16(木) 20:15:19.NETで動画触ろうと思ったら
結局何が一番良いんだろうなぁ
0047デフォルトの名無しさん
2006/11/16(木) 21:46:090048デフォルトの名無しさん
2006/11/16(木) 22:14:380049デフォルトの名無しさん
2006/11/16(木) 23:22:12動画に静止画とかを挿入するような
単純な機能だけならVFWで十分
と思って良い?
0050デフォルトの名無しさん
2006/11/17(金) 08:50:220051デフォルトの名無しさん
2006/11/17(金) 09:02:24あえてVFWを使う必要なしってことかな。
0052デフォルトの名無しさん
2006/11/17(金) 13:17:19別に局.NETでマネージされてくれるわけでもないし
じゃあ結局どの辺にご利益があるのかなあ
と言うことだとエスパー
005352
2006/11/17(金) 13:20:15脳内あぼーんしてくれ
0054デフォルトの名無しさん
2006/11/17(金) 14:20:12AVI 以外を扱いたくなったときに対応可能ってとことか。
>>46
.Net で動画触るなら、C++/CLI で書くのが一番。
DirectShow でも WMF でも SDK 使って普通に使える。
0055デフォルトの名無しさん
2006/11/18(土) 01:06:37で、のちのち気が変わってDirectShowだけプラットフォームSDKに移動したと。
0056デフォルトの名無しさん
2006/11/18(土) 14:11:040057デフォルトの名無しさん
2006/11/19(日) 09:52:400058デフォルトの名無しさん
2006/11/19(日) 11:44:040059デフォルトの名無しさん
2006/11/20(月) 01:32:420060デフォルトの名無しさん
2006/11/20(月) 01:46:120061デフォルトの名無しさん
2006/11/20(月) 18:26:000062デフォルトの名無しさん
2006/11/24(金) 02:05:52変換フィルタを使って動画の画面サイズ解像度を変更(下げる)するフィルタ
を作ろうかなと考えております。
中身の処理はアンチエイリアスを自作する予定です。
【質問】
壱:OutPinに解像度を設定する項目があると思うんですがどうやってするんでしょうか?
弍:動画(1秒に15枚のBMP画像)を周波数解析したら普通のPCでは処理重杉でしょうか?
0063デフォルトの名無しさん
2006/11/24(金) 03:31:072.JPEG圧縮だって一応周波数に変換するから何とかなるんじゃない?
0064デフォルトの名無しさん
2006/11/24(金) 04:46:37壱:InputPinからGetMediaTypeで解像度取得してSetMediaTypeで
下流ストリームに教えてあげるのね。やってみます。
弍:JPEGはDCT。コサイン変換で周波数解析すればおk
と言う事と深読みしてみる(`・ω・´)
回答いただきありがとうございます。
0065デフォルトの名無しさん
2006/11/24(金) 14:39:06明らかにNullのクラスポインタからメソッド呼び出そうとしてたり
0066デフォルトの名無しさん
2006/11/24(金) 15:04:07動画板って特別企画の動画2ch板のことか?
あそこに初心者質問スレが立つことなんてあるのか?
0067デフォルトの名無しさん
2006/11/24(金) 20:07:34下流ストリームに教えてあげるのはGetMediaTypeと思われ。。。
0068デフォルトの名無しさん
2006/11/24(金) 21:10:08なんですと〜。ちゃんと
確認の意味で書いてよかった。
へるぷ見て勉強しなおします
0069デフォルトの名無しさん
2006/11/24(金) 23:31:34ヘルプもいいけど、ベースクラスのソースとサンプル見た方が早いよ
0070デフォルトの名無しさん
2006/11/25(土) 01:01:26「おいおい、あんた何を俺にくれるのよ?」が GetMediaType
0071デフォルトの名無しさん
2006/11/25(土) 01:05:01あるね。ビルドやってないだろ、見たいなの。
0072デフォルトの名無しさん
2006/11/25(土) 02:43:18入力方向より出力方向の方が充実してるって感じなんでしょうか?
正直、他アプリからDirectShowへの入力はかなりイマイチな希ガス
0073デフォルトの名無しさん
2006/11/25(土) 03:07:280074デフォルトの名無しさん
2006/11/25(土) 08:05:50トランスフォームなら良くわからなくても実装しやすいからね
0075デフォルトの名無しさん
2006/11/25(土) 12:15:15もっと簡単にわかってほしい。
0076デフォルトの名無しさん
2006/11/27(月) 01:07:10DirectShowが簡単ってこたぁねぇ気がすんだがなぁ。
普及させたいからかなんか知らんが誤解を与えるような表現はイクナイ
0077デフォルトの名無しさん
2006/11/27(月) 01:40:18そこを超えると何もかもが簡単になるという
RUBYYYYYYYYYYYYYYYYYYY
ってやつ
0078デフォルトの名無しさん
2006/11/27(月) 13:03:01長さ無制限のストリームを供給し続けるプル型のソースフィルタを実装することは可能でしょうか?
IAsyncReader::LengthでTotalバイトを取得できるようになっていますので、ここに長さ無制限を示す数値を設定しないといけないのかとは思うのですが、
0や-1を返すとかありなのでしょうか。
ご存知のかたいらっしゃいましたら、ご教示お願いします。
0079デフォルトの名無しさん
2006/11/27(月) 23:36:33俺なりに調べてみた所、サーフェイスを云々してRECT型使ってGDI経由で入力、
と言うようなスマートじゃない方法しか思いつかないんだが、
何か調べ方間違ってるんだろうか?
WindowsXP限定なら他にもありそうな感じだったがそれはしたくない。
そもそもこういう用途でDirectShowを使おうとすること自体間違いなんだろうか?
Directつながりでやりやすそうとか安易に思ってたんだが。
0080デフォルトの名無しさん
2006/11/28(火) 00:48:21できなくはないが簡単にはできない。
008179
2006/11/28(火) 01:35:49レンダラ側とかは何とかなりそうだが、ソース側が‥
「プッシュ型ならどっちかって言うと簡単」みたいな記述を↓で見かけて
http://m--takahashi.com/old/09850.html
鵜呑みにしてソースフィルタ自作しようと思ったものの失敗だったか?
かと言ってFile Monikerとやらも簡単そうには見えないし
と言った状況であります。
0082デフォルトの名無しさん
2006/11/28(火) 13:36:05DirectX でレンダリングした結果を動画ファイルにしたいってこと?
それってソースフィルタ書くことになるわけだけど、ソースフィルタ書くってのは
DirectShow のアレコレの中でも非常に難しいことなので、覚悟してやってくれ。
あとプッシュにするかプルにするかは勝手に選べるわけでもないんで、
その辺の理解も必要(パーサが対応してる方じゃないとそもそもグラフが組めない)。
漏れならWMF SDKで WMV にするなぁ。
あと万が一もし単に画面に動画を出したいだけなら、DirectXだけでそのままやれば十分。
ってかDirectShowのレンダラもDirectXで描いてるわけで。
0083デフォルトの名無しさん
2006/11/28(火) 15:58:15実際インストールしてマニュアル見たらこっちのほうが簡単そう
>>82ありがとうございました
0084デフォルトの名無しさん
2006/11/28(火) 19:34:50ありがとうございました
なぜGetMediaTypeの中に出力Pinの設定をかくのか未だ謎。
まぁもう少し使い勝手(入力画像サイズの自動判断など)よくしたら
ソースとバイナリうpします
今後の為にも
0085デフォルトの名無しさん
2006/11/28(火) 19:36:21DirectXで描画したイメージを100%忠実に取り出すことなんて そもそもできるのか?
0086デフォルトの名無しさん
2006/11/28(火) 22:49:29ココわからないと、この先しんどいと思われ
0087デフォルトの名無しさん
2006/11/28(火) 23:01:47GetMediaTypeは上流ストリームの設定を取るインターフェースだけではなく
下流ストリームの接続の設定も取るしくみなのかしら?
だとしたらPinそれぞれにMediaTypeを取れるインターフェースを作ってもらいたいものよね
0088デフォルトの名無しさん
2006/11/28(火) 23:52:18だからそうなってるだろ?
0089デフォルトの名無しさん
2006/11/29(水) 17:43:12後学の為の資料としてソースうpしてくれるなら
ソースは直接書き込んだ方がいいかも。
うpろだだと後々検索でこのスレ見た人とかは拾えないから。
>>85
DllInjectionでDirect3D乗っ取ってフロントバッファを取得して、
それを直接DirectShowに流して動画キャプチャソフトを作りたいんじゃないかな?
俺は>>83じゃないからわからんけど。質問見た感じそんな所じゃないかなーと思った
0090デフォルトの名無しさん
2006/11/29(水) 19:49:16わかりました。
えいちてぃーえむえるにしてソースをどこかに貼りますね。
ただまだ解決出来ない問題がありますので暫くかかると思うけど…
画面の解像度変更すると出力Pinとレンダラの間に中間フィルタ「Colorコンバータ」が何故か入る
(´・ω・`)
中間フィルタさえはいらなきゃちゃんと表情されるのに…
0091デフォルトの名無しさん
2006/11/30(木) 02:41:37フロントバッファと画面イメージって必ずしも同じじゃないんじゃ?
よくわからんけど。。。
0092デフォルトの名無しさん
2006/11/30(木) 22:47:39え、BeginScene()とEndScene()の間のレンダリング結果が
Present()によってバックバッファからフロントバッファに
Blt(あるいはFlip)されると思ってたけど、違う?
0093デフォルトの名無しさん
2006/12/07(木) 14:28:29{
・
・
・
とコールバックとかいうのをすると、下記のようなエラーがでるのですが
どうすればよいのでしょうか?
.\AAA.cpp(489) : error C2504: 'CUnknown' : 定義されていない基本クラスが宣言されています。
.\AAA.cpp(492) : error C2501: 'CGrabCB::DECLARE_IUNKNOWN' : 識別名を宣言するのに、型が指定されていません。
.\AAA.cpp(1057) : error C2259: 'CGrabCB' : 抽象クラスをインスタンス化できません。
次のメンバが原因です :
'HRESULT IUnknown::QueryInterface(const IID &,void ** )' : 純粋仮想関数は定義されていません。
c:\Program Files\Microsoft Platform SDK\Include\Unknwn.h(113) : 'IUnknown::QueryInterface' の宣言を確認してください。
'ULONG IUnknown::AddRef(void)' : 純粋仮想関数は定義されていません。
c:\Program Files\Microsoft Platform SDK\Include\Unknwn.h(117) : 'IUnknown::AddRef' の宣言を確認してください。
'ULONG IUnknown::Release(void)' : 純粋仮想関数は定義されていません。
c:\Program Files\Microsoft Platform SDK\Include\Unknwn.h(119) : 'IUnknown::Release' の宣言を確認してください。
0094デフォルトの名無しさん
2006/12/07(木) 14:38:30仮にCUnknownがIUnknownのメソッドを実装するクラスとして存在したとしても、
C++ではCGrabCBがCUnknownを継承しただけでは、
ISampleGrabberCBのIUnknownのメソッドを実装したことにはならないはず。
0095デフォルトの名無しさん
2006/12/07(木) 14:51:07このエラーが出てしまって。前も出たのですがどうやって修正したのか忘れてしまった
次第です。
やり方は
ttp://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/directshow.html
を真似しました。
009693
2006/12/07(木) 14:59:05で、インクルードすると
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\atlconv.h(1000) : error C2084: 関数 'LPDEVMODEA AtlDevModeW2A(LPDEVMODEA,const DEVMODEW *)' は既に本体を持っています。
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\atlconv.h(548) : 'AtlDevModeW2A' の前の定義を確認してください
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\atlbase.h(6683) : warning C4193: #pragma warning(pop) : 一致する '#pragma warning(push)' がありません
またエラーが出てきてしまいました。前はこれでうまく言ったのですが・・
0097デフォルトの名無しさん
2006/12/10(日) 22:24:56TVチューナーの付いたパソコンだとTV映像が表示されてしまいます。
なんとかWEBカメラに限定させることはできないでしょうか?
0098デフォルトの名無しさん
2006/12/11(月) 17:08:23(最終的に別のソフトでxvidでmp4にする予定)
出力されるAVIが映像の再生時間だけ2倍になってしまいます
(音は普通に再生)
Directshowでの調整がうまくいかなかったので一度AVI作成後にRateとScaleとMicroSecPerFrameを調整して
AVI状態ならずれの修正はできたのですが、それをmp4に変換すると再生がおかしくなってしまい
原因がつかめなかったのでDirectshowでAVI作成するところまでもどってきたのですが
Grapheditでマスターストリーム指定で30秒くらいのファイル一個だけですがうまくいったので<wmv9
IConfigAviMuxをソースに追加してみてSetMasterStreamが成功はしているのですが
結果に反映されてくれません。
ソースは以下のようなものなのですがどこがいけないのでしょうか
-------------------------------------------------------------------------
IGraphBuilder*pGraph= NULL;
ICaptureGraphBuilder2*pBuilder= NULL;
IBaseFilter*pSrc= NULL;
IBaseFilter*pMux= NULL;
IBaseFilter*pAudioDec= NULL;
IBaseFilter*pAVIDec= NULL;
IPin*pPinIn= NULL;
IPin*pPinOut= NULL;
IMediaSeeking*pSeek= NULL;
IMediaSeeking*pRate= NULL;
IMediaEvent*pMediaEvent= NULL;
IMediaControl*pMediaControl;
longevCode;
0099デフォルトの名無しさん
2006/12/11(月) 17:08:55CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **)&pGraph);
CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC, IID_ICaptureGraphBuilder2, (void **)&pBuilder);
IBaseFilter *pAVIMux =NULL;//+id{CLSID_AVI mux}_GUID
pAVIMux = searchFilter(pGraph, L"AVI Mux" );
IConfigInterleaving *pConf = NULL;
IConfigAviMux *pConfMux = NULL;
pGraph->AddFilter(pAVIMux, L"AVI Mux");
LONG lo = -1;
pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi, OutputFile, &pMux, NULL));
pBuilder->GetFiltergraph(&pGraph));
pGraph->AddSourceFilter( InputFile, L"SourceFilter", &pSrc));
pAVIDec = AVI Decompressorフィルタ取得
pAudioDec = WMAudio Decoder DMOフィルタ取得
pGraph->AddFilter(pAVIDec, L"AVI Decompressor");
pGraph->AddFilter(pAudioDec, L"WMAudio Decoder DMO");
pPinOut = GetPin(pSrc, PINDIR_OUTPUT);
pPinIn = GetPin(pAudioDec, PINDIR_INPUT);
pGraph->Connect(pPinOut, pPinIn);
pBuilder->RenderStream( NULL, NULL, pSrc, pAVIDec, pMux );
0100デフォルトの名無しさん
2006/12/11(月) 17:10:19pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);
pGraph->QueryInterface(IID_IMediaEvent, (void **)&pMediaEvent);
pMux->QueryInterface(IID_IMediaSeeking, (void**)&pSeek);
CLSID id;
pAVIMux->GetClassID(&id);
CoCreateInstance(id, NULL, CLSCTX_INPROC, IID_IConfigAviMux, (void **)&pConfMux);
pAVIMux->QueryInterface(IID_IConfigAviMux, (void**)&pConfMux);
pConfMux->QueryInterface(IID_IConfigAviMux, (void **)&pAVIMux);
pConfMux->GetMasterStream(&lo);
pConfMux->SetMasterStream(1);
pConfMux->GetMasterStream(&lo);
if (pMediaControl->Run() == S_OK)
{
途中経過表示など
}
//終了処理
if(pRate != NULL) pRate->Release();
if(pConf != NULL) pConf->Release();
if(pAVIMux != NULL) pAVIMux->Release();
if(pConfMux != NULL) pConfMux->Release();
if(pAudioDec != NULL) pAudioDec->Release();
if(pAVIDec != NULL) pAVIDec->Release();
if(pGraph != NULL) pGraph->Release();
if(pBuilder != NULL) pBuilder->Release();
0101デフォルトの名無しさん
2006/12/11(月) 17:11:22if(pMux != NULL) pMux->Release();
if(pMediaEvent != NULL) pMediaEvent->Release();
if(pSeek != NULL) pSeek->Release();
if(pMediaControl != NULL) pMediaControl->Release();
if(pPinIn != NULL) pPinIn->Release();
if(pPinOut != NULL) pPinOut->Release();
CoUninitialize();
-----------------------------------------------------------------------
いろいろ試行錯誤していたので少し読みにくくてもうしわけありません。
0102デフォルトの名無しさん
2006/12/11(月) 17:21:22pAVIMux->GetClassID(&id);
CoCreateInstance(id, NULL, CLSCTX_INPROC, IID_IConfigAviMux, (void **)&pConfMux);
pAVIMux->QueryInterface(IID_IConfigAviMux, (void**)&pConfMux);
pConfMux->QueryInterface(IID_IConfigAviMux, (void **)&pAVIMux);
の辺りを主にいじっていました(コードを実行する場所をかえたりなども)
0103デフォルトの名無しさん
2006/12/11(月) 17:33:02WMV: 各サンプルにタイムコードあり
AVI: 各サンプルにタイムコードなし
とかこのあたりの問題はOK?
0104デフォルトの名無しさん
2006/12/11(月) 17:42:49いじるのは無理と判断しまして、Directshowで出力前設定をいじれば勝手に
それをはさんでくれるのではないかと思いまして(Grapheditではうまくいったので)
動画関係をいじりはじめたのがつい最近なので色々調べはしましたが
細かいところはよくわかっていないと思います
0105デフォルトの名無しさん
2006/12/11(月) 17:46:28↓
「AVI→mp4の変換がうまくいかずに」
が誤字なのとそのあとの調べたものを書きそこねました
自分で無理だと判断↓原因がタイムコードです
0106デフォルトの名無しさん
2006/12/11(月) 19:56:380107デフォルトの名無しさん
2006/12/11(月) 19:57:300108デフォルトの名無しさん
2006/12/11(月) 20:26:13そういうのって、どこかで指定できましたっけ?
接続してるカメラを列挙してるから
カメラ以外は入ってこないと思ってたんですが。
0109デフォルトの名無しさん
2006/12/11(月) 22:20:47>>103氏の懸念していることに近いけど。
入力のWMVと出力されたAVIの総フレーム数は一致しているだろうか。
また、それぞれのフレームレートはどうなっているのかな?
その辺の具体的な数値があった方が状況を確認しやすいと思う。
011098
2006/12/12(火) 10:44:27WMVファイル →WMAudioDecoderDMO →AVIMux →FileWriter
→WMVideoDecoderDMO →AVIDecompresser→
となっています
変換結果は
フレームレートは両方30fpsなのですが、
出力されたAVIのフレーム数は1723です(WMVのほうは調べ方がちょっとわからなかったです)
再生時間がWMV時点で28.7秒でAVIにすると57.4秒で丁度綺麗に2倍になる感じです
フレームの持続時間のほうはフレームレートの調整程度しか意識していませんでしたので
また少し自分でも調べてみようと思います。
011198
2006/12/12(火) 10:55:08mp4に変換するとファイルによって色々な症状がでて3個ほどサンプルを試した内では
ひとつもまともに再生できませんでした。
dwAudioTime = (double)dwAudioLength * dwAudioScale / dwAudioRate;
dwMicroSecPerFrame = dwAudioTime / dwVideoLength * 1000000.0+0.5;
dwVideoRate = 1000000L;
dwVideoScale = dwMicroSecPerFrame;
011298
2006/12/12(火) 11:05:27書き換えた部分はstrhヘッダ(ストリームタイプがvids)の
rateとscale、avihヘッダのmicrosecperframeです
0113デフォルトの名無しさん
2006/12/12(火) 11:10:40>フレームレートは両方30fpsなのですが、 出力されたAVIのフレーム数は1723です
30fpsで1723フレームなら、57秒ちょっとで合ってるじゃないですか。
GraphEdit で WMV ファイルを再生して、ビデオレンダラのプロパティで再生フレーム数を見れば
おおむねのフレーム数がわかると思います。それでフレーム数を確認してみてください。
それから、WMV はフレーム毎にタイムスタンプが付いていますから(≒フレームの時間的間隔が
一定ではない)、デコードして AVIMux で結合という簡単な処理では決して正しい AVI ファイルは
出来ないということも理解する必要があります。
011498
2006/12/12(火) 13:05:01WMV(変換元ファイル)のほうは28秒ちょっとなので57秒でフレームが丁度2倍になっている感じですね
>それから、WMV はフレーム毎にタイムスタンプが付いていますから(≒フレームの時間的間隔が
>一定ではない)、デコードして AVIMux で結合という簡単な処理では決して正しい AVI ファイルは
>出来ない
やはりちょっとヘッダー部などをいじった程度だと無理でしたか
Directshowのフィルターがその辺の処理をやってくれるのではないかと
甘く見ていました
011598
2006/12/12(火) 13:17:20まともに再生されるのですが、AVIMuxでファイル保存できるようにするときに
タイムスタンプが抜かれてしまうのでしょうか?
0116デフォルトの名無しさん
2006/12/12(火) 16:42:29AVI 形式のファイルは、メディアフォーマットで指定された同一持続時間の
サンプルがずらーっと並ぶだけというようなフォーマット。
なので正しいフレームレートでかつ1フレームの欠落もないデータじゃないと
正常に再生できない。
変換元ファイルを走査して、真のフレームレートを計算してWMV側で落ちている
フレームも捏造して自分でmuxするとかやり方はあるような気がするけれども、
絵と音がずれないAVIファイルを作るのはとても難しいです。
011798
2006/12/12(火) 19:17:37とりあえずWMVファイルを調べてその最小公倍数分のフレームレートをAVIファイルに設定、
フレームの余計な部分に空フレーム挿入などで試してみようと思います。
途中で挫けそうですが、もしうまくいったら報告だけでもさせていただきます。
…WMVとかに使っているコーデックで圧縮かかってるとその別ソフトが読み込んでくれないから大変です...orz
色々教えていただいてありがとうございました。
0118デフォルトの名無しさん
2006/12/21(木) 21:42:10どこみても質問に回答してる。
ネ申ですか?それともM$の中の人ですか?
0119デフォルトの名無しさん
2006/12/22(金) 00:43:590120デフォルトの名無しさん
2006/12/22(金) 08:57:53教徒と言う事は宗教団体さんみたいなもんなんすね。
DirectShow究めるためにボコノン教に入ってみたいかも
0121デフォルトの名無しさん
2006/12/23(土) 17:14:46参考になるサンプルなどありますか?
情報が少なくて困っています。
変換フィルタはいくつか作成したことがあります。
0122いつでもどこでも名無しさん
2006/12/23(土) 23:31:060123デフォルトの名無しさん
2006/12/27(水) 00:00:48ソースがプルなのかプッシュなのかによりスプリッタの挙動が大きく異なるわさ
プッシュなら来たサンプルバラして後方にポンポコ投げろや
プルなら入力ピン繋がった時点でソース先読みして各種情報提供してやるとか色々とアレ
年末ゆえ酒飲んでて上手く得ないけど、まあ察しろ
出力ピンに関してはINFTeeのサンプルが参考になるよ
>>122
変換式ならググればゴロゴロみつかるし、後は自分でやってもたいしたことないだろ がんばれー
0124デフォルトの名無しさん
2006/12/27(水) 00:01:470125デフォルトの名無しさん
2006/12/27(水) 20:37:01変換を自作したがいちピクセル単位でやると遅くてつかいものにならんかったよ。
そこで私は
趣味→オーブンしーぶい(ただだけど配布できない)仕事→あいぴーぴー(よっしゃでかえるレベル)
を使った。一個関数呼ぶだけだった
0126122
2006/12/28(木) 02:18:06変換式は見つかりました。でもSSE命令とか使いたいところです。
アセンブラ画像処理プログラミング って本買ってきたので頑張ります
>>125
OpenCVやIPPの場合、どんな関数使えばいいですか?
正にIplImageが欲しいです
0127122
2006/12/28(木) 02:23:55OpenCVって配布できないんですか?
http://journal.mycom.co.jp/news/2006/11/08/360.html
http://e-words.jp/w/BSDE383A9E382A4E382BBE383B3E382B9.html
BSDライセンスってことですが
0128122
2006/12/28(木) 02:57:28OpenCVで変換する関数を是非教えて下さい
0129122
2006/12/28(木) 09:22:06アドバイスありがとうございます。
ソースフィルタはFile Source(Async)です。
とりあえず、空の変換フィルタ(CTransformFilter)を作成し、
ソース→空フィルタと接続して解析しようと思ったのですが、
「同じトランスポートをサポートしていない為、ピンを接続できません。0x80040266」
というエラーが起こり、接続することすらできません…
0130121
2006/12/28(木) 09:23:060131デフォルトの名無しさん
2006/12/28(木) 12:47:29FileSource にTransformFilterがそのまま接続可能(かも)と思う時点で
知識が少なすぎて説明とか不可能なレベル。
SDK の DirectShow のドキュメントを先頭からちゃんと読むべし
(大した分量じゃないでそ)。
0132デフォルトの名無しさん
2006/12/30(土) 08:42:31が定義されているとムービー再生時に
VMR9のRenderlessが無視されてActiveMovie Windowが
ポップアップで出てくるんだけど、これ抑制させる方法ないでしょうか?
0133デフォルトの名無しさん
2006/12/30(土) 18:38:310134デフォルトの名無しさん
2007/01/05(金) 01:08:09>>127>>128
オープンしーぶいの話し少し待ってもらってもいいか?
仕事始まれば家に帰るからさ
ライセンスの話は多分私が間違えていると思う。
ただインターネットの書き込みで気になるのがあった
それを張り付けますよ〜。
0135デフォルトの名無しさん
2007/01/06(土) 11:16:080136デフォルトの名無しさん
2007/01/09(火) 19:46:03http://www.microsoft.com/japan/msdn/directx/downloads.aspx
0137デフォルトの名無しさん
2007/01/09(火) 20:55:300138デフォルトの名無しさん
2007/01/09(火) 21:07:56DirectShow関係で何か変わってます?
0139デフォルトの名無しさん
2007/01/10(水) 00:15:22見たいな事言ってるけど実際Win2Kではどうですか?
ぶっちゃけウインドレスモードが欲しいだけなんですが。
オーバーレイとかDirect3Dで描画なんたらとかじゃなく
0140デフォルトの名無しさん
2007/01/10(水) 07:56:143つ以上、思い当たる点があればアナタの性格はひん曲がっており、ネガティブ負け組人生を歩んでいます。
□派遣先の社員の意見にはたとえ間違っていても反対しない
□派遣先から「いつまでもここで仕事してくださいね」と言われるようになりたい
□自社に仕事を持ち帰れるように言われるとムカつく
□自社で仕事なんてできるわけがない
□派遣/受託の差異を指摘する人間はムカつく
□派遣先には仕事だけでなく自分のプライベートについても指示して欲しい
□自分の月額金額を知らない
□派遣先社員より自分の生涯収入が低いのは当然だ
□派遣先に尻尾を振り、いつまでも一緒に仕事をすることが大切だ
□今のプロジェクトが終わっても同じ派遣先に常駐したい
0141デフォルトの名無しさん
2007/01/12(金) 02:18:08正社員なんだが仕事の為なら派遣さんにも尻尾ふりますよ。寧ろ俺が最下層。
OctoberではVC6のサポートしていたんだが、December 2006 DirectX SDK は打ち切ったようだね。
「.dws」と言うプロジェクトファイルがなくなっとる
0142デフォルトの名無しさん
2007/01/12(金) 02:48:15派遣は「切られないため」に尻尾ふり
0143デフォルトの名無しさん
2007/01/15(月) 03:19:51上流フィルタの出力pinにたとえばVGAの解像度を優先接続して欲しいん
ですが、そんなことって可能でしょうか?
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/dnwmt/htm/grabbersample.asp
このページをみながら「EnumMediaType」と「GetMediaType」はオーバーライド
したんですが、
まだ接続しきっていないせいか上流フィルタの出力pinに解像度の情報が乗っていない。。
できないのかな?
0144デフォルトの名無しさん
2007/01/15(月) 13:44:33GetMediaType で解像度入れたメディアタイプを返せばいいんじゃない?
0145デフォルトの名無しさん
2007/01/15(月) 16:31:10回答ありがとうございます。
そのあたりを嗜好錯誤してかつできませんでした。
解像度を返すにはCMediaType->Formatのポインタが必要ですがそこが
空になっているんです。
0146デフォルトの名無しさん
2007/01/15(月) 16:54:48それは当たり前でソ。フォーマットタイプによってpbFormatの先の構造体のサイズは変化するんだから、
事前にアロケートしてもらうのは無理。>>145が自分で SetFormat & SetFormatType してあげないと。
0147デフォルトの名無しさん
2007/01/15(月) 17:15:08できました。
優先的に上流フィルタの解像度を選んでくれるようになりました。
0148デフォルトの名無しさん
2007/01/17(水) 08:27:5460fpsで描画すると(SetTexture→DrawPrimitiveUP→Present)
フルスクリーンモードでDirectShowが固まってしまいます。(デコードが停止)
同じような問題に遭った方いらっしゃいますか?
フルスクリーンでもビデオに合わせて30fps程度に落としたり
(ソースは典型的な29.97fps)、ウィンドウモードにすると問題は無いんですけども・・・。
VGAは NVIDIA GeForce4MX , DirectX9 2006-feb
ドライバは ForceWare 93.71 (2006年11月2日) WHQL認定 です。
0149デフォルトの名無しさん
2007/01/18(木) 01:45:21メモリ上のmp3を鳴らす場合、ソースフィルタをどうにかこうにか、
と言うことのようですが、それ以降さっぱりわかりません。
なにかいいサンプルがあったら教えてください。
0150デフォルトの名無しさん
2007/01/18(木) 04:40:47C:\Program Files\Microsoft Platform SDK\Samples\Multimedia\DirectShow\Filters\Async\MemFile
と、よく知らないのに返答してみる・・・
0151デフォルトの名無しさん
2007/01/18(木) 10:57:19まず標準的なPCにプレインストールされているMP3デコーダフィルタがある、と仮定すると
それが何なのかGraphEdtで調べる。
次にそのMP3デコードフィルタとつながるソースフィルタを自作する。
そしてソースフィルタがそのMP3デコーダフィルタに対してどのようなメディアタイプで接続できるのか調べる。
メディアタイプがわかったらそのメディアタイプにあった形式に、メモリ上のデータとやらを加工してMP3デコーダに渡す。
フィルタ作ったことが無いなら相当大変だよ。
0152149
2007/01/19(金) 03:05:59サンプルも151もまるで理解できないのでとりあえずDirectShowを1から勉強してます。
0153デフォルトの名無しさん
2007/01/19(金) 04:54:19他の選択肢があるかもしれんし。。。
0154デフォルトの名無しさん
2007/01/19(金) 23:55:04これが標準にインストールされてるデコーダだよ。
このデコーダ通ったストリームがWAVEファイルみたいな生な音声ファイルになってるからそこに変換フィルタを自作してやればいいよ。
意外と簡単にいけるかもしれん…
0155デフォルトの名無しさん
2007/01/24(水) 10:52:40この↑ページをみながらDirectShowLibを使ってC#で
USBのマイク&カメラ(LogicoolのQcam10.0)からの入力をCaptureGraphBuilderを使って
MuxAVI経由でAVIファイルとして保存しているのですが、
フィルタグラフマネジャIGraphBuilderのRun(),Stop()およびIFileSinkFIlterのSetFileName()を使って、
Run 5秒間保存 Stop 保存先変更 Run 5秒間保存 Stop 保存先変更・・・
と繰り返すと、できあがったファイルは
1つ目、所望のものが得られた
2つ目、映像が〜5秒フリーズして5秒後から再生される。音声は再生直後から5秒までにちゃんと入っている
3つ目、映像が〜10秒フリーズして再生される。音声は同上
のようになっていて、どうもVideoのほうの時間がおかしいのですが、
そこをうまく扱えるような方法があったら教えてください。
0156デフォルトの名無しさん
2007/01/24(水) 12:34:32厳密に言うとMediatimeの初期化をしてくれてないからそうなる。
カメラの後に「Smart Tee」繋いで、さらにフレビューピンに繋いだら?
0157155
2007/01/24(水) 17:57:20とりあえずそれでやってみます!
0158155
2007/01/24(水) 20:43:33>>156さんの
>>カメラの後に「Smart Tee」繋いで、さらにフレビューピンに繋いだら?
のおっしゃるように
VideoSource->SmartTee->PreviewPin->AviMux->FileWriter
とつないだら、Runできずに
The graph could not change the state.
タイムスタンプがこのサンプルに設定されていません。(Return code:0x80040249)
と出て行き詰まっています。
知識不足でお聞きしたいのですが、
タイムスタンプがないのはバグなのでしょうか、
それとも当然の動きで設定になにか必要なのでしょうか・・?
もともと連続でファイルを区切って数秒間の音声付き映像をキャプチャできれば違う方法でもよく、
いちいちGraphBuilderを解放してまた作るとうまくいくことはいくんですが、
それでは解放と作成に時間がかかるのでもっと早くできる方法を探していて
上記155みたいな試行錯誤してます。
0159デフォルトの名無しさん
2007/01/24(水) 20:47:14previewピンからの出力にはタイムスタンプがつかないのがDirectShowのお約束です。
>いちいちGraphBuilderを解放してまた作るとうまくいくことはいくんですが、
QCAMのフィルタだけDisconnectして取り除いて作り直して挿入して接続するとか。
0160デフォルトの名無しさん
2007/01/24(水) 20:58:38で、なんでそうしろといったかと言うと
キャプチャピンとプレビューピン両方にレンダラ繋いで再生→停止を繰り替えすとわかる。
キャプチャピンに繋いだ方は画像が流れて来なくなる以前に5秒再生してたら5秒間固まる。
これはQCAMがタイムスタンプを初期化してないからだと思う。
多分自分でスタンプ情報作ってやればよかったと思うけどソースが会社なんだ…
コンブライアンスが厳しい
0161155
2007/01/24(水) 22:07:33ご返答ありがとうございます。
なるほど。
タイムスタンプが設定されていません。はPreviewPinより下流のFilterが発していたことがわかっていませんでした。(恐らくFileWriter?)
>キャプチャピンに繋いだ方は画像が流れて来なくなる以前に5秒再生してたら5秒間固まる。
まさにそのとおりです。
>多分自分でスタンプ情報作ってやればよかったと思うけどソースが会社なんだ…
>コンブライアンスが厳しい
っということは諦めるかタイムスタンプを自分で打つfilterを作るかでしょうか・・キビシイですね
とりあえず>>159さんの
>QCAMのフィルタだけDisconnectして取り除いて作り直して挿入して接続するとか。
をやってみます。
0162デフォルトの名無しさん
2007/01/24(水) 23:03:55フレビューピン、コンブライアンスワラタ
0163155
2007/01/25(木) 08:21:37たぶん(としかいえないのがつらいのですが)Qcam10.5をインストールした後に直ったと思われるので、
Qcam側の原因が自動的に解決されたのだろうと解釈しています・・
いろいろと本当にありがとうございました。
0164155
2007/01/25(木) 08:23:22携帯だったのですね
感謝してます
0165162
2007/01/25(木) 18:45:16どうもありがとう。自分も試してみますm(__)m
0166デフォルトの名無しさん
2007/01/26(金) 20:48:07変換フィルタにてRGB24ビットのIMediasampleを扱っているのですが、
カメラから入ってきた画像に線を書いてレンダラに渡したいと思ってます。
DIB形式のBMP画像に直接線を描く関数を探しております。
なにが難しいと思っているかというと、デバイスコンテキストが得られない事で、「LineTo」などを代表するWinAPIが使えない事です。
みなさんはどのように画像の加工をしているのでしょうか?
やっぱりオーバーレイとかですか?
0167デフォルトの名無しさん
2007/01/27(土) 00:44:03それをメモリデバイスコンテキストでセレクトしてやればGDIで描画できるんじゃないかな。
0168デフォルトの名無しさん
2007/01/27(土) 01:10:27ありがとうございます。
http://www.greenwood.co.jp/~k-aki/pc/directshow_movie/directshow_movie.html#h-7
↑このページのレンダラ処理に>>167さんのおっしゃるようなことが書いてあったため
試して見ます
ちなみにこんなソース
// ビデオ ヘッダーへのポインタを獲得する。
const VIDEOINFOHEADER *pVideoHeader
= (const VIDEOINFOHEADER *)pMediaType->pbFormat;
// ビデオ ヘッダーには、ビットマップ情報が含まれる。
// ビットマップ情報を BITMAPINFO 構造体にコピーする。
ZeroMemory(&m_bitmapInfo, sizeof(m_bitmapInfo));
CopyMemory(&m_bitmapInfo.bmiHeader
, &(pVideoHeader->bmiHeader)
, sizeof(BITMAPINFOHEADER));
// ビットマップ ヘッダーから DIB を作成し、バッファへのポインタを獲得する。
HBITMAP hBitmap
= CreateDIBSection(0, &m_bitmapInfo, DIB_RGB_COLORS, &m_buffer, NULL, 0);
if(hBitmap){
m_hdc = CreateCompatibleDC(NULL);
SelectObject(m_hdc, hBitmap);
0169デフォルトの名無しさん
2007/02/05(月) 11:52:49ここを参考に、DirectShowLib + C#で、
waveレンダラを
マイク--> tee --> スピーカ(default audio renderer)
--> wavDest(wavFilter) --> file writer(sinkFilter)
なる構成で作ろうとしています。(GraphEditではできました。)
上記URLによるとcaptureGraphBuilderが使えないので、FindPinとフィルタグラフマネジャのconnectを使って
つなげていこうとしています。
しかし、実行時に、各Filterを作ってAddFilterをした後に、つなげる段階でエラーが出てしまいます。
エラーの出る場所
//wavDest(wavFilter) --> file Writer(sinkFilter)
wavFilter.FindPin("Out", out outPin);
sinkFilter.FindPin("in", out inPin);
graphBuilder.Connect(outPin, inPin);//ここでエラー0x80040217
他のフィルターの結合はすべてGraphEditによるデバッグ(?)で確認しましたが、
最後のファイル書き込み部分がつながりません。
なにかヒントをいただけたらよいのですがどうでしょうか・・
0170169
2007/02/05(月) 11:53:51wavFilterは
Guid id = new Guid("3C78B8E2-6C4D-11D1-ADE2-0000F8754B99");
Type comType = Type.GetTypeFromCLSID(id);
object comObject = Activator.CreateInstance(comType);
wavFilter = (IBaseFilter) comObject;
sinkFIlterは
sinkFilter = (IBaseFilter)new FileWriter();
sinkSetFilter = (IFileSinkFilter) sinkFilter;
AMMediaType mediaInfo = new AMMediaType();
mediaInfo.majorType = MediaType.Audio;
mediaInfo.subType = MediaSubType.PCM;
sinkSetFilter.SetFileName(sinkFileName, mediaInfo);
こんな感じでやっております。
0171169
2007/02/05(月) 21:45:12sinkSetFilter.SetFileName(sinkFileName, null);
にしたらできました。
なんでやろ
0172デフォルトの名無しさん
2007/02/06(火) 19:24:44むかしここかどこかに貼ってあった気がするんだけど、
誰か知りませんか?
0173デフォルトの名無しさん
2007/02/07(水) 12:21:04「拡張ストアド プロシージャーDLL」
これで作っちゃだめなの?
自分はいつもこれで作って、
〇「proc.c」を削除
〇「stdafx.c」にStreamヘッダを追加
〇追加インクルード
〇モジュール定義
〇ライブラリ追加
をしていた。これがめんどいです?
0174デフォルトの名無しさん
2007/02/07(水) 13:28:32有り難うございます。
あちらで聞いた方が良かったですか。でも、今から同種の質問を飛ばすとマルチですし。
やはり、October 2004かsummer 2003ですか。試してみます。
私もVC6やめたいところですが、色々としがらみと要望がありまして。
未だにVC6の需要があるので困ります。
0175174
2007/02/07(水) 13:30:270176デフォルトの名無しさん
2007/02/07(水) 15:53:05ありがとうございます。めんどいとかじゃなくて
そのやり方を知りませんでした。
参考になりました。
0177デフォルトの名無しさん
2007/02/07(水) 16:14:12Sampleを改造することにします。
0178デフォルトの名無しさん
2007/02/07(水) 16:17:44http://hammer.prohosting.com/~arabo/DirectMediaWz.shtml
0179デフォルトの名無しさん
2007/02/07(水) 19:02:10ぶっちゃけDLL作るプロジェクトならなんでも可
まぁ結局新規プロジェクトでフィルタ作れるようになってもサンプル改造に落ち着くんだけど
0180デフォルトの名無しさん
2007/02/08(木) 08:58:22VC6…DirectXサポート切れていて最新の盛り込みできない
VC2005無料版…リソースエディタがないため扱いづらい
VC2005…普及してる?
C#…これ自体存在が微妙
VB…本格的にやるには不向き
他…資料がなさすぎね??
0181デフォルトの名無しさん
2007/02/08(木) 11:44:35VC2005無料版はいろいろ難関がありそうだよね。
ただVC2003のプロジェクト(非DirectShow)をコンバートしただけなのに
PlatformSDKのセッティングとか初めてだと面食らう。
なぜかウチの環境だとPlatformSDKのツリーがVc7の下にあって・・・。
近いうちにVC2005導入予定だけど、普及の問題は別として開発しやすいのかな?
0182デフォルトの名無しさん
2007/02/09(金) 00:09:39プレビューで使われる画像サイズやフレームレートをプログラムから
指定する方法は無いでしょうか。
IVideoWindow等でウィンドウを小さくする等だと転送するデータは変わらないので
負荷が下がらないと思うので駄目だと思います。それとも変わるのでしょうか。
IPropertySetStorageで色々設定できるダイアログが表示されるが
これって使う人の立場で考えると
製品によってダイアログが違うので説明が大変だし
変にいじって品質を落としたりする可能性があって嫌なんだが
これしかないのでしょうか。
0183デフォルトの名無しさん
2007/02/09(金) 01:31:30自分でカメラの出力pinに対して要求だせばいいよ
MSDNのヘルプみるよろし
0184デフォルトの名無しさん
2007/02/09(金) 02:20:04プレビューが
[キャプチャ]->[レンダラ]
という接続なので要求の出し方わかりません
0185183
2007/02/09(金) 08:20:34〇キャプチャー
でした。誤解させてしまったかもしれませんすみません。
で、キャプチャのピンのプロパティーページにて解像度やフレームレートをかえられるのであれば
そのピンに対して「EnumMediaType」、メディアタイプの列挙型を受けとればよいです。
列挙型のなかにピン接続したいタイプがあれば接続させます。
私はフィルタ内制作ばかりやっているのでフィルタグラフ用の具体的な関数名までわかりませんが、「Free Mail」と言うSNSサイトにくれば過去ログに貴方と同じ質問の回答があります
0186デフォルトの名無しさん
2007/02/09(金) 13:29:55IAMStreamConfig
0187デフォルトの名無しさん
2007/02/09(金) 14:00:200188デフォルトの名無しさん
2007/02/09(金) 19:51:150189デフォルトの名無しさん
2007/02/10(土) 01:59:590190デフォルトの名無しさん
2007/02/11(日) 02:17:48どんな形で入ってるんですか?
RGBTRIPLEしか構造体ワカランス(´・ω・`)
0191デフォルトの名無しさん
2007/02/11(日) 23:20:450192デフォルトの名無しさん
2007/02/12(月) 00:04:10はい。IYUV、I420の2つでお願いします。
どちらもU値とV値が四分の一に圧縮されていてMediaSubTypeは違っていても中身は同じフォーマットだと思います。
0193デフォルトの名無しさん
2007/02/12(月) 01:29:29IMediaSample::GetPointer(), IMediaSample::GetActualDataLength()というメンバ関数を通してバッファにアクセスできる。
ただし幅や高さなどの情報はAM_MEDIA_TYPEという構造体に収められていて、
これはIMediaSampleからは限定的な用途でしか取得できない。
その用途とはメディアタイプがダイナミックに変化したことをダウンストリームに伝えるという用途である。
そのため、IMediaSampleにはGetMediaTypeという気の利いた名前のメンバ関数があるが、
この関数を通してAM_MEDIA_TYPEが取得できるのはメディアタイプがダイナミックに変化した瞬間だけであり、
取得できるのは変化した後のメディアタイプである。
常に今流れているサンプルのAM_MEDIA_TYPEが取得することはできない。
0194デフォルトの名無しさん
2007/02/12(月) 01:47:42ネットで調べたところ、どうやらプレーンぽいなあ。
最初にYプレーン
次に縦横がそれぞれ1/2に縮小されたU
次に縦横がそれぞれ1/2に縮小されたV
となっているようです。
0195デフォルトの名無しさん
2007/02/12(月) 06:07:340196デフォルトの名無しさん
2007/02/14(水) 01:56:31なにやってるんだかよくわからんよ。
このままだとVAIO部門も潰されるんじゃないか?
潰されたとしてNECあたりが買い取ってくれるといいけどね。
0197デフォルトの名無しさん
2007/02/14(水) 22:02:18誤爆(^ω^)おつ
>>190なんですがMSDNと睨めっこしてたけどまだワカランス
>>193の内容は理解出来てるんだけどプレーンがわからんのだな。GetPointer()で映像の画素情報にアクセスできるんだけどプレーンってどうアクセスするの(`・ω・´)??
>>194
そう自分もググッたんでそれは大丈夫。IYUVは一画素にYに8bit、UVに2bitの計12bit使うほーまっと
0198デフォルトの名無しさん
2007/02/14(水) 22:58:43LPBYTE pY = GetPointer で得たポインタ。
LPBYTE pU = pY + width*height;
LPBYTE pV = pU + width*height/4;
Y値は pY から width*height バイト。
U値は pU から (width/2) * (height/2) バイト(縦横ともに半分の解像度ってこと)。
V値は pV から (width/2) * (height/2) バイト。
こんな感じ。UVは逆かもしれない。
パック形式のYUYVとかの場合は(4:2:2ってやつ)、UとVだけ水平解像度が半分で
UとVがYと交互に入ってる式。
>IYUVは一画素にYに8bit、UVに2bitの計12bit使うほーまっと
UVは4ピクセル辺り1バイトだから、8/4で2bitと言ってるだけ。
0199デフォルトの名無しさん
2007/02/14(水) 23:42:16ありがとう了解それがわからんかったです。
0201デフォルトの名無しさん
2007/02/15(木) 08:14:540202デフォルトの名無しさん
2007/02/17(土) 18:32:41これって何かいまいちだね。
データを得られればとりあえずはいいので
サンプルグラバっていうのを使ったほうが簡単だったみたい。
でも微妙な動作が違うような。
まあ、既にリリースもしたし、いまさら作り直して挙動が変わるのは困るので
このまま突き進むしかない。
DMOだとピン接続決定とか切断とかわからないみたいだね。
ピン接続できるかの問い合わせがあるけど、
これにOkで答えてもその後同じ条件でまたピン接続できるか問い合わせがある。
接続したとか接続してないとかないみたい。
データの出力が能動的じゃなくて受動的なのもなんか作りにくいな。
DirectShowって難しい。
0203デフォルトの名無しさん
2007/02/17(土) 18:35:23カテゴリにオーディオエンコーダってのを指定しているんだけど
接続できるか問い合わせされるときビデオ関係が含まれていやがんの。
別に問題ないけどさ。
0204デフォルトの名無しさん
2007/02/18(日) 00:39:210205デフォルトの名無しさん
2007/02/21(水) 00:47:18これでサイズ指定が出来ました。
使えないフォーマットがあるし
RGB555とかYUY2とかはどれ選んでいいのか(負荷の一番低いもの)わからないので
とりあえず設定ファイルに入れて変更可能にしといた。
プレビューがデフォルトで640x480になって高負荷になり
画像サイズ変更はプレビュー(レンダラ接続)前じゃないと変更できない
という不便さから解放されました。
0206デフォルトの名無しさん
2007/02/24(土) 12:06:13ttp://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/DirectX9_c/directx/htm/selectingacapturedevice.asp
レベルが低くて大変恐縮なんですが、上記のページのようにすると
キャプチャのデバイスで、ネットワークカメラも選択できるようになるのでしょうか?
・USBカメラのプログラム作成すると、ネットワークカメラも
そのまま取り込み出来るのでしょうか?
・プログラミングも初級レベルなので、サンプルプログラム
などあると勉強しやすいのですが、本やサイトなどありますでしょうか。
USBカメラについてのサンプルプログラムは、いくつか見つかりました。
よろしくお願いします。
0207デフォルトの名無しさん
2007/02/24(土) 13:07:39ttp://homepage1.nifty.com/MADIA/vc/vc_bbs/200307_03070013.html
こちらにネットワークカメラについての制御の仕方について
少し書いてありました。
USBカメラのように一律なプログラムでなくて、
ネットワークカメラごとに、プログラムを変えないといけないのでしょうか。
なにを考えていけば、わからないのですが。
・ネットワークカメラごとのマニュアルを読んで、HTTPでネットワークカメラに
接続、画像を取り込む
・そのあとは、USBカメラと処理が同じ
こんな感じなのでしょうか?
具体的なコードはまだわからないのですが、方針として
ネットワークカメラの制御が、HTTPだけですむなら、
USBカメラのプログラムで、画像を渡す部分だけ、
改造すれば大丈夫でしょうか。
スレ違いでしたら、誘導していただけますと助かります。
よろしくお願いします。
0208デフォルトの名無しさん
2007/02/24(土) 23:27:29そういう場合、そのカメラを操作するにはそのメーカーが提供するライブラリを使うことになるだろうね。
映像を受ける側はカメラ用のフィルタグラフではなくネットワークからのストリームを受信するような感じになると思う。
0209デフォルトの名無しさん
2007/02/25(日) 01:49:42お返事ありがとうございます。
livecaptureっていうフリーのすごいソフトありますが、
どうやって複数のネットワークカメラに、対応しているのか疑問でしたが、
メーカーさんが公開しているマニュアルを見て、プログラミングしてるのかもしれないですね。
通信の仕方をメーカーさんが、公開してないとだめなんですね。ふむふむ。。
0210デフォルトの名無しさん
2007/02/25(日) 14:22:290211デフォルトの名無しさん
2007/02/26(月) 10:33:36>当然遠隔操作のコマンド
付いてくるけど画像ストリームの仕様は無いのよ
とりあえずメーカーに問い合わせてみる
0212デフォルトの名無しさん
2007/02/26(月) 18:16:380213デフォルトの名無しさん
2007/02/27(火) 01:19:35IAMCameraControlがありますが、これらでサポートされていないパラメータへ
アクセスする方法はありますか?
具体的には、USB Video Classのサポートで追加された、
KSPROPERTY_VIDEOPROCAMP_DIGITAL_MULTIPLIER
KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE_COMPONENT
辺りへアクセスしたいんですが。(対象デバイスがそれらのプロパティをサポート
してるのは確認しています)
axextend.idlやstrmif.hのenumにはidが定義されていないし、WHITEBALANCE_COMPONENTの
NODE_S2タイプのアクセス関数(パラメータが2個あるタイプ)もヘッダに見つかりません。
これはカスタムで書くしかないんでしょうか。
0214デフォルトの名無しさん
2007/02/27(火) 13:54:190215デフォルトの名無しさん
2007/03/01(木) 02:00:42DirectShowの勉強を始めました。
一通り調べた結果、以下の事を勉強する必要があると思いましたが、他にも「これ知っとけ」
みたいなことがあったら教えてください。
〜既にある知識〜
C、Win32API、grapheditの扱い
〜これから学ぶべきと思うこと〜
C++、COM、自作フィルタの作成と登録の方法
0216デフォルトの名無しさん
2007/03/01(木) 07:21:37概念理解が勉強の中心になると思う。ガンガレ〜
既に知ってるとは思うが、「BMP構造」を理解しておくとよいよ。
基本はBMP画像のぱらぱら漫画を加工する事になりますので。
0217215
2007/03/01(木) 14:07:11ありがとうございます。
BMPについてはWin32APIでいじり倒してきたのでいけると思います。
DirectShowについてはその仕様と情報の少なさに辟易していますが、
地道にがんばろうと思います。
0218デフォルトの名無しさん
2007/03/01(木) 17:23:44学ぶべきことがわかってるのはすばらしい!
ただし、下手に段階踏むと挫折しかねないので、
とりあえずサンプルコードからはじめるといいと思う。
「これで動くけど、なんでだろー?」って形で勉強するといいかも。
0219デフォルトの名無しさん
2007/03/01(木) 21:52:110220デフォルトの名無しさん
2007/03/01(木) 22:30:270221デフォルトの名無しさん
2007/03/01(木) 22:44:15この2つを最初にみたとき何が最低限実装が必要なメソッドかわからんかった。
そんな意味でのもっとシンプルなサンプル
0223デフォルトの名無しさん
2007/03/02(金) 00:06:52ひとまず、君の使ってる環境を教えてくれ。
自分はVC6+DX8SDK、VC2003+DX9(オウガスト)
の2つの環境でやっとる
0225デフォルトの名無しさん
2007/03/02(金) 00:25:29http://www.geocities.co.jp/SiliconValley/7406/tips/dshow/
http://hammer.prohosting.com/~arabo/DirectShow.shtml
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/DirectX9_c/directx/htm/directshow.asp
0226デフォルトの名無しさん
2007/03/02(金) 02:37:07わかったよ。確かにそれみりゃわかるね。
甘やかすのは無用。勉強させろと無言のプレッシャーを感じる…。
0227215
2007/03/02(金) 03:03:29二つ目のサイト以外は既に目を通したものばかりですが、それでも難しいと思いました。
キャプチャの出力解像度を変えることすらできませんでした・・・。
とりあえずC++から地道にべんきょーします。
0228デフォルトの名無しさん
2007/03/02(金) 04:17:440229デフォルトの名無しさん
2007/03/02(金) 08:49:03そしてここはsage進行なんですね。マイナーだからageてました
0230デフォルトの名無しさん
2007/03/02(金) 08:53:36C++経験者でないときついのか。
0231デフォルトの名無しさん
2007/03/02(金) 15:09:51入門や概説を一通り読んだら、リファレンスを全部読むのを薦めます。
0232213
2007/03/02(金) 21:13:20色々調べて試したみたところ、IKsPropertySetが使えそうなのは判りました。
ただ、これでVideoProcAmpのプロパティへアクセスしてみたところ、
旧来のKSPROPERTY_VIDEOPROCAMP_BRIGHTNESSのようなFilterベースの
プロパティアクセスをサポートしているものはうまく動作しますが、
KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE_COMPONENTのような
ノードベースのアクセスしかサポートされていないパラメータへはアクセス出来ないようです。
入力インスタンス構造体のFlagsにKSPROPERTY_TYPE_TOPOLOGYをつけて
Get()を使ってみてますが、正常終了するものの中身が0です。
旧来のパラメータもノードベースでアクセス出来るようなので試したみたところ、
入力インスタンス構造体をノードベース(KSP_NODE)ではなくフィルタベース(KSPROPERTY)で
見ているようです。
どうもIKsPropertySetはフィルタベースのアクセスしかサポートしていないのでは、と
推測してるのですがどうなんでしょうか。
IKsControlを使うべきなのかと思い試してますが、こっちはnot supportedのえらーコードが返ります。
0233デフォルトの名無しさん
2007/03/02(金) 21:25:17今でもわかんないこと多いけど。
サンプルと手助けがないとつらいね。
0234デフォルトの名無しさん
2007/03/02(金) 22:02:35勘で書いてるんだけど、IKsTopologyInfo:, CreateNodeInstanceでノードを作って、
ノードの方から IKsProperty を QueryInterface で取得して、IKsPropertySet::Setで
プロパティをセットするんじゃないだろうか。
0235デフォルトの名無しさん
2007/03/02(金) 23:55:00DirectShowは設計がマズイと思う。
フィルタグラフマネージャは自前でスレッドをもってユーザスレッドストリームスレッドとの切り離しをすべきだ。
いつの間にかメインスレッドから呼び出されていたりしてデッドロックとか多い。
0236デフォルトの名無しさん
2007/03/03(土) 11:14:01ほんとそのとおりだね。
IBasedPin::Reciver内で別スレッド立ててアロケータ確保すると
うまくやらないとアボーンする。。
0237215
2007/03/03(土) 23:03:00ありがとうございます。
そうしてみます。
C++の入門書を一通り読みましたが、新しいことがいっぱいで疲れました・・・。
次はMSDNのリファレンスを読みます。
早くキャプチャソフト作りたいです。
0238デフォルトの名無しさん
2007/03/04(日) 00:56:51切り離すモードと切り離さないモードがある。
0239213
2007/03/05(月) 22:24:32DDKやPlatformSDKの情報からみて、まさに指摘されてるようなことなんじゃないかと
思って試してみてますが、IKsTopologyInfo::CreateNodeInstance自体がエラーになるんですよね。
色々調べてみると、どうもWindowsXPでCreateNodeInstance自体が完全にサポート
されていない雰囲気がするのですよ。UVC extensionを調べててこんな情報がありました。
ttp://www.codecomments.com/archive421-2005-11-657282.html
自分のやり方が間違ってるかもとも思うんで、しばらく頭を冷やしてもう一度
試してみるつもりです。
0240デフォルトの名無しさん
2007/03/05(月) 22:27:24キャプチャ(640×480出力)→ビデオレンダラ
というふうに繋いでいます。
ビデオレンダラでフルスクリーンにすると、4:3のアスペクト比を守りながら拡大してくれるのは
うれしいのですが、16:9ソースの表示にも対応するために、フルスクリーンの状態で
16:9にしたいです。
しかし、どうしてもできません。
描画されるビデオウィンドウはウィンドウズアプリのメインウィンドウに貼り付けているカタチです。
ソースは640×480を保ったまま、16:9にリサイズしてフルスクリーンにしたいです。
ご助言、よろしくお願いします。
0241デフォルトの名無しさん
2007/03/05(月) 22:40:46ビデオレンダラーから(フィルタグラフからでもいいのか?)
IVMRAspectRatioControl、IVMRAspectRatioControl9 や IVMRWindowlessControl を取得して、
SetAspectRatioModeでアスペクトレシオを無視するようにする。
レンダラのサイズは自前で16:9にしておく。
0242デフォルトの名無しさん
2007/03/05(月) 22:57:06再接続することなく対応したいのですが、レンダラへ新しい縦横サイズは教えてやれたのですが、
バッファサイズを変更できませんでした。
マニュアルには現在より大きなバッファサイズが必要な場合は、ReceiveConnectionを使えとありますが、
フィルタのどこにどのようなコードを追加すればよいのか分かりません。
デタラメな文章ですが、アドバイスありますでしょうか。。
0243240
2007/03/06(火) 00:47:31ありがとうございます!
まずウィンドウレスモードですが、試そうとしたところ、ビデオをウィンドウに転送するところで
強制再起動が掛かかるなど恐ろしいことになってしまったので、ちょっと置いておきます。
ウィンドウモードで作りこんでしまったこともあり、できればこのままで解決したいと思っております。
他の試みとして、IVMRAspectRatioControlをVMR7から呼び出してSetAspectRatioModeで
アスペクト比固定をしないよう設定したのですが、相変わらずアス比固定でフルスクリーン
になりました・・・。
GetAspectRatioModeで確認しましたが、ちゃんとVMR_ARMODE_NONEになっていました。
そこで、grapheditで調べましたところ、
ttp://vista.jeez.jp/img/vi7310912755.jpg
二つあるフルスクリーンボタンのうち、「Set Full Screen」のほうはアス比固定拡大、「Full Screen Window」
のほうは全体に引き伸ばして表示される、という結果になりました。
先に試したプログラムのほうでは、前者のほうになっているのではないかと考えられます。
後者の「Full Screen Window」ボタンを押すことと等価な処理としては何が考えられるでしょうか?
0244240
2007/03/06(火) 01:37:56ここのウィンドウレスモードの説明を見ていると、こちらのほうが良さそうですし、なんとか
ウィンドウレスモードで動くようにしてみます。
0245デフォルトの名無しさん
2007/03/06(火) 15:01:49古来より DirectShow でフルスクリーン再生をする際には、
レンダラをフルスクリーンモードにするのではなく
単に全画面のウィンドウで再生する方が好しということになっています。
後者はそれでしょう。
0247デフォルトの名無しさん
2007/03/07(水) 21:22:13IEnumMoniker::Next()を繰り返すことでキャプチャデバイスを切り替えるというプログラムを組んでいます。
デバイスが検出されなくなったら、IEnumMoniker::Reset()をして先頭から数えなおすように
しています。
一回の切り替えを細かく説明すると、
ストリームの停止→キャプチャフィルタの削除→上記メソッドで検出した新たなデバイスをグラフに追加
→ICaptureGraphBuilder2::RenderStream()でグラフをVMR9に直に接続→再生
という流れです。
これに問題がありまして、この切り替えを8回繰り返す(4順する)と必ず画面が最後のフレームを
表示したまま固まってしまいます。
考えられる原因や対処法がありましたら、ご教授お願いします。
0248デフォルトの名無しさん
2007/03/08(木) 02:22:270249213
2007/03/08(木) 03:23:24問題が度解決できました。この辺を触る人はあまりいなさそうですがご報告だけでも。
結論からいうと、IKsTopologyInfoを使ってKSNODETYPE_VIDEO_PROCESSINGノードを
検索し、そのノードからIVideoProcAmpインタフェイスをCreateNodeInnstanceで生成することで、
拡張されたプロパティへアクセス出来ました。(IAMVideoProcAmpやIKsPropertySetではなく)
IVideoProcAmpはノードベースのインタフェイスとしてvidcap.hで定義されてますが、
Vista用のWindowsSDKで配布されているバージョンでないと定義自体存在しません。
USB Video ClassがXPSP2以降のサポートだったのでPlatform SDK(2003R2)を使っていたのですが、
これがまず失敗でした。
また、NTDDI_VERSIONとsdkddkver.hを使い、XPSP2以降であることを明示する必要がありました。
あと細かい話ですが、MSDNやWindowsSDKのドキュメントには、IVideoProcAmpノードの
生成時にIIDとしてIID_IVideoProcAmpを指定しろ、と書かれてますが、こいつのオブジェクトが
どこにも存在せずリンクエラーになります。_uuidof(IVideoProcAmp)で指定しないと駄目な模様です。
0250247
2007/03/08(木) 17:52:00原因は二つ目のキャプチャデバイスをRenderStream()するときのみ、間に色空間変換フィルタが
挿入され、キャプチャフィルタを削除したときに色空間変換フィルタ、VMR9間のピンが持つ
アロケータにバッファがどんどん蓄積されていくためだったようです。
デバイスを切り替える度、VMR9との接続を切るようにすると、うまく動作するようになりました。
0251デフォルトの名無しさん
2007/03/09(金) 00:51:33ビルドがどうしてもできません。
お持ちの方がおられましたらお譲りください。
お願いします。
アップローダ
ttp://www.rupan.net/uploader/
環境
WindowsXP SP2
Platform SDK for Windows Server 2003 SP1
Visual Studio 2005 Express Edition
0252デフォルトの名無しさん
2007/03/09(金) 02:40:170253251
2007/03/09(金) 03:08:44いえ、最近になって.slnや.dswのファイルが付属しなくなりまして、makefileがついているんです。
それで
ttp://www.shader.jp/xoops/html/modules/xfsection/article.php?articleid=17
このページと同じように進めてもcl.exeが見つからないようなことを示すエラーが出て、
それじゃあとcl.exeのあるフォルダを環境変数のPathに設定してやると今度はmspdb80.dllが
見つからないと言われて失敗します。
0254デフォルトの名無しさん
2007/03/09(金) 04:01:110255デフォルトの名無しさん
2007/03/09(金) 04:16:23お前の最近は2年前か?
0256251
2007/03/09(金) 04:29:10え!?そうなんですか!?
ttp://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en
ここのPSDK-x86.exeをダウンロードしてインストールしたのですが、違うのでしょうか?
>>255さんの入手経路を教えてください。
0257デフォルトの名無しさん
2007/03/09(金) 05:18:470258251
2007/03/09(金) 07:07:13ttp://ugd555.blog1.fc2.com/page-13.html
同じ症状を解決した方のページを見つけました。
最終的に別のフォルダから5つファイルを持ってこなければいけませんでした。
この問題に18時間費やしました・・・
0259251
2007/03/09(金) 09:44:34ライブラリファイルが無い、と言われどうしようもありません。
そういえば、VC2005EEでDirectShowフィルタを開発したという話を聞いたことがありません。
ちゃんとしたVCを買え、ということでFAでしょうか?
もしそうなら、観念して買いに行きます・・・
0260デフォルトの名無しさん
2007/03/09(金) 09:45:260261デフォルトの名無しさん
2007/03/09(金) 16:37:130262デフォルトの名無しさん
2007/03/09(金) 16:42:53初心者スレにでも行け
DirectShowスレで語るべき内容ではないだろ
0263デフォルトの名無しさん
2007/03/10(土) 01:13:370264デフォルトの名無しさん
2007/03/10(土) 02:25:220265デフォルトの名無しさん
2007/03/10(土) 05:35:57という構成の中の変換フィルタで、キャプチャフィルタからサンプルが1枚くる度に
サンプルに対し処理Aを実行→出力→表示
サンプルに対し処理Bを実行→出力→表示
というように2回の処理、出力を行いたい(フレームレートを倍化したい)のですが、
どうすればよいでしょうか?
なお、キャプチャ出力のフレームレートは上限に設定しています。
タイムスタンプをいじるだけではうまくいきませんでした。
IMemInputPin::Receiveを使うにしても、それを呼び出す頻度をどのようにすれば
合わせられるかが分からずできません。
0266デフォルトの名無しさん
2007/03/10(土) 07:16:470267デフォルトの名無しさん
2007/03/10(土) 11:46:39仮にキャプチャフィルタが30f/secで投げてくるなら0.033...秒間隔のスタンプが設定されているだろうから
自分でつくる変換フィルタは2枚目に0.033.../2秒のタイムスタンプを足して設定してやる。
んで自分が出力ピンからDeliverするときに、自分で送りたい2枚分、下段の入力ピンReceiveを呼ぶ。
2回送信完了してから、上段にDeliverの結果を返す。
0268デフォルトの名無しさん
2007/03/10(土) 17:49:27の658です。
たぶんこっちで質問したほうがいい気がしたので。
何度やっても同じところ(CopyMemory)で落ちます。
原因として思い当たる件があったらご教示願います。
0269デフォルトの名無しさん
2007/03/10(土) 18:11:4124bit以上のソースなら、BITMAPINFOHEADERだな。
0271268
2007/03/10(土) 19:24:59どこが悪いんでしょう?
0272デフォルトの名無しさん
2007/03/10(土) 19:32:55これか、
CopyMemory( &BitmapInfo.bmiHeader, &(pVideoHeader->bmiHeader),
sizeof(BITMAPINFOHEADER));
探すの面倒だから直リンして欲しいな。
http://pc11.2ch.net/test/read.cgi/tech/1168354839/658
コピー先と、コピーするサイズとか確認してみれば。
&BitmapInfo.bmiHeader が有効なメモリを指してる?
&(pVideoHeader->bmiHeader) が有効なメモリを指してる?
sizeof(BITMAPINFOHEADER) これはあっていると思うけどさ。
0273268
2007/03/10(土) 19:37:59&(pVideoHeader->bmiHeader):30
むう?
0274268
2007/03/10(土) 19:41:33&BitmapInfo.bmiHeader:12F044
&(pVideoHeader->bmiHeader):30
&BitmapInfo.bmiHeaderが怪しいですね。
0275268
2007/03/10(土) 19:42:420276デフォルトの名無しさん
2007/03/10(土) 19:49:110277デフォルトの名無しさん
2007/03/10(土) 19:50:180278デフォルトの名無しさん
2007/03/10(土) 19:51:15もう8回くらいリビルドしてますorz
手動でbmiHeaderを初期化したりしてもダメでした。
0279デフォルトの名無しさん
2007/03/10(土) 20:06:490280268
2007/03/10(土) 20:09:100281265
2007/03/10(土) 23:31:42その方法を試すために、まず出力ピンのメディアタイプを取得しようとしたのですが、
原因不明のエラーが出ます。
何がまずいのでしょうか?
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 ); ←上と同じエラー
・・・
}
0282265
2007/03/10(土) 23:36:19タイムスタンプ修正は行えるのですが、下段の入力ピンのIMemInputPin::Receiveを
どのようにすれば呼び出せるのかが分かりません。
>>281で示したようなコードでIPinクラスは取得できるのですが、
ttp://msdn.microsoft.com/library/ja/jpdx8_c/ds/ref/class/CBaseInputPin.asp?frame=true#CBaseInputPin
ここを見ると、IMemInputPinはIPinの子クラスなので、それに実装されているReceiveメンバに
アクセスできません。
ご教授願います。
0283デフォルトの名無しさん
2007/03/11(日) 00:38:34CTransformFilter、CTransformInputPin、CTransformOutputPinね
入力サンプルがどう入ってきてどこで変換してどうやって出て行くのか
更にしたのベースクラスの知識も必要になるだろうけどさ
既に下段に接続してる相手のメディアタイプが欲しいなら
出力ピンのCurrentMediaTypeでいいだろ
0284デフォルトの名無しさん
2007/03/11(日) 01:14:56m_pOutput->Deliver するだけでOK
0285265
2007/03/11(日) 03:49:55ありがとうございます。
m_pOutput->CurrentMediaTypeでメディアタイプを取得し、pbFormat(VIDEOINFOHEADER)内の
AvgTimePerFrameを変更してやることでフレームレートの変更を試みてみました。
しかし、今まで通りの10000000/29.97[100ns]であれば下流のフィルタ(色空間変換フィルタ)に
繋がるのですが、倍の10000000/59.94[100ns]では接続できませんでした。
残念ながら対応していないようです。
0286265
2007/03/11(日) 03:50:22ありがとうございます。
一枚のサンプルに対し二度出力できるようになりました。
しかし、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 );
0287デフォルトの名無しさん
2007/03/11(日) 05:56:40部分的コードなのでわからないが、サンプル使いまわしたりはしていないよね?
0288265
2007/03/11(日) 09:37:13試しに
AvgTimePerFrame /= 2;
としてみましたが、やはり受け付けませんでした。
AvgTimePerFrame /= 1;
だったら大丈夫です。
>サンプル使いまわしたりはしていないよね?
他の方が作られたサンプルを使いまわししてます。
ですが、Transformメソッドをいじるだけくらいのシンプルな変換フィルタでして、その処理部分に関しては
すべて書き換えています。
0289デフォルトの名無しさん
2007/03/11(日) 11:18:23> Transformメソッドをいじるだけくらい
CTransformFilter::Receive内でもDeliverしてるからな。その辺り大丈夫だよね?
文面から察するに
OutputPin::CurrentMediaTypeでメディアタイプ取得できるってことはピンが繋がっている状態なのだが
一旦Pin接続解除した後にフレームレート倍のメディアタイプを色変換に提示(OutputPin::GetMediaTypeで設定)して
再接続を試みてるんだよね?
0290265
2007/03/11(日) 11:56:35>EndTimeが0で来る場合もあるのでチェックして下さい。
チェックしてみましたが、EndTimeが0で来る様子は見られませんでした。
>CTransformFilter::Receive内でもDeliverしてるからな。その辺り大丈夫だよね?
どうなんでしょう・・・影響があるかは判断しかねます・・・
メディアタイプ変更の件ですが、グラフエディタ上で接続が断たれた状態からピンを繋ごうとしたとき、
キャプチャフィルタのメディアタイプから変更しなかった場合は成功し、変更すると失敗する、というかんじです。
フレームレートの不安定ですが、もしかしたら処理負荷が大きいためかもしれません。
表示ウィンドウのサイズを大きくする(ネイティブサイズは同じ)とフレームレートが落ちていきます。
CPUの使用率は60〜70%ですが、VMR9側の問題でこのようなことになっているのかもしれません。
この負荷の原因として、変換フィルタとVMR9との間に挟まっている色空間変換フィルタが挙げられます。
キャプチャフィルタから直接VMR9に繋ぐときは介在せず、CPU負荷も小さいです。
ところが、同じメディアタイプを設定しているにも関わらず、変換フィルタを挟むと、その後に色空間変換フィルタ入ってきます。
キャプチャから直接VMR9の場合はシステムメモリは介さず、直接ビデオRAMに移す、というようなことでもしているから
こんなことになるのでしょうか?
もし変換フィルタから直接VMR9に繋げられるような方法がありましたら教えてください。
0291268
2007/03/11(日) 16:50:34(そっちのソースはCopyMemoryで落ちないので)
で、そっちのBitmapInfoのbmiHeaderを調べてみたところ、他の値は想定の範囲内なんですが
BitmapInfo.bmiHeader.biCompression = 1685288548
と�dでもない値が入っていて、どうやらこいつが原因だと判明。
これって何なんでしょ?
ぐぐったらdvsdとか出てきたんですがよくわかりません。
0292268
2007/03/11(日) 16:54:12BitmapInfo.bmiHeader.biCompression=BI_RGB;
なんてことをやると一応動くようにはなりました。
ただ取得できる値がおかしいので正確に動いてる感じではありませんが。
0293268
2007/03/11(日) 17:04:27void 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にしているから無理が生じているような予感がちらほら。
0294デフォルトの名無しさん
2007/03/11(日) 18:34:300295デフォルトの名無しさん
2007/03/11(日) 18:42:48レンダラに直接接続したければ、すべてのフォーマットを出力で対応する必要がある。
まあでも32bitでだいたいの環境はいける。
接続できなければレンダラが対応していないのだろう。正しい接続の仕方ならばね・・・。
0297デフォルトの名無しさん
2007/03/11(日) 20:32:01それをキャプチャデバイスとレンダラの間に入れてみてくれ。
やっぱり色空間変換フィルタが必要とされるか?されないか?
0298デフォルトの名無しさん
2007/03/11(日) 20:35:020299265
2007/03/11(日) 21:09:48自前のWindowsSDKにないのでDirectXのExtrasをダウンロードし、その中からNullInplaceフィルタを見つけたのですが、
ビルドすると、PC内に存在しないatlbase.hが無いと言われてしまいます。
無念です・・・
0300デフォルトの名無しさん
2007/03/11(日) 21:44:59> どうなんでしょう・・・影響があるかは判断しかねます・・・
どう実装してるかわからんけど、もしかしてTransformメソッドの中で2回Deliverしてる?
CTransformFilter::Receive良く読んで理解してるよね?
0301デフォルトの名無しさん
2007/03/12(月) 08:02:05上流フィルタからの映像が来る来ないに関わらず非同期でフレームレートを作るフィルタが出来なかったんだよな。
今悩んでいる子がここまでやるのなら全力でサポートするよ
0302デフォルトの名無しさん
2007/03/12(月) 08:04:430303265
2007/03/12(月) 08:07:00そうです、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が呼び出されるタイミングが分かりません。
サンプルが変換フィルタで処理されるサイクルはどのようになっているのでしょうか?
0304265
2007/03/12(月) 10:06:54・タイムスタンプがないプレビューピンからの映像に対して変換を行ったところ、同じうなり現象(>>284)が起きた。
・一枚のサンプルに対して二度の処理を行うが、片方の絵を真っ黒にしてみると、フレームが倍化していないときは
二枚目の絵のみが表示される状態であることが分かった。
・二度目のDeliverを外したところ、フレーム倍化の時間が若干延び、倍化していない期間においても
一枚目の絵と二枚目の絵が交互に表示された。
このとき、キャプチャーピンからの映像では倍化していない期間で絵が0.5秒ほどストップすることが頻繁に起こった。
プレビューピンからの映像ではこのストップ現象は起きない。
0307265
2007/03/12(月) 17:31:09(同時にこの手法のダメさを裏付けるものでもありましたが・・・)
条件は
・キャプチャフィルタのプレビューピンに繋げる(よってタイムスタンプの設定は意味なし)
・二度目のDeliverを無くす(あるともたつきが起こる)
・画面表示をビデオのネイティブサイズである640×480に対し、約2倍以上にするとフレームレートのうなり現象が
無くなり約60fpsで一定となる。
このとき、CPUの使用率はサイズが大きくなるにつれて上がる。
これらの現象から導き出される結論として、
一度目のDeliverと二度目の(本来行われる)Deliverは連続ですぐに行われ、二度目のDeliverにより送信された
二枚目は一枚目で設定したタイムスタンプがあろうが無かろうが即座に描画される。
CPUの負荷が上がり、すぐに二度目のDeliverが処理できない場合、その間一枚目が表示されることとなり、この時間が
ちょうど1/60秒となるときキレイにフレームが倍化されることとなる。
描画サイズが小さいときはCPUに余裕がある期間が存在し、そのときは二枚目のみが表示される。(フレームが倍化されない)
ということが言えると思います。
よって、一度のTransformメソッドで二度のDeliverを用いる作戦はアウトということになりました・・・。
0308デフォルトの名無しさん
2007/03/12(月) 18:47:41出力メディアタイプと違うサンプルを出力しても、期待した通りに動かないよね。
あと処理が間に合わない時も、どこかのフィルタが捨てると思う。
一度CPU負荷がほとんど発生しないプロトタイプを作って実験して、処理遅れなのかそれとも別の問題なのか調べて見ては?接続の問題も解決を。
リアルタイムで処理したいんだよね?
それとDirectShowで「サンプル」といえば、IMediaSample2などのデータの事をしめします。
>>287 は、一度ダウンストリームに送信したサンプルをまた再利用するなよってこと。
0309デフォルトの名無しさん
2007/03/12(月) 21:53:42これがマイナスだとレンダラに間に合って届いている。
プラスだと間に合ってないので到着したとたんにレンダリングされたりして
動きがギクシャクしたり捨てられてカクついたりする
0310デフォルトの名無しさん
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メソッドで変更を加えたサンプルを渡す ってこと。
長いので続く
0311デフォルトの名無しさん
2007/03/12(月) 22:48:26> CTransformFilter::InitializeOutputSample (新しいサンプルを[キャプチャフィルタ]の出力ピンから取得する)
InitializeOutputSampleは出力するサンプルの準備をするメソッドなんだ。
ここでは送信するサンプルのバッファをサンプルと結びつける(バッファ自体は出力ピンが確保してる)
HRESULT hr = m_pOutput->m_pAllocator->GetBuffer(
その後で、上流から受け取ったサンプルのプロパティ(各種フラグと言ったほうがわかりやすいか)や時間情報を
出力するサンプルに設定していく。これがInitializeOutputSampleの役割。
このことから、上流から受けたサンプルと、自分で送るサンプルは全くの別物であるということがわかる。
送信が済んだら、このサンプルをリリースすることでバッファの開放などが行われる
(CTransformFilter::Receiveの最後の方 pOutSample->Release(); )
ちなみに上流から受けたサンプルをダイレクトにそのまま下流に出力するのはCTransInPlaceFilterだ
つづく
0312デフォルトの名無しさん
2007/03/12(月) 23:10:36しかも3回目のサンプルの時間情報は上流から受けた時間そのもの
0313デフォルトの名無しさん
2007/03/12(月) 23:13:13そういう設計なんでこざいます だからここから送信したら ブーブー
TransformInputPin::Receiveをオーバーライドしないとアカンねん
0314デフォルトの名無しさん
2007/03/12(月) 23:23:29サンプルのタイムスタンプ見てレンダラが表示のタイミングを待ったり、時には捨てたりするアルよ
サンプルの不連続性(Discontinuity)とか同期ポイント(SyncPoint)を示すフラグの扱いとか
注意してくれよ キレイなフィルタを作りましょう。んじゃ頑張れ
0315265
2007/03/12(月) 23:33:31了解です。
>それとDirectShowで「サンプル」といえば、IMediaSample2などのデータの事をしめします。
そういうことでしたか・・・
失礼しました。
>>309
ありがとうございます。
調べてみます。
>>310-314
とても丁寧にありがとうございます。
がんばります。
0316デフォルトの名無しさん
2007/03/14(水) 22:52:01dvsdなんかではCreateDIBSectionに失敗しそうな気がするけど、それはないの?
あと、フィルタいじれるなら入力ピンのCheckMediaTypeでMEDIASUBTYPEの
RGB24かRGB32以外を弾くようにすれば、その辺不問にできるような気がするけど・・・。
0317デフォルトの名無しさん
2007/03/15(木) 01:14:32DVDをAVIにして保存したいんですが、YUYをRGBに変換するフィルタとAVIを書くフィルタは自前で作るのですか?
色々やってみてダメだったらヒントください。
ちょっと頑張ってくる。
0319デフォルトの名無しさん
2007/03/15(木) 14:11:19(1) 普通のDIBを用意して、そこにDrawDibDrawで描く
(2) 入力ピンのフォーマットをRGB24/RGB32に限定して、フィルタグラフ側で変換してもらう
(3) 自分でDVをでコードする
1,2は実質的にはaviのというかvfwのdvコーデックが使われる。
「やらなきゃいけない」かどうかは自分で決めればいい。
やりたくないならやらなくていいんじゃない?
0321268
2007/03/15(木) 18:38:43(2)を試してみます。
ttp://webcamxtra.sourceforge.net/
これを活用すればいけそうな気もしてるんですけどね・・・。
今までウェブカメラは自力で処理できていたのでどうにかしたいもんです。orz
0322268
2007/03/15(木) 18:52:30あとはDrawDibDrawの引数だけだと思うので、ちょっくら追ってみます。
0323デフォルトの名無しさん
2007/03/15(木) 23:07:58DVD Navigaterのフィルタを取ってRenderStreamすればAVIにできると思ったのにダメでした。
DVDをAVIにして保存する方法って何かあるんでしょうか。
サンプルグラバつなげられれば保存できる気もするんだけどPINをつなげられない。
0324デフォルトの名無しさん
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 という流れができるか明日ためしてみる。
0325268
2007/03/16(金) 16:53:10というわけで他の方法試してみます。
0326デフォルトの名無しさん
2007/03/16(金) 16:55:370330268
2007/03/16(金) 17:24:46何か記述が足りない気がしてきた。
サンプル探してるんですけど全然見つからないんですよね。orz
0331デフォルトの名無しさん
2007/03/16(金) 21:58:23サンプルグラバ使ってるんですよね?
SetMediaTypeでMEDIASUBTYPE_RGB24指定して
dvsdで流れてこないようにしたらどうですか?
あなたのレスをすべて追っかけてるわけじゃないんで、外してるかもしれませんが。
0332デフォルトの名無しさん
2007/03/16(金) 23:26:240333デフォルトの名無しさん
2007/03/17(土) 01:06:17OverlayMixerはレンダラとつながる。そしてオーバーレイで自分が描画している。
後ろにつながっているビデオレンダラはメディアサンプルを受け取っておらず、
ウインドマネージャを提供しているに過ぎない。
つまりたとえつながってもサンプルを取ることはできない。
はず。
0334デフォルトの名無しさん
2007/03/17(土) 01:23:46はい。そうでした。全く繋がらなくて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
という形で保存できればいいんですが。
0335268
2007/03/17(土) 21:42:01原因は>>316や>>331あたりが正解だったようです。
ボスに言われてイチから書き直したらうまく動きました。
というわけで、本当にありがとうございました。
DirectShowと戦うことができたのはこのスレのおかげです。
0336デフォルトの名無しさん
2007/03/17(土) 22:04:51おめっとさん、その二つはいずれも私ですがw
実はDirectorのXtraに興味があってちょっと追いかけてました。
Xtraの描画周りって何を参考にしました?
キャプチャした画像を直接Director上で表示するのでしょうか?
ちょいスレ違いスマソ
0337268
2007/03/18(日) 22:28:43自分はDirector上での描画はやってないですね。
CreateDIBSectionで取得したピクセル毎のBGR値の差分を比較して使っています。
今回DVカメラを扱う上で参考にしたのは↓ですね。
http://wwwdoi.elec.nara-k.ac.jp/html/jisyu/dxm/cap2/index.html
処理部分コピペでもとりあえず動きます。
# コンソールも出せるみたいです。
Xtra開発者は海外の人ばっかりなので、日本人も増えてほしいもんです。
0338336
2007/03/19(月) 21:42:14なるほどどうもっす。
DirectShowのフィルタ書いてお茶を濁そうと思っていたのですが、
クライアントの意向によりXtraを直接弄る必要があり、
ちょいとハマってたところでした。
DirectShowも情報ない方だけど、Xtraはもっと険しい道だなこりゃ・・・。
0339デフォルトの名無しさん
2007/03/21(水) 10:49:02DirectShow フィルタ グラフに存在しないピンに操作を実行しようとしました。
になって再生できません、対策はありませんか?
0340デフォルトの名無しさん
2007/03/21(水) 20:05:390341デフォルトの名無しさん
2007/03/21(水) 20:42:03お前さんはまだわけぇから言いたいこともあるべぇ
だべな、派遣問題を口にするとバカにされたと思ってムキになって怒る者がおるでよぉ
てめぇでの責任で派遣やってる癖に派遣問題に触れると逆ギレするバカなんだけどよぉ
そんでもこの問題の指摘は駄目だっぺぇ
派遣のことは口にしちゃなんねぇ
この村みたいな民度ゼロの会社で現実忘れるためにはよ
北朝鮮とか宗教団体と一緒でよ、駄目なものを駄目と言ってはなんねえだべさ
タブーを口にしちゃいけねぇだ
0342デフォルトの名無しさん
2007/03/25(日) 16:03:45メモリを確保し、デコンストラクタでfree()で解放するようにしているのですが、
アプリ側でRemoveFilter()をしても、デコンストラクタが起こらないのかメモリが解放されません。
どうすればデコンストラクタを起こすことができるでしょうか?
0343342
2007/03/25(日) 16:05:530344デフォルトの名無しさん
2007/03/25(日) 16:30:43そりゃデストラクタは呼ばないんじゃねーの?
0345342
2007/03/25(日) 18:09:19そうみたいですね。
いろいろ考えたんですが、完全に削除できないのなら、そのまま残しておいて再利用しよう、という
方針で組んだところ、望む動作を実現できました。
いちいち削除する必要がなかっただけの話でした・・・。
ありがとうございました。
0346デフォルトの名無しさん
2007/03/25(日) 21:29:180348デフォルトの名無しさん
2007/03/26(月) 09:07:56ピン接続時のメディアタイプを調べたいのですが簡単に調べる方法がないため今回「メディアタイプチェックフィルタ」を作る事にしました。
質問1.調べるフィルタを誰か作ってませんか?
時間をかけず作りたい為、「TranceForm」をベースにしているのですが、このフィルタで入力ピンのみの構成のフィルタはできますか?(テンプレートのピン数を1本にしても2本になってしまいました何故…?)
0349デフォルトの名無しさん
2007/03/26(月) 10:16:350350デフォルトの名無しさん
2007/03/26(月) 10:17:190351デフォルトの名無しさん
2007/03/26(月) 12:14:35自分なら作るのに3〜4時間位かかってしまいそうなので、
時給1000円×4hまでならなんとか。。
でも誰か作っていそうなんでそれを使いたいです。
0352デフォルトの名無しさん
2007/03/26(月) 12:53:47Dumpフィルタベースじゃダメなんかいね?
あれは入力ピン1コだけど。
0353デフォルトの名無しさん
2007/03/26(月) 13:07:03IPin::ConnectionMediaType
それともこっちか
IPin::EnumMediaTypes
簡単だろ?
とりあえず、リファレンスくらい読め。
0354デフォルトの名無しさん
2007/03/26(月) 22:49:480355デフォルトの名無しさん
2007/03/26(月) 23:39:39考え同じ。せっかくだから上位フィルタに優先接続して欲しいタイプも入れられるようにしようかなと検討しとるですばい。
IBaseFilter::EnumPins
これはピンごとに管理したい時につかうメソッドだよ。ピン1つでは実装いらないよ
IPin::ConnectionMediaType
これは再生途中にタイプ変更したい時に実装したほがよさそ
0356デフォルトの名無しさん
2007/03/27(火) 00:10:35プロパティページで接続タイプ一式が表示されるやつがあったような ないよーな
0357デフォルトの名無しさん
2007/03/27(火) 00:40:51nullprop.cppのNullIPProperties::OnApplyChangesみるといいアルよ
0358デフォルトの名無しさん
2007/03/27(火) 00:56:20NullIPPropertiesはなかなか難しいことやってますねぇ。。。
理解しずらいや。。
取り敢えず。
上位フィルタとの接続された
フォーマットタイプ、
メディアタイプ、
メディアサブタイプ
をプロパティページで表示できる変換フィルタを作成できました。
フォーマットタイプが「VIDEO」だったら解像度とかフレームレートとか付加情報を
表示できるようにしてみるか。。
このフィルタ欲しい人いる?
まぁきっとだれかもっといいものを作っている人がいるかとは思うのですが
0359デフォルトの名無しさん
2007/03/27(火) 01:23:350360デフォルトの名無しさん
2007/03/27(火) 01:30:21人に使ってもらうには汚すぎなんで
(改造しながら他のフィルタのデバッグしてるんで・・・)
週末にでも機能を絞り込んで
見やすくしてみます。
終わったら、
h ttp://ragesakai.web.fc2.com/
にWebpageもってるんであげてみます。
0361デフォルトの名無しさん
2007/03/27(火) 11:29:140362デフォルトの名無しさん
2007/03/28(水) 07:41:45メディアタイプ一覧がわかるサイトさがさなきゃ
接続メディアタイプチェックフィルタでは、最悪知らないGUIDが出てきたら
そのまま貼っとくか…
0363デフォルトの名無しさん
2007/03/28(水) 21:21:390364デフォルトの名無しさん
2007/03/28(水) 21:41:530365デフォルトの名無しさん
2007/03/30(金) 01:03:46元AVI(640,480)でRECT(120,120,440,320)の範囲だけきりだして320x240のAVIにしたり
範囲を拡大して640x480にしたいんですが、サンプルグラバのコールバックつくって
中で処理しなきゃダメですかね?
0366デフォルトの名無しさん
2007/03/30(金) 08:24:20自分なら映像切り抜きフィルタを作って解決するけどフィルタグラフ側でもできるよ。
フィルタグラフ側でAVIの切り抜きを行った時のサンプルグラバの制御は凄く大変そう…ってか自分には無理なレベル
0367デフォルトの名無しさん
2007/03/30(金) 08:30:25グラバで取得した画像は元AVIと同じサイズなんね。なら出来…るかな?
だけどやっぱり、「切り抜き拡大縮小フィルタ」作るほうが簡単なのは間違いない。
0368デフォルトの名無しさん
2007/03/30(金) 20:49:08んで後ろにAviMux、FileWritterとつなげればよかよ。
0369365
2007/03/30(金) 21:25:10TransformFilterって、ベースクラスのライブラリから自分で作るフィルタですか?
最初から用意されててAddFilterで追加できるなら使ってみたいかも。
0370デフォルトの名無しさん
2007/03/30(金) 21:38:03んだよ自分で作るんだよ Transformメソッドで好きにいじってよし
んで後ろにAviMuxが繋がる時にね、ビデオの縦横サイズはオリジナルサイズじゃなくて
自分が変更するサイズを提示するったい Muxは提示されたサイズをヘッダ情報に
書いてた気がするばってん
0371デフォルトの名無しさん
2007/03/30(金) 22:23:31DirectShowの編集サービスっての使えますか?
0372デフォルトの名無しさん
2007/03/30(金) 22:37:06ちょっくらトランスフォームフィルタつくってみます。
コンプレッサの前にトランスフォームでサイズ変える処理いれてみます。
CreateDIBSectionでHBITMAPつくってストレッチビルドして試してみます。
0373デフォルトの名無しさん
2007/03/31(土) 00:03:12作り方は大正解◎。
コツを少々・・・
流す映像のサイズをかえちゃうと
設計が大変になるから
「切り出し」→「拡大」でもとのBMPサイズに合わせるようにすると
いいよ。
それとストレッチベルトを「CTransform::Transform」内でつかうんだけど
ストレッチベルトの関数1つで全体のCPU負荷が15%ぐらい上がってしまう。
もし気になるなら、画像処理ライブラリで置き換えするとよいよ
俺ここんとこ九州男児さんと考え方が似てる。。同じような職種&年齢なんだろうな。
0374デフォルトの名無しさん
2007/03/31(土) 00:27:00一応つっこんでおくけど、「ブリット」ですたい。
StretchBlt ストレッチブリット BitBlt ビットブリット
0375デフォルトの名無しさん
2007/03/31(土) 00:37:23ほへ〜。初めて知りました。
呼び方は「Blt」⇒「ベルト」と呼んでました。。
言い訳しまくると、自分組み込み系出身でwinアプリ作るの今年から初めた門で。
WinAPIを知らなさすぎる。。この機会に他の呼び方も覚えよう
今後直しますありり^^
そして、メディアタイプチェッカーも明日だらだらし終わったら修正に取り掛かるっす
0376デフォルトの名無しさん
2007/03/31(土) 00:42:28http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200508/05080002.txt
0377デフォルトの名無しさん
2007/03/31(土) 00:46:01なんか、映像のサイズ変えて保存したいって突然いわれたんで
変更しなきゃいかんのです。
切り出して切り出したサイズで保存なんですよ。
切り出して元の再隋拡大だったらサンプルグラバでおわったのに。
サンプルグラバでCreateDIBSectionかけてmediasampleからバッファとって
データ加工して代入。ここまでは出来てOKだった・・・
ストレッチビルトして正しく終わったのに・・orz...
0378デフォルトの名無しさん
2007/03/31(土) 01:09:59DirectX8からPresent()になったのはホント良かったと思うよ。
0379デフォルトの名無しさん
2007/03/31(土) 01:26:56ごめん。。
内容的には以前自分が作った「解像度リサイズフィルタ」
これの仕組みがまんまメインになってくるんだが
教えてあげられない。。
自分で調べてくれ。
0380デフォルトの名無しさん
2007/03/31(土) 01:57:15できたから問題無し。
0381デフォルトの名無しさん
2007/03/31(土) 02:28:31切り出しと拡大縮小ぐらい用意されてるような気がして探し回ってた時期があった。
0382デフォルトの名無しさん
2007/03/31(土) 16:37:52拡大、縮小にも色々なアルゴリズムがあるったい 自分の好きなようにつくるのが一番よかよ
どうせつくるならそのへんプロパティページで色々指定できるとうれしいね
0383デフォルトの名無しさん
2007/03/31(土) 22:24:58自分で調べれって話なら書く必要ないじゃん。
教えて上げられないレス増えるからネガティブさん消えてくれwwwwwwwwwww
0384デフォルトの名無しさん
2007/03/31(土) 23:03:57DirectShowやってる人の総人口が少ない。
そしてそれが理由なのかここのスレの回答側に立つ人も少ない。
このスレで役に立てばと思って結構回答をしているが、
何が難しいかわかるけど教えてあげられない状況だったので、
放置されるよりはいいと思って書き込みました。
(本スレ後半でageてるやつはほとんど自分)
>>383さんもそんなこと書き込んでないで回答側に回ってくれ
0385デフォルトの名無しさん
2007/04/01(日) 00:08:34その昔サンプルグラバを知らなかった自分は自前のフィルタ作っちゃったし、
話の流れで知ることもそれなりに多い・・・。かな?
0386デフォルトの名無しさん
2007/04/01(日) 03:12:34uuid.hではすべてのメディアタイプは乗ってない。
「MEDIASUBTYPE_I420」
が入っていなかった。
0387C++
2007/04/01(日) 08:46:540388デフォルトの名無しさん
2007/04/01(日) 13:44:39まずはDirectX SDKのindlude、DirectShowのBaseclasses ここのソースで定義されてるものを
押さえておけば良いんじゃないの?
極端な話、guidgen使って自分で独自のMediaType作れちゃうわけだし。
0389デフォルトの名無しさん
2007/04/01(日) 22:43:15DirectShowのオフィシャルな定義としてはMEDIASUBTYPE_IYUVじゃないのか。
0390デフォルトの名無しさん
2007/04/01(日) 23:22:10普通にMEDIASUBTYPE_I420という定義があるものと思い込み、
いざ実装してみたらものの見事に未定義だった、ということがあったなあ。
IYUVとI420は同じフォーマットのようなので、
私もMEDIASUBTYPE_IYUVを使ってますが・・・。
0391デフォルトの名無しさん
2007/04/02(月) 09:52:04やれやれ
0392デフォルトの名無しさん
2007/04/02(月) 11:49:43こういう動画処理インターフェースってプログラムとして人気ないのかな?
0393デフォルトの名無しさん
2007/04/02(月) 13:56:56漏れにはACLの方がワケワカメだよ。
0394デフォルトの名無しさん
2007/04/02(月) 14:27:52という事情もあるのではないか。
後は仕事になるかどうかとか。
0395デフォルトの名無しさん
2007/04/03(火) 20:48:20+ 三ミ |∧η∧
/⌒\ (,,・Д・)<ただいまんこ〜オレも便乗して質問だぞ。
+ 川川 l l/つ つ━☆ トランスフォーマーとかいうのをつかって
〜( / CTransformFilter::DecideBufferSizeここでメモリを確保する所までたどり着いたぞ。
(/"U 俺も拡大縮小をやりたくて書き込みするぞ。オマンコクロスだぞ。
C言語は7年目だぞ。切実だぞ。
0396デフォルトの名無しさん
2007/04/03(火) 22:27:40俺は3年目だけど苦労したができたぞ。
で、何がしりたいんだぼけぇ
0397デフォルトの名無しさん
2007/04/03(火) 22:32:34【いい例】
ぽまえら!おしえやがれぃい。
QVGAをVGAにリサイズしようと思うんだがDecideBufferSizeというめそで
115200byteしかとれねええんじゃUZEEEEEE!!
これを230400byteとれるようにする方法を教えやがれ
【悪い例】
いつも大変このスレッドを読ませていただき参考にさせてもらっております。
今回拡大縮小をやりたいのですがどのようにしたらいいかわかりません。
C++、MFCはできます。
また自分は過去XXXということをやっておりました。
大変恐縮ですがなにとぞご指導をよろしくお願いいたします
0398デフォルトの名無しさん
2007/04/03(火) 22:37:54×115200
○230400
×230400
○460800
用は質問の観点を絞り込んでくるかどうかの差だからな
0399デフォルトの名無しさん
2007/04/03(火) 23:59:22★ ∧η∧
\_(,,・Д・)<>>396 ポンドルウォーリアを特殊召喚する方法がしりたいぞ。
ヽ |フ ナニがしたいのか忘れたぞ!
/_ _| AVIを半分の解像度にして保存したいんだぞ!これが目的だぞ。
逆もあるぞ。オパンツ丸見え!
>>397 うんこちんこまんこ?キョカカカ!あばーあばばー!
参考にさせてもらったぞ。面倒だから、ゴゾブログで質問に答えてくれればそれでいいぞ。
オマンコクロッサー!
0400デフォルトの名無しさん
2007/04/04(水) 00:59:120401デフォルトの名無しさん
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で登録
0402デフォルトの名無しさん
2007/04/04(水) 01:52:350403デフォルトの名無しさん
2007/04/04(水) 08:59:19写真と引き換えならオニーサンがAVI半分にするフィルタ作ろう。(ただしソースはやれないがな)
0404デフォルトの名無しさん
2007/04/04(水) 14:50:040405デフォルトの名無しさん
2007/04/04(水) 16:48:36このムーンライトフィルタってさ、カメラがI420の時は接続すらしてくれないんだね。
解像度もメディアタイプも変更してくれるいいフィルタだと思ったんだけど残念
0407デフォルトの名無しさん
2007/04/04(水) 18:23:20です。
ちゃんと動きましたか?
バグを見つけたら速やかに報告よろ。
時間見つけ次第ちゃんとウェブページに反映しとくです。
感謝されるのに生き甲斐を感じた。ありり
0408デフォルトの名無しさん
2007/04/04(水) 19:27:31行うためGetCurrentSample()でサンプルを得ています。
サンプルの取得は成功しているのですが、このあとに再生するとDoRenderSample()が
呼ばれなくなって固まってしまいます。
どうしてでしょうか?
0409デフォルトの名無しさん
2007/04/04(水) 20:04:25Releaseし忘れっぽい
0410デフォルトの名無しさん
2007/04/04(水) 21:07:23★ ∧η∧
\_(,,・Д・)<ただいまんこ〜拡大縮小できたぞ。BokkingFilterの完成だぞ。
ヽ |フ ビデオのサイズが変わらなかったのはフィルタ接続後にサイズ変えてたからだぞ。
/_ _|
CheckTransformでサイズを変更したぞ。
変更したサイズからRGB24で必要なバッファサイズを計算して保存だぞ。
ストレエッチDIBitmapだぞ。それに対してソースからストレッチDIBitsして
完成したぞ。
そして完成した後に次の問題が出たぞ。
時間指定して3分の動画で1分目から2分目を抽出したいんだが
ControlStreamにS_OK帰ってきてもダメポだぞ。
AVI再圧縮で時間指定して抜き出すテクを知ってたら教えて欲しいぞ。オマンコクロスだぞ。切実だぞ。
0411デフォルトの名無しさん
2007/04/04(水) 21:12:04★ ∧η∧
\_(,,・Д・)<あと、AVI MuxフィルタをキャプチャグラバからFindInterフェラして
ヽ |フ IAMStreamControlを生み出してStartAtとStopAtする方法を作ったんだが
/_ _| ム圧縮AVIなら何とか成功してWMVとかコーデック使うと画像が表示されんぞ。
あと、保存してない間も無駄に待たされて酷い目にあったぞ。
誰かオレがナニをすべきか教えて欲しいぞ。
0412デフォルトの名無しさん
2007/04/04(水) 21:36:48⊂⊃
★ ∧η∧
\_(,,・Д・)<キャプチャビルダのコントロールストリームはこんな具合になってるぞ。
ヽ |フ オマンコクロスだぞ。ソースを持って変えれないので具体的に説明できんぞ。
/_ _|
0413408
2007/04/04(水) 22:46:10まさにそれでした。SDKのヘルプに書いてありましたね
0414デフォルトの名無しさん
2007/04/04(水) 23:23:04素直にこれ使えば?
http://www.microsoft.com/japan/msdn/directx/techart/cplusvbappdevs.aspx
http://www.microsoft.com/japan/msdn/directx/techart/wm_des.aspx
0415414
2007/04/04(水) 23:23:49http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdx8_c/ds/des/Oview/whatisDES.asp
0416デフォルトの名無しさん
2007/04/04(水) 23:35:12★ ∧η∧
\_(,,・Д・)<>>415 それも考えたんだぞ。大人の都合ってヤツでダメなんだぞ。
ヽ |フ くやしいぞ。オマンコクロスファイヤーハリケーンだぞ。
/_ _| 明日、ためしに作ってみるぞ。
0417デフォルトの名無しさん
2007/04/04(水) 23:45:110418359
2007/04/04(水) 23:57:28今のところ問題なさそうですよ。
ただ、スレの流れを見ると私以外で使ってみた人いないのかな?w
もう少し使ってみて気がついたことがあったら報告しますね。
0419デフォルトの名無しさん
2007/04/05(木) 00:03:51>私以外使ってる人いない…
(´・ω・`)ショボーン
0420デフォルトの名無しさん
2007/04/05(木) 21:34:17あと、××の製品かうと着いてくるフィルタは…とか語ろう
0421デフォルトの名無しさん
2007/04/06(金) 11:53:29・・・とはいえ、思いっきり過疎ってるスレだし>>419のニーズには合わんかな。
ところで質問です。
AddSourceFilterで追加したファイルソースの
出力ピンのメディアタイプを指定する方法はないでしょうか?
あるファイルを指定したとき、ただRender()しただけでは期待しているフィルタに
繋がらない(ファイルソースのメディアタイプがGUID_NULLになっている)ので
強制的に指定してみたいのですが・・・。
0422デフォルトの名無しさん
2007/04/06(金) 12:41:37質問は>>419に聞いてるのかな?
だったら応えます。
上流フィルタがカメラとかの入力デバイスの場合は「フィルタのピンプロパティ」から出力タイプを変更できるものがほとんどです。
仮に「動画」などのファイルであれば変換フィルタを噛ます事で変更は出来ますが新たに付けてやることは出来ません。
新規にフィルタを作成すればメディアタイプを付加しる物を作れるよ。
他の方法はわかりません
0423デフォルトの名無しさん
2007/04/06(金) 13:13:09> >>421=>>359さん??
うわー、なんで分かるの?w
> 新規にフィルタを作成すればメディアタイプを付加しる物を作れるよ。
> 他の方法はわかりません
やっぱりそれしかなさそうですね。
AsyncRdrサンプル辺りをベースに1つ作ってみます。
0424デフォルトの名無しさん
2007/04/07(土) 01:07:30★ ∧η∧
\_(,,・Д・)<無圧縮タイプのAVIなら時間切り出しできたぞ。
ヽ |フ ただ、無駄に時間がかかるぞ。切り出すまでフィルタにデータが流れて処理してるんだぞ。
/_ _| ポンドルウォーリア特殊召喚だぞ!ゴルァ!
0425デフォルトの名無しさん
2007/04/08(日) 10:32:36>速くなるらしい。なんかPresent(?)の戻りが早くなるとか言ってた。
これ本当?
0426デフォルトの名無しさん
2007/04/08(日) 11:42:57画面描写しないぶんタイムスタンプに忠実になるだけかと。。
>>424の話とは全然違う話
0427デフォルトの名無しさん
2007/04/08(日) 17:03:02プリロールかな?としても意味通じないし…
予測ツカナス
0428デフォルトの名無しさん
2007/04/08(日) 17:45:380429デフォルトの名無しさん
2007/04/09(月) 21:41:47プログラム動作としては、3つのmp3ファイルをタイマーで順繰りに再生するだけです。※1
この中でソースフィルタを変更してグラフを再構成する部分で分からない点があります。
流れ
1.新しいソースフィルタをグラフに追加する。
2.古いソースフィルタをグラフから削除する。
3.新しいソースフィルタの出力ピンからRenderする。
2の部分の詳細は以下のようになっています。
A.グラフ内のフィルタを列挙する。
B.列挙された全フィルタについて
a.一旦グラフから削除する
b.古いソースフィルタでなければグラフに追加する
疑問点
b.の部分がある意味がわかりません。自分としては、グラフ内の全フィルタを削除して、新しい
ソースフィルタを追加して、Renderすれば簡単に思えるんですが...
どうかよろしくお願いします。
※1 ソースはSDK_Path\Samples\C++\DirectShow\Players\BGMusicです。
0430デフォルトの名無しさん
2007/04/09(月) 22:16:140431デフォルトの名無しさん
2007/04/09(月) 23:29:52Render は重いから。
0432デフォルトの名無しさん
2007/04/10(火) 00:46:05★ ∧η∧
\_(,,・Д・)<>>429 サウンドってのは、レンドルァすると全部のcodecを試すんだぞ。
ヽ |フ だから、全て消して再構築すると連続再生とかできんぞ。
/_ _| アイマスの魔法をかけて!から、とかちつくちての連続技の間に途切れるって事だぞ。
0433デフォルトの名無しさん
2007/04/10(火) 01:13:25やべぇ見直した。。
0434デフォルトの名無しさん
2007/04/10(火) 01:55:46なるほど、それで以前使ったフィルタは残してたんですねφ
ところでその時、つながっていないフィルタがグラフ上に散在している状態ですよね。
その状態でRenderしたら、全Codecを試さず、散在しているフィルタを繋げてくれるんですか?
それともRenderを使わず、ピンを繋ぐ方法が別にあるのでしょうか?
この板のレベルに達するまで勉強して、出直してきます。(時間かかりそう...)
0435デフォルトの名無しさん
2007/04/10(火) 07:21:49★ ∧η∧
\_(,,・Д・)<>>434 朝勃ち中だが答えるぞ。
ヽ |フ レンダーすっと、フィルタが追加されている物から試すんだぞ。
/_ _| そのため、レンダーする前にvmr9のフィルタとかを入れておくとただのビデオレンダーじゃなくなったりするぞ。
だから、先に自分で作ったフィルタを入れておくと正しく繋がったりするぞ。
もちろん、Renderを使わずにグラフビルダのほうでConnectすることができるぞ。
IPinってのをフィルタから抜き出して接続できるみたいなんだぞ。
使った事無いからうまんちんまんだぞ。
0436デフォルトの名無しさん
2007/04/10(火) 07:39:07★ ∧η∧
\_(,,・Д・)<なんか、間違ってるかもしれんが許してほしいマンコ!んじゃ為替予想書いてくるぞ。
ヽ |フ
/_ _|
0437デフォルトの名無しさん
2007/04/10(火) 12:02:08今、DirectShowでUSBカメラからサンプルグラバでBMPをキャプチャするプログラムを作っています。
コールバックを使用してキャプチャをしようとしているのですが、
SetOneShotを使って1フレームだけキャプチャすることは出来ないのでしょうか?
ためしにSetOneShot(TRUE)としてみても、コールバックされ続けてしまいます。
0438デフォルトの名無しさん
2007/04/10(火) 17:56:39フィルタのGetMediaTypeでは、ピンによって2通りの設定が必要と思っています。
(オーディオの方の出力ピンからGetMediaTypeが呼ばれた場合はオーディオの値をセット、
ビデオの出力ピンからGetMediaTypeが呼ばれた場合はビデオの値をセットというように。)
しかし、GetMediaTypeでは、現在どちらの出力ピンから呼ばれているのか判別できないのですが、
どうしたら良いでしょうか。
出力ピンのクラスは同じものを使っているのですが、オーディオ用のピンクラス、ビデオ用の
ピンクラスと別に作成しなければならないのでしょうか?
0439デフォルトの名無しさん
2007/04/10(火) 19:30:13自分がどっちのピンかを区別して処理を変えればいいじゃん。
0440デフォルトの名無しさん
2007/04/10(火) 21:10:34★ ∧η∧
\_(,,・Д・)<>>437 ただいまんこー!ドピュンコしたあとに、コールバックを外せばOKだぞ。
ヽ |フ コールバックをセットしたままだと永遠にデータが流れるぞ。
/_ _| オレだったらSampleCBのあるクラスに BOOL m_Ochinpoいれて
データを流したくない時はfalseいれて SampleCBのなかでreturn S_OKしちゃうぞ。
オマンコクロッサー!
0441デフォルトの名無しさん
2007/04/10(火) 21:13:06★ ∧η∧
\_(,,・Д・)<>>438 IPin淫乱フェラにあるQueryPinInfoで解決できる気もするぞ。
ヽ |フ 俺も調べないと分らんぞ。スマソだぞ。力になれんぞ。
/_ _|
0442デフォルトの名無しさん
2007/04/10(火) 22:06:540443デフォルトの名無しさん
2007/04/11(水) 00:10:36フィルタ内部の話だからQueryはちがうとおもうぞ。
自分も>>439の意見に賛成です。
�@純粋仮想メソッドGetPinを実装してピン番号を取得
�AGetMediaTypeにてまず�@を呼び出す。
�Bピン番号が「1」ならビデオだから・・・メディアタイプ「Video」を要求
�Cピン番号が「2」ならAudioだから・・・・メディアタイプ「PCMAudio」を要求
iPositionにて要求するものをそれぞれ数個書いてやればいいかな。。
0444デフォルトの名無しさん
2007/04/11(水) 00:49:17★ ∧η∧
\_(,,・Д・)<>>443 オレはトランスフォーマーフィルタで1対1の戦いしかやったこと無かったぞ。
ヽ |フ これでピンが複数あるフィルタも手だせそうだぞ。
/_ _|
0445デフォルトの名無しさん
2007/04/11(水) 00:50:19コンボイの謎を2週くらいクリアしとけ
0446438
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はフィルタ作成時に作られます。
どうしたらよいですかね…
0447デフォルトの名無しさん
2007/04/11(水) 14:59:29if (pOutputAudio == this) {
//オーディオピンの処理
} else {
//それ以外
}
0448448
2007/04/11(水) 17:09:38参考にします。
フィルタの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を見て、
オーディオ、ビデオの設定をするようにしました。
一応接続はこれで上手くいきました。何かとても簡単な質問をしてしまった気がしますが…
0449デフォルトの名無しさん
2007/04/18(水) 22:36:27時速80km/hで走る車が1時間何キロ走る?
・・・ポカーン
0450デフォルトの名無しさん
2007/04/19(木) 00:29:28★ ∧η∧
\_(,,・Д・)<1500円の2割引きは計算不能だぞ。俺の脳が再起不能(リタイア)したぞ。
ヽ |フ 時速80kmでオレは走れないので1時間も車を見張れないぞ!
/_ _| 果てしなく遠くが答えだぞ。
0451デフォルトの名無しさん
2007/04/19(木) 06:23:08Webカメラで取った映像を扱いたいので、SDKにあるAMCapを参考に機能を探しているのですが
キャプチャした動画をaviではなくmpeg1等で圧縮して吐き出したいのですが
フィルタを何処の関数で挟めばよいのでしょう。
あと、映像のガンマや彩度等がプロパティで調整できてしまいますが、これはなんのフィルタを使用しているのでしょうか?
初心者質問すいません。
0452デフォルトの名無しさん
2007/04/19(木) 07:35:23プロパティはソース見りゃわかるんじゃない。
以下推測
色調節のフィルタが存在するのではなくて
キャプチャデバイスやそのピンのプロパティじゃないのか。
Webカメラのデバイスドライバが変わればその機能も変わる。
MPEG-1エンコーダって標準装備か?
俺持ってない。存在しないフィルターは使えんよな。
0453デフォルトの名無しさん
2007/04/19(木) 07:54:41沖縄県での選挙ですが、どうか民主党だけは避けてください。県民の生命に関わる可能性があります。
民主党の最大の公約は一国二制度(※)ですが、一度「一国二制度 沖縄」等で検索をお願いします。
この際、民主党のHPで調べても良いです。以下の注釈↓と矛盾することは書いてないはずですから…
※一国二制度
簡単に言えば沖縄を中国と日本の共有物にし、そこに3000万人の中国人を入植させます。
(つまり沖縄人口の 96% を中国人にして、実質、沖縄を中国人の居住地とします。)
さらに「自主」の名の下、沖縄で有事が起きても自衛隊は干渉できません。
3000万人の中国人が、少数派となった130万人の日本人に何をしても、です。
そして中国人の反日感情の強さは、ほとんどの日本人の理解を超えるものです。
今回の選挙で民主党が勝った場合、「自主」「発展」を連呼しつつ段階的に進めていくことになります。
自主と言っても、自主を認めるのが「住人の96%が中国人となった」後だということに気をつけてください。
発展と言っても、新沖縄の少数派となった「少数民族日本人」の発展ではないことに気をつけてください。
0454451
2007/04/19(木) 14:09:38えっと、回答ありがとうございます。
トライ&エラーしながら死んでおります。
>色調節のフィルタが存在するのではなくて
>キャプチャデバイスやそのピンのプロパティじゃないのか。
...確かに、自宅で違うWebカメラで試したときは、設定ダイアログの内容がぜんぜん違っていましたね。
>MPEG-1エンコーダって標準装備か?
もう一度探しなおしたデコーダーだけで、エンコーダーはありませんでした。死んできます。
aviだと保存するにも重いから、実用的なサイズに直して自動保存しておいてって言われたんですが、asfかモーションJPEGかDVか、しか使えないのかな?
まぁ、いくらか頑張ってみます。
0455デフォルトの名無しさん
2007/04/19(木) 21:04:090456デフォルトの名無しさん
2007/04/19(木) 23:22:24GRAPHEDTがあれば買わなくてもいいな俺は。
>>454
MPEG4のコーディック2なら標準装備であるよ。
GraphEdtで↓な構成を書いてみるよろし
「WebCam」→「MPG4Codec2」→「AUXMix」→「FileWriter」
んで「WebCam」のPinプロパティを開いてみる
自分の思った通りに出来る場合
⇒そのままコーディング
自分の思った通り出来ない場合
⇒出来る方法を模索
をやっといた方がはやい
0457454
2007/04/20(金) 10:39:55一応あの後がんばった結果、DV形式とモーションjpegでは圧縮に成功しました
「うーん、なんかサイズ大きいね。asfで圧縮できない?」
といわれたわけで、メディアフォーマットSDKを読んで泣いています。
小さければ文句言われないのでmpeg4の方が楽かもしれません。
なんか進歩日記みたいになってすいませんが...。
0458デフォルトの名無しさん
2007/04/20(金) 20:55:50御礼を言うのは大変素晴らしいが、どこまで書いたことを理解できたのか
解るように(回答が的外れでなかったか知りたい)
内容についても一言触れて欲しかったな
と、会社では立場が最下層回答者の愚痴。
0459デフォルトの名無しさん
2007/04/20(金) 21:39:00飯食うので、この辺で。
0460デフォルトの名無しさん
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での圧縮を模索したのですが、なかなか動くコードにならないで今日が過ぎていきました
0461デフォルトの名無しさん
2007/04/20(金) 22:51:49ふむ。成る程。
GraphEdtでのフィルタ登録の操作の仕方なのかそれをコーティングするときの方法なのかわからんです。
Clsid(クラスIDの事ね)がわからないと言ってるから↓↓がわからんのでは??
>自分の思った通りに出来る場合 ⇒そのままコーディング
ClsidはGraphedtでフィルタ登録する時に表示されてるよ。
それとも「Graphedt.exe」のアプリを「フィルタグラフ」(コーティング上の概念)と勘違いしてるのかなぁ…
0462デフォルトの名無しさん
2007/04/20(金) 23:07:45圧縮コーデックの列挙が必要なavi再圧縮に比べたらよっぽど簡単だよ。
0463460
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の、 {ランダムな文字} の間の部分って事ですね。
多分理解しました。
0464デフォルトの名無しさん
2007/04/21(土) 12:37:040465デフォルトの名無しさん
2007/04/21(土) 13:49:11ちゃんとMSDNでリファレンス見てから書いたほうがいいよ。
CoCreateInstanceでCLSID_WMAsfWriter作らなくても
SetOutputFileNameが作ってpAsfFilterに入れてくれる。
http://msdn2.microsoft.com/en-us/library/ms779904.aspx
http://msdn2.microsoft.com/en-us/library/ms784861.aspx
0466460
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つのフィルタがちょっと見たりませんので上の様に逃げています(汗
探し方が足りないのかな?
とりあえず、相手に見せてみます。ありがとうございました。
まだ格闘しなければいけないところがあるので、ほとほと困ったらまた来るかもしれません。
0467デフォルトの名無しさん
2007/04/25(水) 16:01:46スプリッタの2つの出力ピンからデータを出力するようにしました。
が、再生すると何も表示されません(音も映像も)。
一方の出力ピンだけ接続し、もう一方の出力ピンは未接続の状態にすると再生はできます。
しかし、オーディオ、ビデオ両方を同時に再生しようとすると、どちらも
再生されなくなります。
原因は何が考えられるでしょうか。
0468デフォルトの名無しさん
2007/04/25(水) 16:15:00各ピン(のインタフェイス)は別々のスレッドから呼ばれる可能性があることを
ちゃんと考慮した作りになっているか、デッドロック等はないか、など考えてみるべき。
あと「再生されません」ではなく、グラフのステートが再生状態になるのかならないのか、
なる場合には停止で止まるのか止まらないのかなど、プログラマらしい情報の出し方を
0469467
2007/04/25(水) 19:34:56もともと1つの出力ピンのソースに、無理やりもう1つの出力ピンを
追加したのが問題かもしれません。
基本的にm_pOutput(元々あった出力ピン)が出てくるところに、
もう1つのピンの処理を追加したような感じです。
>あと「再生されません」ではなく、グラフのステートが再生状態になるのかならないのか、
>なる場合には停止で止まるのか止まらないのかなど、プログラマらしい情報の出し方を
すみません、情報不足でした。GraphEditで確認しているのですが、
再生ボタンを押した後、再生状態にはなっているようです。
しかし、停止ボタンを押すとフリーズし,
The graph was unable to complete pause within 10 seconds.〜
という警告がでる状況です。
0470デフォルトの名無しさん
2007/04/25(水) 19:37:182つある場合はそれぞれ別のスレッドで動く必要がありますが、
そのあたりは問題ありませんか?
0471467
2007/04/25(水) 20:27:13deliverは使ってませんが、内容は一緒です。
プッシュ型です。
具体的にはフィルタの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つのスレッドで動かしているような気がします。
スレッドを別々に持つとは、オーディオピンがストップしたとしても、
ビデオピンは関係なく出力できる、みたいな感じですよね。
どう実装すればいいのか…
0472デフォルトの名無しさん
2007/04/25(水) 21:15:13オーディオレンダラにつながっているピンにもデータが来なくなるので、
時間が進まなくなって永遠にブロックするという動作。
出力ピンをCSourceStream から派生させて実装するのが base classes 的には常道。
パースしたビデオ、オーディオのデータをそれぞれのピンの中の Queue (自分で作ること)
に入れておいて、FillBuffer で Queue にあるデータをもとにメディアサンプルを作る。
個人的にはスプリッタを作るなら、ソースフィルタのサンプルコードをもとにして
出力ピンと入力ピンを追加するのが簡単だと思う。
0473デフォルトの名無しさん
2007/05/08(火) 16:19:57ビットマップを入れ、音声もゲームのカメラ位置に従って右の方にあれば
右寄りの位置から聞こえてくるようにしたいのですが、
とりあえず入門にあるようなSampleGrabberを使う方法ではなく
RendererFilterを継承するのが正解なのだろう、というところまでは
わかったのですが、フィルタを継承して自前で書くのにstreams.hとやらが
ありませんでした。Windows2000ではWindowsSDKがインストールできないので
迂回策を探しています(ちょっと前のPlatformSDKには入ってませんでした・・)。
Windows2000上でフィルタを継承するようなコードを書いてる方は、
どのようにやっているのでしょうか?
他にも「別にRendererFilterを継承しなくてももっといいやり方がある」とか
ツッコミがあればお願いします。
0474473
2007/05/08(火) 16:25:19ついでに訂正・・・
×streams.hとやらがありませんでした。
○streams.hとやらが必要みたいですが、ありませんでした。
何がやりたいかわかりやすく書くと、
ゲームの中のテレビに任意の動画を流したい、ということです。
0475デフォルトの名無しさん
2007/05/08(火) 18:11:28D3Dのテクスチャに動画をレンダリングするのは、
SDKのサンプルにそのものずばりのがある。
DirectShow 関連のSDK が利用できないのであれば、
動画ファイルをWMVなりAVIで用意して、AVI関連APIや
Windows Media Format SDKでデコードすれば良いと思う。
0476473
2007/05/08(火) 18:42:40>WMVなりAVIで用意して、AVI関連APIやWindows Media Format SDKでデコード
なるほど!動画関連のAPIに詳しくなかったので盲点でした。
その辺はこれから調べようと思うんですが、一つ質問させてください。
>SDKのサンプルにそのものずばりのがある。
これなんですが、WindowsSDKのことでしょうか?
最初DirectXSDKのサンプルかと思ったのですが見当たらなかったので・・・
0477デフォルトの名無しさん
2007/05/08(火) 19:01:25そうです。
Windows 2000 だと Windows server 2003 SP1 Platform SDK を利用することになります。
SDK の導入あたりから書かれたページを見つけたので読んでみてはいかがでしょうか。
ttp://www.shader.jp/xoops/html/modules/xfsection/article.php?articleid=17
0478デフォルトの名無しさん
2007/05/10(木) 01:38:59VMR9を使って動画の再生を行おうとしているのですが、動画の
元サイズとアスペクト比を取得しようと
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を使わざるを得ないのですが・・・
0479デフォルトの名無しさん
2007/05/16(水) 14:14:00Webカメラから取った動画を保存できるようにプログラムを書いたのですが、そこまで完成したのを見せたところ。
「こんどはコレ再生して、再生時間を表示できるようにできないかな?」
と言われてしまいましたが、正直何を使って実現すれば良いかどうかから思い当たるところがありません。
そのインターフェースを使えばよいかどうかだけでも、教えていただけないでしょうか…。
IAMDroppedFramesあたりかな、とも思ったのですがいまいち思ったように動いてくれていません。
0480479
2007/05/16(水) 14:43:41先ほど、話をしなおしたのですが。私の勘違いがあって。
「Webカメラから取った動画」に「現在の時間」を残せないか?という要求でした。
具体的には動画の何処かの隅っこに、現在時間を画像として書き込んでしまうようなものを想像していたみたいです。
質問するのではなく、自前でフィルタを書くべきみたいですね。すいませんでした。
0481デフォルトの名無しさん
2007/05/16(水) 17:19:42誤差が33ms以内とか
0482デフォルトの名無しさん
2007/05/17(木) 00:56:53単に秒まで出すだけならたやすい。
インプレイスフィルタが1番楽。次点は資料がたくさんあるトランスフォームフィルタ。
1・TranceFormメソッドをオーバーライド
2・IMediaSampleからDIBポインタをとる
3・DIB→デバイスコンテキストに変換
4・WinAPIのTextOutで文字書く
5・デバイスコンテキスト→DIB変換
たったこれだけでおk
0483460
2007/05/20(日) 19:49:18結構頑張ったけど、2,3のステップの所のコードが作れません。
0484デフォルトの名無しさん
2007/05/21(月) 05:05:45厳密なアルファブレンドだと処理が重いから、切り抜き程度でいいと思う。
0485デフォルトの名無しさん
2007/05/21(月) 08:39:410486デフォルトの名無しさん
2007/05/21(月) 15:14:30客の要求仕様に基づいてプログラムを作ってるならしようがないけど、もしかすると
「>>460 が作業する工数 >>>>>>> 撮影時に時計を一緒に写す手間」じゃないか?
もしそうなら道楽で予算を無駄遣いしてることになるから、正直適当なとこでやめて
本業に精を出した方がいいような気がする・・・
0487483
2007/05/21(月) 17:40:41>>484
うん、最初にそんな感じのことを思いついて、ドット絵の様な汚い文字を無理やり表示させてみました。
どうしても気持ち悪いので、なんとかしたいですが、後回しかも…。
>>484
ヒントありがとうございます。
後日完成を目指すです。
0488デフォルトの名無しさん
2007/05/21(月) 21:30:57ィルタを使用すると強制終了が起こってしまいます。
コンパイルエラーは出ません。
デバッグモードでビルドした場合は、問題は起こりません。
強制終了が起こる場所は、おそらくmallocをしているところだと思います。
正確にはmallocを使用している関数で落ちるのですが、その関数の内部は見えま
せん。
デバッグとリリースで、mallocが使えないことってあるのでしょうか。
0489デフォルトの名無しさん
2007/05/21(月) 21:47:43ありません。
0490デフォルトの名無しさん
2007/05/22(火) 03:24:020491488
2007/05/23(水) 00:27:49どうもありがとうございました。
0492デフォルトの名無しさん
2007/05/23(水) 08:32:54フィルタを作るのが最善の解決方法かどうかまだ悩んでいるようだけど自分はそれが1番楽な方法だと思う。
俺はヒントというかフィルタの作り方手順を書いたものだが、手順2、3のどこがわからんのか明確化してくれ。
手順3については>>485で調べられると思うけど
0493483
2007/05/24(木) 10:22:39どうも、お手間をおかけして申し訳ありません。
インプレイスフィルタということで、SDKサンプルのEZrgb24を基本に作っておりました。
フィルタのTansform関数で、引数としてIMediaSampleを受けりますが
これを
・DIB形式に変換
・それをデバイスコンテキストの代入
のところで躓いておりました。
一応やっつけ実装で納得はしてもらったのですが、自分で恥ずかしいので、後で直したいというのが正直なところです。
若輩者で申し訳ありません。
0494デフォルトの名無しさん
2007/05/24(木) 21:37:23それすら今は体力的に自信ない
0495デフォルトの名無しさん
2007/05/25(金) 02:39:17EZrgb24ってさインプレイスフィルタじゃないお( ・ω・)∩
違いはね。何のフィルタクラスを継承してるかで決まるんだ
ちなみに「EZrgb24」は「CTransformFilter」を継承してるお
0496デフォルトの名無しさん
2007/05/25(金) 03:59:410497デフォルトの名無しさん
2007/05/25(金) 08:12:46座標原点の話しかな。DIBは他画像形式に比べると上下逆さまだけど、変換時にY座標をマイナス値を指定すればどうとでもなる
0498デフォルトの名無しさん
2007/05/25(金) 08:34:21ボトルアップは飲み終わったボトルを投げ上げるという意味だな
0499デフォルトの名無しさん
2007/05/25(金) 18:04:09で、、意地悪しないでDIBのボトムアップを教えてくれ
0500デフォルトの名無しさん
2007/05/25(金) 23:13:53つーかキーワードがこれだけでてんのに自力で検索くらいしようとは思わんのかね
0501デフォルトの名無しさん
2007/05/25(金) 23:26:220502デフォルトの名無しさん
2007/05/26(土) 12:58:18IGraphBuilder::AddSourceFilterを使ってもデフォルトのソースフィルタが呼ばれるし、
普通のフィルタ同様に、
CoCreateInstance&AddFilterすると、ソースフィルタに読み込むファイル名が指定できません。
0503デフォルトの名無しさん
2007/05/26(土) 20:01:49>>496の聞きたいことの意味がわからんかっただけで
俺は知ってるからおk。
今日はPCだからしらべてみたけど、ボトムアップという表現
はあんまり使われてないぞ??
■Google調べ 「DIB ボトムアップ」検索結果
っミ【114件】
0504デフォルトの名無しさん
2007/05/26(土) 20:27:02トップダウンとボトムアップの、メモリ上のピクセルの並びの違いについてごくごく簡単に説明している
Top-Down vs. Bottom-Up DIBs
ttp://msdn2.microsoft.com/en-us/library/ms787796.aspx
サンプル画像のセンスの無さには相変わらず笑わせてくれる。
0505デフォルトの名無しさん
2007/05/26(土) 21:27:48今後使っていくよ。
まぁBITMAPの仕様の話であって
あんまりDirectShowとは関係ないとこで使うことになりそうだけど
0506デフォルトの名無しさん
2007/05/26(土) 21:32:32ごめんボトムアップに気を取られていた
自作フィルタを登録する方法はコマンドラインから
「regsvr32 ぱす&自作フィルタ.ax」でレジストリ登録が必要です。
その後「Graphedt」でフィルタグラフに登録できることを確認するんだよ
それでもできなかったらまた質問しましょう
0507502
2007/05/27(日) 02:21:11すいません、説明不足でしたが、レジストリ登録、GraphEditでの確認は出来ています。
ただアプリケーションから自作ソースフィルタを使ってファイルを読み込む方法がわかりません。
GraphEditで追加したときは、読み込むファイルを聞いてくるのですが、アプリからソースフィルタを追加しても、ファイルを聞いてこないのです。
0508デフォルトの名無しさん
2007/05/27(日) 04:22:30窓枠の提供はどこがやるの?って事だと認識しました。
自作ソースフィルタを「GraphEdit」で開いた場合、
ファイル選択ウィンドウはディスクトップ画面のド真ん中に出ますか?
もし真ん中に出ない場合、「hWnd」をデスクトップから取っていないことになります。
アプリケーションから渡してやる(=ファイル選択ウィンドウを作って選択結果をフィルタに渡すような設計)
にしてやる必要があるかと思います。
自作ソースフィルタのファイル選択ダイアログを出す部分のソースを晒せば解決できると思いますよ
0509デフォルトの名無しさん
2007/05/27(日) 04:26:48AddFilterした後でそれを呼び出して(QueryInterface)、Loadメソッドを
実行してやるんだよ。
でも、そんな基本的な所でつまずいてるのにソースフィルタ自作とかよく出来たな。
0510デフォルトの名無しさん
2007/05/27(日) 12:31:490512デフォルトの名無しさん
2007/05/28(月) 18:24:46いまのところ、ファイルごとに構築した再生用のフィルタグラフから静止画を取り込みまくって
録画用のフィルタグラフに流し込むやり方を考えているのですが、
こういうバカっぽいやりかたでなく、もっとエレガントな方法はないもんでしょうか。
0513デフォルトの名無しさん
2007/05/28(月) 23:44:50IGraphBuilder
IMediaControl
IMediaEventEx
IVideoWindow
IBasicVideo
ビデオ再生自体は問題ないのですが、サウンドデバイスが複数
あった場合に、音声の出力先を指定するにはどうしたら良いで
しょうか?
現状、Windowsの標準のサウンドデバイスのみ音が出ます。
よろしくお願い致します。
0514デフォルトの名無しさん
2007/05/29(火) 00:38:220515デフォルトの名無しさん
2007/05/29(火) 03:07:01まじっすかあああ?
DirectShowって使えねーなぁ!!
ゴミじゃん。M$てめえやる気あんのか?殺すぞ
0516デフォルトの名無しさん
2007/05/29(火) 06:00:31真偽の程が全く不明な一文にそこまで熱くなれるのもすげえな
0517473
2007/05/29(火) 14:57:28少しずつやっていたんですが、出来ました。
教えていただいた
ttp://www.shader.jp/xoops/html/modules/xfsection/article.php?articleid=17
↑ここと、あとはここのサンプルソース↓
ttp://www.greenwood.co.jp/~k-aki/article/directshow_movie/directshow_movie.html
を見ながらやって作れました。
(下のURLのサンプルソースは、多分GraphEditで使えるようなDLLとして作るものではなく、
ほぼCBaseRendererを継承してメソッド書いてるだけだったのでわかりやすかったです)
色々ありがとうございました。次は音を取得するのに挑戦しまつ ヽ( `・ω・)ノ
0518デフォルトの名無しさん
2007/06/01(金) 16:33:460519デフォルトの名無しさん
2007/06/01(金) 17:49:21エンコードパラメータの設定がうまくできません。
IAMVfwCompressDialogsで出したダイアログだと、変更が反映されないし。
かといってWMV9フィルタの出力ピンからIAMStreamConfigをqueryしてGetFormatするとエラーになります。
AviUtilだとうまくやっているみたいなんですが、やり方が間違ってるんでしょうか・・・
0520デフォルトの名無しさん
2007/06/10(日) 04:56:19/:::::::::::::`ヽ_ _
n /::::::::::::::::::::::::::l l L_
,─' ヽ_ _|::::::::::::::::::::::::/) / _彡__
三_ ヽ、 l/::::::::::::::::::::::::ヽ / ∠, - 、:::::::\
`丶、 `/::::ノT` ^ 'l´l:::::|´ /(・|・)) |::::::::::::ヽ
`ヽW ̄  ̄W /ヽ、_●_/ \::::::::l
`1 l ヽ /'´`\_|__三、ヽ::::|
l / / | __ | l:::l
l |__\( ヽ-'"´) //:/
/ , |::::::::::ヽニ二二ニ_∠_'/__
| l /つ 、/(〒) ヽ::::::::::::::::::
0521デフォルトの名無しさん
2007/06/10(日) 23:23:28この↓を参考にしてMFCで動画再生アプリを作っているのですが、
ttp://www.geekpage.jp/programming/directshow/setnotifywindow.php
DirectShowで動画再生しているウインドウが、別のウインドウの陰に隠れてから
手前に表示されたときなどに再描画されません。
再描画するにはどうすればいいですか?
0522デフォルトの名無しさん
2007/06/10(日) 23:34:500523デフォルトの名無しさん
2007/06/10(日) 23:50:53できました。ありがとうございます
0524デフォルトの名無しさん
2007/06/11(月) 22:13:250525デフォルトの名無しさん
2007/06/11(月) 22:36:290526デフォルトの名無しさん
2007/06/11(月) 22:43:540527デフォルトの名無しさん
2007/06/12(火) 07:31:58スマンむしゃくしゃしてやった。
今は反省してる
0528デフォルトの名無しさん
2007/06/12(火) 10:11:140529デフォルトの名無しさん
2007/06/12(火) 21:39:31原作も途中からアニメに合わせて「しずかちゃん」になってる。
最近にふにふ動画やようつべを見てるんだけどフレームレート変更フィルタ作れば「速聞」みたいなサービス作れるかな
0530デフォルトの名無しさん
2007/06/12(火) 21:49:48いつの人間だよ
0531デフォルトの名無しさん
2007/06/14(木) 01:02:27::::::::::::::::::::::::::::: ,.-ヽ
:::::::::::::::::::::: ____,;' ,;- i へ、 /;へ\
:::::::::::::::::: ,;;'" i i ・i; // _l::|___l::|_ヽ:ヽ
::::::::::::::: ,;'":;;,,,,,, ;!, `'''i; / ̄ ̄ ̄ ̄\,, |l/−、 −、:::::::::::::::`::|
::::::::::: ,/'" '''',,,,''''--i / __ヽ /::::::| ・|・ | 、::::::::::::::\
::::::::: ;/ .,,,,,,,,,,,,,,,,, ;i'⌒i; | | |、 /::/ `-●−′ \:::::::::::ヽ
::::::: i;" ___,,,,,,, `i". | ∩─| | ,|/ ── | ── ヽ:::::::::|
::::::: i; ,,;'""" `';,,, "`i; | ∪ `l |. ── | ── .|::::::::|
::::::: | ''''''i ,,,,,,,,,, `'--''''" ヽ __/ _.ノ | ── | ── |:::::_l__
::::::: |. i'" "; |――― 、". ヽ (__|____ /::::| 新 |
::::::: |; `-、.,;''" /  ̄ ̄ ̄ ̄^ヽ∞=、 \ /:::,/| 品 |
:::::::: i; `'-----j | | | |っ:::::) l━━(t)━━━━┥ |___|
0532デフォルトの名無しさん
2007/06/16(土) 00:31:230533デフォルトの名無しさん
2007/06/16(土) 06:58:35C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Bin\graphedt.exe
0534デフォルトの名無しさん
2007/06/16(土) 14:14:45フレームレートを一定にするフィルタを作った人いる?
0535デフォルトの名無しさん
2007/06/16(土) 15:54:38あ、あった。さんきゅー
スタートメニューにショートカット作ってよねー
0536デフォルトの名無しさん
2007/06/16(土) 16:27:000537デフォルトの名無しさん
2007/06/17(日) 00:43:24うん。そのカメラの最低露光付近で以下を調べる
「カメラ」-「レンダラ」
の接続で「レンダラ」のプロパティ「品質」タブ
平均フレーム率が明るさで変化するのがわかるよ
0538デフォルトの名無しさん
2007/06/17(日) 00:51:45我々はエスパーじゃないんでね
0539デフォルトの名無しさん
2007/06/17(日) 02:49:07っていうか安物のカメラは結構フレームレートいい加減だったりする
0540デフォルトの名無しさん
2007/06/17(日) 02:58:43「そのカメラ」ってどのカメラよ?
0541デフォルトの名無しさん
2007/06/17(日) 03:47:550542デフォルトの名無しさん
2007/06/17(日) 08:57:09だとしたらあれはソースそのもののフレームレートではないよ?
俺ならよくわからん糞カメラだけのためのフィルタなど作る気にはなれないな
0543デフォルトの名無しさん
2007/06/17(日) 16:58:490544デフォルトの名無しさん
2007/06/17(日) 17:22:39ところでソースそのもののフレームレートじゃないっていうのはどういうこと?
レンダラが捨てるって事?
0545デフォルトの名無しさん
2007/06/17(日) 18:00:33まじで?たのむ っ�I
>>544
ソースフィルタが一定間隔に絵を出してこなくなるということだよ
レンダラが捨てるわけではないみたい
0546デフォルトの名無しさん
2007/06/17(日) 18:32:00>ソースフィルタが一定間隔に絵を出してこなくなるということだよ
>レンダラが捨てるわけではないみたい
つまりソースフィルタが実際に出力しているフレームレートだよね。
それが明るさで変動するね、って話だったと思うんだけど。
0547デフォルトの名無しさん
2007/06/17(日) 19:12:30うん。その話です。
私は「フレームレートを一定にするフィルタを作った人はいますか?」
という質問をした者なんですが、
暗いときに光を映す場合、フィルムに光を取り込む時間を長めに
取ってやる必要があります。ちゃんとした画像を取り込むのと
シャッタースピードはトレードオフ関係になるのかと思います。
一般的なカメラは上記を自動で行っているので周囲の明るさが変化すると
フレームレートがころころ変わっていく・・・と思っています。
これを時系列処理が必要なフィルタに通した場合問題がおきるので、
フレームレートを一定にするフィルタが必要なのでは?と考えています
どなたか作成した人はいらっしゃいませんか?
0548デフォルトの名無しさん
2007/06/17(日) 19:21:29メディアタイプとしてののフレームレートってことだとおもう。
レンダラのレートはレンダラが表示できてるレートってことじゃね?
デコーダがうんこだったりPCすぺっくがうんこだと激低かと
0549デフォルトの名無しさん
2007/06/17(日) 19:26:05記録するフォーマットは何よ?グラフ構成は?DirectShow経験有り?
出すべき情報が出てない感じ。
0550デフォルトの名無しさん
2007/06/17(日) 19:36:52カメラ・・・USBカメラ(Qcam)を想定していただければいいです
記録フォーマット・・・なし。記録してもしなくてもよし。
グラフ構成・・・ソースフィルタのみ。
ただ、見るために「ソース」-「レンダラ」でお願いします
Directshow経験・・・およそ3ヶ月。画像関係の変換フィルタ作成ならわかるくらい
>>548
PCスペックが悪くてフレーム落ちすることはこの際無いという前提でお願いします
>>538->>548
「ソースフィルタのフレームレートが外光によって変化すること」
に話の争点がいっていますが、できれば
「フレームレートを一定にする変換フィルタ」についての事を話したいです。
0551デフォルトの名無しさん
2007/06/17(日) 19:48:10本来なら正しいレートでがんばって出すべきだと思う(この辺はMSがどう設計しているのかによるが。)
で、そのメーカのソースフィルタがそう実装されてないから後ろでなんとかしましょう、ってことですね?
(Qcamって路地クールのやつでしょ。あれはなんかキャプチャした絵を解析しているっぽいから感光待ちじゃないような希ガス)
どっちかっていうとそのカメラのソースフィルタの性能の問題、あるいはバグに近いので
そもそも、それを正しくするフィルタの需要って無い気がする
自分もそういうフィルタはしらない。
でも一般化して「レートを一定にする中間フィルタ」という意味では需要もあるかもしれないね。
0552デフォルトの名無しさん
2007/06/17(日) 19:51:12グラフ構成ソースフィルタのみ??ダウンストリームが無いのに変換フィルタ??
うーん 何がしたいのかますますわかんねーな…
[ソース]-[レンダラ]はダイレクトで繋がるの?メディアタイプはRGB?
本来期待されるべきフレームレートはいくつですか?
ソースが吐き出すタイムスタンプ確認してみた?てんでバラバラの間隔だったのかな
0553デフォルトの名無しさん
2007/06/17(日) 20:24:27ご回答ありがとうございます。
「タイムスタンプにて・・・の件」
DirectShowのフィルタ同士の動きはイベントドリブンです。
なので、スレッドを立てて別レートで処理するシステムを考えました
>「ソースフィルタ」-ここ6fps-「レート安定フィルタ」-ここ15fps-〜
私のコーディング技術の問題でレート安定フィルタ以降のアロケータを6fps以上で
使うとロックしてしまいうまくいきません。
>[ソース]-[レンダラ]はダイレクトで繋がるの?
繋がりますが私の想定する使い方とは若干違います。
カメラのフレームレートを争点にしていたのでこれを出しました。
本来使いたいのは
「ソース」-「時系列処理が必要なフィルタ」-「レンダラ」
です。
>メディアタイプはRGB?
なんでもいいです。私の作ったフィルタは「RGB24」「RGB555」「RGB565」「IYUV」
「I420」のいづれかを想定して設計しております。
>本来期待されるべきフレームレートはいくつですか?
固定されていれば何でも。あえて決めるとすれば15fpsでよいです
6fpsのカメラであれば同じ画像を2.5回程度下流ストリームに投げるものでいいです
>ソースが吐き出すタイムスタンプ確認してみた?てんでバラバラの間隔だったのかな
う〜ん。どのカメラでやったか定かではないのですがQcamかbuffaloのカメラでは
バラバラでした。自分でも少々不確定なので試していないということでお願いします
0554デフォルトの名無しさん
2007/06/18(月) 16:38:27つーか、サンプルのレートばらばらでも動くように作れよ。
0555デフォルトの名無しさん
2007/06/18(月) 22:19:44について何も設定しなければ、デフォルトの設定でデインターレースが有効
なってるんでしょうか?
テストプログラムで調べてるんですが、VIDEOINFOHEADER2のdwInterlaceFlags
が必ず0になってるんで、デインターレースの設定のしようがないんですが・・・
0556デフォルトの名無しさん
2007/06/19(火) 14:35:18>VIDEOINFOHEADER2 の dwInterlaceFlags が必ず0になってるんで
「なってるんで」ってのは意味不明だな。0 ならインターレース解除は行われない。
まともな MPEG2 デコーダーでインターレース物のファイルをデコードすれば
適当な値が入るはず。
0557555
2007/06/19(火) 16:38:40そのメディアが確実にインターレースであると確認する方法がないんですよ。
(見た目ではインターレース縞は確認できるけど)
今、手元にあるDVD数種からVOBをそのままコピーして拡張子をmpgに変えて
テストしてるんですが、InterVideo、Mainconcept、ffdshowどれも0でセット
されてますね。InterVideoはデコーダがインターレース解除じているように
見えますけど。
0558デフォルトの名無しさん
2007/06/19(火) 17:10:25出力で「オーバーレイミキサーを使用する」「ハードウェアインターレース解除」をオンに、と設定してみて。
0559555
2007/06/19(火) 18:07:20ありがとうございます。ffdshowでそのような設定にしたところ、
dwInterlaceFlagsに0以外が設定され、VMR9初期状態のデインターレスモード
がGUID_NULLから変化しました。何も設定しなくても、インターレース
ストリームが繋がればデインターレースが有効になっていることが確認でき
ました。「ハードウェアインターレース解除」をオンにするっていうのは
レンダラーにインターレースストリームであることを通知するって意味
だったのね。(わかりにくい)
0560デフォルトの名無しさん
2007/06/19(火) 23:32:28ハードウエアでデインタレースするって意味だが。
あとオーバーレイミキサを使用したらVMR9はつながらないということはない?
0561555
2007/06/20(水) 00:51:24VMR9に繋がってますねぇ。まあ、ffdshowのその設定のとこのバルーンヘルプを
見ると、VIDEOINFOHEADER2ヘッダを使用するかどうかって設定らしいので、
VMRと繋がるかどうかは関係ないんじゃないかな。
あと、ハードウエアインターレース解除をONにしないとdwInterlaceFlagsに0
を入れてくるので、VMRにハードウェアデインターレースさせるって意味みたいね。
0562デフォルトの名無しさん
2007/06/20(水) 01:44:550563555
2007/06/20(水) 02:45:26あい、あっちにも報告します。
その後、ひとつ確認ミスがあったので、報告を。
InterVideoは自前でデインターレースしているのではなく、VMR9のデインター
レースを有効にしているようです。InterVideoはなぜかデバッグモードでアプリ
を起動すると、接続を拒否するようです。(デバッグトレースを見られるのが
いやなのかな)それで、InterVideoが繋がってるつもりで、実はMaincncept
が繋がっていたという落ちでした(^_^;)
0564デフォルトの名無しさん
2007/06/22(金) 00:45:35vmr7.hとvmr9.hは同居できない。なぜなら前者はDirectX7に基づいていて、後者はDirectX9にもとづく。
そしてDirectX7と9は定義の一部が被るので一緒に使えない。
qeditもおそらく同じだろ。
と、さりげなくレスしてみる。
0565デフォルトの名無しさん
2007/06/22(金) 14:12:31vmr9.h (+その他もろもろ)がインクルードされた後に、
#define _D3DRMOBJ_H_
#define __D3DRM_H__
#include <Qedit.h>
でOK。
0566デフォルトの名無しさん
2007/06/24(日) 17:48:41これはDirectShowを使えば可能なのでしょうか?
具体的にいうとカメラから取り込んだ画像は、リアルタイムで画面に描画しながら、
ある間隔でその画像を取得して画像処理を行いたいです。
また、サンプルなどがあれば教えていただきたいです。
0567デフォルトの名無しさん
2007/06/24(日) 17:57:540568デフォルトの名無しさん
2007/06/25(月) 12:04:22カメラ−画像変換フィルタ−VideoRenderer
と繋いであげるといいと思うよ。
画像変換のフィルタは標準では入っていないので、SDK付属のサンプルをビルドしてOSに登録してあげてください。
個人的にはEZrgb24フィルタがお勧め。
VideoRendererはDirectShowフィルタとして標準で入っているので、探してください。
0569デフォルトの名無しさん
2007/06/25(月) 22:59:28その画像と現在の画像の差分を出力したいのですが、メモリ上にコピーを保存するコードが分からないのですが
似た様な事を昔やった方や、やり方分かる方いらっしゃらないでしょうか?
0570デフォルトの名無しさん
2007/06/25(月) 23:05:000571デフォルトの名無しさん
2007/06/26(火) 00:53:20EZrgb24 フィルタを改造して映像に文字を表示するフィルタを作りたいんですが,
どのような手順を踏めばいいのでしょうか?
CEZrgb24::Transform(IMediaSample *pMediaSample) 関数を改造して,
1) CreateDIBSection() で DIB 作成
2) TextOut() で表示
で試したんですが,文字が表示されませんでした….
AM_MEDIA_TYPE* pType = &m_pInput->CurrentMediaType();
VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER *) pType->pbFormat;
HDC hDC = GetDC(NULL);
HDC hdcMem = CreateCompatibleDC( hDC ); // メモリDC を作成
ReleaseDC( NULL, hDC );
void* lpRGB;
HBITMAP hDIB = CreateDIBSection( hdcMem, (BITMAPINFO*)&(pvi->bmiHeader),
DIB_RGB_COLORS, &lpRGB, NULL, 0);
// hDIB は NULL ではありませんでした.
このように pvi->bmiHeader から DIB を作成しているんですが,ここが間違っているんでしょうか?
0572デフォルトの名無しさん
2007/06/26(火) 04:21:27すいません,どうやら非常に恥ずかしい間違いをしていたようです….
このやり方が標準的なのかは分かりませんが,以下のコードで無事表示できました.
int nPicels = pvi->bmiHeader.biHeight*pvi->bmiHeader.biWidth;
int nDataSize = nPicels*pvi->bmiHeader.biBitCount/8;
void* lpRGB;
HBITMAP hDIB = CreateDIBSection( 0, (BITMAPINFO*)&(pvi->bmiHeader),
DIB_RGB_COLORS, &lpRGB, NULL, 0);
if(hDIB && lpRGB)
{
memcpy(lpRGB, pData, nDataSize );// DIB array を映像で初期化
HDC hdcMem = CreateCompatibleDC( 0 ); // メモリDC を作成
HBITMAP hOldBMP = (HBITMAP)SelectObject(hdcMem, hDIB); // メモリDC にビットマップを選択
char szText[256] = "Test string";
TextOut( hdcMem, 0, 0, szText, strlen(szText));
SelectObject( hdcMem, hOldBMP);
DeleteDC( hdcMem ); // メモリDC 削除
memcpy( pData, lpRGB, nDataSize );//BMP を書き戻す.
DeleteObject( hDIB );
}
0573デフォルトの名無しさん
2007/06/26(火) 19:11:56で
pMediaSample->GetSize();
と
pMediaSample->GetActualDataLength();
を実行して、メディアのデータサイズを取ったら、どちらも0が返ってきたのですが
これって、何かの使用ですか?
0574デフォルトの名無しさん
2007/06/28(木) 10:27:55DirectShow のサンプルをみてると JIF, LIF マクロがよく使用されてますが,
機能や使用目的はわかるんですが,これは何の略なんですか?
どうにも気になるんで御教示下さい.
0575デフォルトの名無しさん
2007/06/28(木) 11:47:29Leave If Failed
0576デフォルトの名無しさん
2007/06/28(木) 16:02:20げ、これマジなの??
0578デフォルトの名無しさん
2007/06/28(木) 17:11:13なら書き込む前にググれよ・・・
それってすげーたち悪いぞ
0579デフォルトの名無しさん
2007/06/28(木) 17:13:43ググってくれなかったから、しかたなく自分でググリました、とさ
0580デフォルトの名無しさん
2007/06/28(木) 17:16:270581574
2007/06/28(木) 17:52:42失礼,JIF, LIF macro でググっても関係無いページばかりヒットしてしまい,
わからなかったので質問しました.
0582デフォルトの名無しさん
2007/06/28(木) 18:23:230583デフォルトの名無しさん
2007/06/28(木) 21:20:370584デフォルトの名無しさん
2007/06/28(木) 22:07:33#define FAIL_RET(x) do { if( FAILED( hr = ( x ) ) ) \
return hr; } while(0)
0585デフォルトの名無しさん
2007/06/28(木) 22:11:06やっぱりあるのか・・FAIL_RETか
つかそのマクロの使い方はあれだな、VC6の時のforみたいだな
0586デフォルトの名無しさん
2007/06/29(金) 11:51:22DirectSound側で、IID_IDirectSoundNotifyを用いると、ターゲットのリンク時に
関数が重複しるぞ、ゴルァと言われてしまいます。
リンクしているのは以下のライブラリ
dsound.lib dxguid.lib uuid.lib strmiids.lib
dxguid.libを抜けば、IID_IDirectSoundNotifyのみ見つからないという状態に
なるので、これを使わないコードにすれば良いという話もあるのですが、うまく
共存させる方法はないでしょうか。ご教授お願いします。
0587デフォルトの名無しさん
2007/06/30(土) 09:29:53CComPtr を std::vector に入れても大丈夫?
std::vector< CComPtr<IMoniker> > vtIMonikerArray;
というふうに使いたいんだけど,std::auto_ptr をいれるときのような問題はありますか?
0588デフォルトの名無しさん
2007/06/30(土) 19:15:08少なくともauto_ptrのような問題が起きることはない
安心して突っ込みたまえ
0590デフォルトの名無しさん
2007/07/05(木) 09:35:54実際にアプリから使用してみると、SetRate(8.0)のように高いレートを設定すると
エラー0x8004025cが返ってきます。
スプリッタ内部のSetRateでは、レートの制限をつけていないのですが、
どうしてかわかりますでしょうか?
0591デフォルトの名無しさん
2007/07/05(木) 12:35:200592デフォルトの名無しさん
2007/07/05(木) 22:31:42しているんですが、なぜかムービーウィンドウがトップにならず、
プログラムウィンドウの裏にまわったりして、きちんと再生されません。
VideoWindowはトップにくるように命令を入れてるんですが、きちんと機能していないみたい。
どなたかご指導お願いします。
// 自前のウィンドウにムービーを再生する
pVideoWindow->put_Owner((OAHWND)m_hwnd);
pVideoWindow->put_WindowStyle(WS_CHILD|WS_CLIPSIBLINGS);
pVideoWindow->SetWindowPosition(0,0,800,600);
pVideoWindow->SetWindowForeground(OATRUE);
pVideoWindow->put_Visible(OATRUE);
// ストリームの再生(グラフの実行)
hRslt = pMdaCtrl->Run();
pMediaEvent->WaitForCompletion(15000, &eventCode);
0593590
2007/07/06(金) 09:52:06オーディオレンダラをフィルタグラフから外すと成功しました。
ありがとうございました。
しかし、いちいち外したり、接続したりするのは面倒ですね。。
0594デフォルトの名無しさん
2007/07/06(金) 12:21:01何再生してもそうなる?
ビデオデコーダにDivX本家使うと、再生開始時に何かにアクティブ
ウインドウ奪われちゃうって経験はあるけど。
0596デフォルトの名無しさん
2007/07/07(土) 01:13:03逆さ向けてビデオとってしまったんだorz
0597デフォルトの名無しさん
2007/07/07(土) 04:03:29ワロタ
てかその修正をフィルタに任せるなよw
動画編集ソフトで回転させるとか
動画を反転回転できるプレイヤー使うとかあるだろ
0598592
2007/07/07(土) 18:37:34>>594
再生しているmovieは特別なコーデックを必要としないので、違う原因かと思います。
>>595
親をNULLで再生すると、再生時にメインWIndowが最小化してしまい、全画面モードが
通常画面に戻ってしまいます。(movieは左上で再生)
もうすこし詳しく症状を説明すると、まったく再生しないわけではなくて
成功・失敗をランダムで繰り返します。
成功すれば、メイン画面の前にVideoWindowが出て、普通に再生。
失敗すると、メイン画面の裏にVideoWindowがいるようで、音だけ再生。
このような感じになります。
色々とネット検索したところ、VideoWindowを再描画することで回避可能と見つけたのですが、
組んだところうまくいきません。(症状は同じ)
HWND hChild = GetWindow(m_hwnd,GW_CHILD);
InvalidateRect(hChild,NULL,true);
うーん・・・
0599デフォルトの名無しさん
2007/07/07(土) 19:58:50親ウインドのWM_ERASEBKGNDをDefaultWindowProcに渡さないようにして試してみな。
case WM_ERASEBKGND:
return 0;
でOK
0600デフォルトの名無しさん
2007/07/08(日) 13:54:57入れてみましたが、現状変わらずです。
元々WaitForCompletionで処理を止めている状態ならウィンドウメッセージが
ムービー再生中に取れることも無いので、SetNotifyWindowでイベント登録
に切り替えてみましたが、やはり同じ状態です。
WaitForCompletionで再生しても裏に回った状態になるので、
WM_ERASEBKGNDを無視しても、同じ症状になるのだと思います。
再生中に定期的にInvalidateRectをVideoWindowに送ってもみましたが、
やはり裏の時は裏で再生されます。
うーむ、もう少し調べてみます。
0601デフォルトの名無しさん
2007/07/08(日) 14:11:52ダイアログ?それともダイアログに貼り付けたCStatic?
0602デフォルトの名無しさん
2007/07/08(日) 15:00:15以下のスタイルで画面切り替え時にSetWindowLongしたものです。
WS_POPUP | WS_SYSMENU | WS_VISIBLE | WS_BORDER
0603デフォルトの名無しさん
2007/07/08(日) 19:36:060604デフォルトの名無しさん
2007/07/08(日) 20:01:24以下のような方法でVideoWindowにTOPMOSTを指定しましたが、
どちらも結果は変わらず、表に出たり裏に回ったりします。
1.
pVideoWindow->put_WindowStyleEx(WS_EX_TOPMOST);
2.
HWND hChild = GetWindow(m_hwnd,GW_CHILD);
::SetWindowPos(m_hwnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
うーん。
0605デフォルトの名無しさん
2007/07/08(日) 20:24:33窓の設定が間違っている予感。
0606デフォルトの名無しさん
2007/07/08(日) 20:35:110607デフォルトの名無しさん
2007/07/08(日) 20:47:08すいません、それは具体的にどのようにすればよいでしょうか?
0608デフォルトの名無しさん
2007/07/08(日) 21:17:560609デフォルトの名無しさん
2007/07/08(日) 21:57:40Owner指定無しだと、元の全画面ウィンドウからVideoWindowに移る際に
全画面モードが解除されます。(Movieは左上で再生)
これは、put_FullScreenMode()を実行しでも同じような動作になります。
通常画面からput_FullScreenModeをつかえば全画面でムービー再生してくれるのですが、
全画面モードから使うと、逆に全画面が解除されるようです。
うーん。
0610599
2007/07/08(日) 22:11:45ビデオウインドの親ウインドは何?
このウインドを仮にhParentとすると、
hParentウインドに親はいるのか?(or最初からWS_POPUP?)とか
hParentウインドのスタイルにWS_CLIPCHILDRENは設定されているのか?とか
hParentウインド自身は全画面サイズに引き伸ばされ、且つTopに表示されているの?とか
hParentウインドのWM_ERASEBKGNDをちゃんと無視しているの?とか
put_Ownerするタイミングとか
そういうことが知りたい。
0611592
2007/07/08(日) 22:36:34CreateWindowしたWindowが親です。
>このウインドを仮にhParentとすると、
>hParentウインドに親はいるのか?(or最初からWS_POPUP?)とか
画面切り替え時にWS_POPUPとしています。
>hParentウインドのスタイルにWS_CLIPCHILDRENは設定されているのか?とか
指定していませんでしたが、元々メッセージ処理するつもりではなく、movie再生終了まで
処理停止するプログラムです。
pMediaEvent->WaitForCompletion(15000, &eventCode); // 15秒経過するかmovie再生が停止するまで待つ
また、入れてメッセージ処理をするようにしましたが改善されませんでした。
>hParentウインド自身は全画面サイズに引き伸ばされ、且つTopに表示されているの?とか
はい、全画面でTOPです。
>hParentウインドのWM_ERASEBKGNDをちゃんと無視しているの?とか
これも前に書きましたが入れても改善されませんでした。
>put_Ownerするタイミングとか
基本は>>592のソースですが、put_Visibleの直前まで、1行ずつ移動させても改善しませんでした。
また、その前にはVideoWindowの取得になるので移動できません。
こんな感じてす。何か判りますでしょうか。
0612599
2007/07/08(日) 23:12:43タイミングによってはリフレッシュが先に発生し、あとからビデオレンダラの再描画が行われ、表示される場合もある。
したがって親ウインドがある場合、親ウインドのWM_PAINTの描画処理をクリップして、且つERASEBKGNDをさせなければならない。
WS_CLIPCHILDRENやWM_ERASEBKGNDの処理を確実にしなければ効果がない。
ビデオレンダラの親ウインドにWS_CLIPCHILDRENをいれてみたらどうなる?
もしダメならほかの理由かもね。
0613592
2007/07/08(日) 23:36:52>したがって親ウインドがある場合、親ウインドのWM_PAINTの描画処理をクリップして、且つERASEBKGNDをさせなければならない。
>WS_CLIPCHILDRENやWM_ERASEBKGNDの処理を確実にしなければ効果がない。
WM_PAINTのクリップ、WM_ERASEBKGNDをDefに流さない、WS_CLIPCHILDRENを入れる。
全てやってみたんですが、やはりダメでした。
>ビデオレンダラの親ウインドにWS_CLIPCHILDRENをいれてみたらどうなる?
上でも描きましたが、入れてみても症状は変わらずです。
そもそもWaitForCompletionで、再生終了まで待つ処理でも症状がでるんですよね。
で、再生終了をイベント取得に切り替えて、PAINT処理を切ったりしてもやはり同じくだめでした。
うーん、タイミング問題だとは自分も思うんですが・・・。
もう少し調べてみます。
0614592
2007/07/09(月) 12:22:04すこし原因らしきものが見えましたのでご報告します。
メインWindowの描画にDirect3Dを使用しているんですが、
全画面モードで
メイン画面の描画を一切やらない → 100%ムービー再生に成功
一度だけDirect3Dでサーフェイスのクリア → 表と裏のランダム再生
一度だけDirect3Dでメイン画面を描画 → 表と裏のランダム再生
どうやらDirect3Dのフロントバッファが問題を起こすようです。
引き続き対策を調べて見ます。
0615592
2007/07/09(月) 14:40:31IDIRECT3DDEVICE9のリセットをおこなってから再生するようにした所
うまくいくようになりました。
おさわがせいたしました。
貴重なご意見をいただき、ありがとうございました。
0616デフォルトの名無しさん
2007/07/10(火) 00:26:340617デフォルトの名無しさん
2007/07/10(火) 00:31:050618デフォルトの名無しさん
2007/07/10(火) 10:40:380619デフォルトの名無しさん
2007/07/10(火) 14:01:52と
#include <d3d9.h>
を一緒にするとエラーが出るんです。
順番変えてもエラーでます
対応策ってありますか?
0620デフォルトの名無しさん
2007/07/10(火) 14:16:280621デフォルトの名無しさん
2007/07/10(火) 14:28:13VC2003で
Microsoft DirectX 9.0 SDK Update (December 2004)
だと思います。
#include <d3d9.h>
#include <d3dx9.h>
#include <dshow.h>
#include <qedit.h>
と書くと
c:\DXSDK\Include\d3drmobj.h(46): warning C4005: 'WIN_TYPES' : マクロが再定義されました。
c:\DXSDK\Include\d3drmobj.h(274): error C2061: 構文エラー : 識別子 'LPDIRECT3D'
・・・
等が出ます。
#include <dshow.h>
#include <qedit.h>
#include <d3d9.h>
#include <d3dx9.h>
と書くと
c:\DXSDK\Include\d3dx9math.inl(1924): error C2039: 'm' : 'D3DXMATRIX' のメンバではありません。
c:\DXSDK\Include\d3dx9math.h(310) : 'D3DXMATRIX' の宣言を確認してください。
c:\DXSDK\Include\d3dx9math.inl(769): error C2065: 'm' : 定義されていない識別子です。
c:\DXSDK\Include\d3dx9math.inl(775): error C3861: 'm': 識別子は、引数依存の照合を使用しても見つかりません。
・・・
等が出ます。
0622デフォルトの名無しさん
2007/07/10(火) 14:51:17d3drm〜ってファイル名から明らかだが
qeditがDirectX7を使ってるからだろ?
一つのコンパイルパスにおいて複数のバージョンのDirectXは同居できない。
>>564-565 にズバリな事が書いているような気がするんだが、これは試したの?
0623デフォルトの名無しさん
2007/07/10(火) 14:53:34ちょっと訂正
0625デフォルトの名無しさん
2007/07/10(火) 15:08:210626デフォルトの名無しさん
2007/07/10(火) 16:02:520627デフォルトの名無しさん
2007/07/10(火) 16:42:410628デフォルトの名無しさん
2007/07/10(火) 22:27:39ここ過疎気味だし。
0629デフォルトの名無しさん
2007/07/11(水) 06:48:470630デフォルトの名無しさん
2007/07/11(水) 07:02:280632デフォルトの名無しさん
2007/07/11(水) 23:00:210633デフォルトの名無しさん
2007/07/12(木) 02:13:152つの出力ピンともレンダラと繋いで、オーディオのみのファイルを再生すると、音声が流れません。
スプリッタのビデオ出力ピンを未接続にし、オーディオ出力ピンのみをレンダラと繋ぐと音声は再生されます。
ピンから出力データが無い場合に、そのピンを接続するのはいけないのでしょうか?
何とか、ビデオピンも繋いで、オーディオのみのファイルの再生をしたいのですが、
どうしたらよいでしょう?
0634デフォルトの名無しさん
2007/07/13(金) 02:01:04ドキュメントにはサンプルのTextOutがさもあるように書いてあるんですが
どこにあるかわかりません。
どこにあります?
そのほかのサンプルもなんか無いんですが。。
0635デフォルトの名無しさん
2007/07/13(金) 16:06:440636デフォルトの名無しさん
2007/07/14(土) 00:34:35ちょっくら探してきます。
0637デフォルトの名無しさん
2007/07/15(日) 19:51:580638デフォルトの名無しさん
2007/07/15(日) 19:52:58間違えた。無視して
0639デフォルトの名無しさん
2007/07/15(日) 22:03:200640デフォルトの名無しさん
2007/07/17(火) 18:48:32フィルタをシェアウエアで出したいんだがいいとこある?
0641デフォルトの名無しさん
2007/07/18(水) 00:19:370642デフォルトの名無しさん
2007/07/18(水) 12:24:38>>401の拡張したやつ
顔を検出するやつ
動物体を検知するやつ
あとはサンプルグラバのこったやつ
0643デフォルトの名無しさん
2007/07/18(水) 13:49:330644デフォルトの名無しさん
2007/07/18(水) 22:06:450645デフォルトの名無しさん
2007/07/18(水) 22:32:22BaseClassesをnmakeしようとすると
makefile(53) : fatal error U1083: ターゲット マクロ '' が展開されません。
って出るんだけど・・・。
0646デフォルトの名無しさん
2007/07/19(木) 13:38:03DirectShowのフィルタを自作しなければできないのでしょうか??
0647デフォルトの名無しさん
2007/07/19(木) 22:14:14使った方があとあとシステムにしやすいから作ったら??
0648デフォルトの名無しさん
2007/07/19(木) 22:19:262週間程度時間があればね〜☆
時間なければヘッダを直にバイナリにかく。
0649デフォルトの名無しさん
2007/07/19(木) 22:49:12ド、ド、ドリフの大爆笑〜♪ というところ
ダ、ダ、ダイレク、ダイレクトショウ〜♪ に聞こえるよな
0650デフォルトの名無しさん
2007/07/19(木) 23:12:200651デフォルトの名無しさん
2007/07/20(金) 22:00:270652デフォルトの名無しさん
2007/07/20(金) 22:24:49後動画によっては上下さかさまに気をつけて〜。(たぶん問題ないけど)
0653デフォルトの名無しさん
2007/07/20(金) 22:33:19クソワロタ.うん聞こえる。ダ、ダ、ダイレク、ダイレクショウ〜♪
0654デフォルトの名無しさん
2007/07/22(日) 00:23:160655デフォルトの名無しさん
2007/07/22(日) 02:58:50動画を一律30FPSにするDirectShowのフィルターってどう作ればいいですか?
方法が思い浮かばないので・・・ヒント教えてください
0656デフォルトの名無しさん
2007/07/22(日) 09:48:170657デフォルトの名無しさん
2007/07/22(日) 19:41:180658デフォルトの名無しさん
2007/07/23(月) 00:55:082つの映像入力を何らかの形で合成し
1つの出力として吐き出すフィルタを作成しています。
最終的に、出力ピンに繋がった入力ピンのReceive()に
合成結果であるIMediaSampleを渡せば良いというのはわかるのですが、
映像の同期がうまくとれません。
(同期というかそれぞれの入力から1フレームずつ取得して出力したい)
どのようにすればよいでしょうか?
0659デフォルトの名無しさん
2007/07/23(月) 07:56:533つ以上、チェックがつけばアナタの性格はひん曲がっており、
ネガティブ負け組派遣人生を歩んでいます。
□派遣先正社員の作った糞開発ツールはたとえ腐っててもマンセーして使う
□派遣先の人事権のある社員の意見はたとえ間違っていてもマンセーする
□仕様とは正社員から口伝されるものだ
□耳で聞いた仕様を正確に覚えていないのは自分の責任だ
□昼食は必ず派遣先の社員と行くべきだ
□自分の仕事で問題が発生しても解決するのは派遣の仕事ではない
□派遣先から「いつまでもここで仕事してくださいね(安い金でw)」と言われて嬉しい
□自社で仕事なんてできるわけがない
□派遣労働の問題点の話題が出ると感情剥き出しにして反論する
□派遣労働の問題を指摘する人は嫌いだ
□派遣先には仕事だけでなくプライベートについてもグイグイ引っ張って欲しい
□奢ってくれる派遣先正社員を尊敬する
□自分の月額金額を知らないのは当然だ、単金を聞いてはいけない
□派遣先正社員より自分の生涯収入が低いのは当然だ
□チビは派遣先にかわいがってもらいやすいから派遣には有利だ
0660デフォルトの名無しさん
2007/07/23(月) 21:04:26入力ソースがライブ(プッシュ)だったりする?
0661658
2007/07/24(火) 10:24:31AddSourceFilterでハードディスク上のムービーファイルを扱う場合って
どっちになるんですかね?
プッシュモデルにするかプルモデルにするかは
やっぱりソースフィルタに依存します?
0662デフォルトの名無しさん
2007/07/24(火) 21:32:14ハードディスク上のムービーファイルなら通常プルモデル。
パーサー(スプリッタ)がデータを引っ張り出して後ろに流します。
んで入力2系統あるらしいけど、両方ともハードディスク上のムービーファイルなの?
ファイル形式はなんですかね?
0663デフォルトの名無しさん
2007/07/25(水) 17:12:59AMCap を参考にプログラムを作っています.
OleCreatePropertyFrame() でビデオキャプチャピンのダイアログを表示できますが,
ttp://pukapuka.sakura.ne.jp/cgi-bin/upload/puka/img-box/1185348928740.jpg
上記の 「色空間/圧縮」,「出力サイズ」をダイアログからではなく,プログラム上から制御
したいのですが,どのようにすれば可能でしょうか?
具体的には,これらの値の列挙,現在の値の取得・変更を行いたいと思っています.
参考になるページ等もありましたら御教示下さい.
0664デフォルトの名無しさん
2007/07/25(水) 17:21:17Connect する前にね。
0665663
2007/07/25(水) 21:56:05CComPtr<IAMStreamConfig> pAMStreamConfig;
hr = pCaptureGraphBuilder2->FindInterface(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
pVideoDeviceFilter, IID_IAMStreamConfig,
(void **)&pAMStreamConfig);
if( SUCCEEDED(hr) )
{
AM_MEDIA_TYPE* pMediaType;
pAMStreamConfig->GetFormat( &pMediaType ); // 現在の設定を取得
pMediaType->subtype = MEDIASUBTYPE_YUY2;// YUY2 に変更
VIDEOINFOHEADER* pVideoInfoHeader = (VIDEOINFOHEADER*)pMediaType->pbFormat;
pVideoInfoHeader->bmiHeader.biWidth = 640; // 640 wide
pVideoInfoHeader->bmiHeader.biHeight = 480; // 480 height に変更
pAMStreamConfig->SetFormat( pMediaType );//設定を反映
DeleteMediaType( pMediaType );
}
列挙も pAMStreamConfig->GetNumberOfCapabilities() と GetStreamCaps() で実現できそうです.
有難う御座いました.
0666658
2007/07/27(金) 15:52:03>両方ともハードディスク上のムービーファイルなの?
>ファイル形式はなんですかね?
とりあえずは両方ともハードディスク上のもので
ファイル形式はAVIでやってます。
0667デフォルトの名無しさん
2007/07/31(火) 15:19:35ttp://wwwdoi.elec.nara-k.ac.jp/html/jisyu/dxm/ds/index.html
ここのlist702サンプルを実行して、mpgファイルなんかだと問題なく静止画取り込みができるんだけど、
とあるDivX6エンコードのaviファイルで実行すると、GetConnectedMediaType()で取ったAM_MEDIA_TYPEの
pbFormatがNULLになってしまい、ビデオ情報が取れないみたいなんですが一体どういう原因が考えられるんでしょうか。
ファイル自体はMediaPlayerで再生できています。
0668667
2007/07/31(火) 15:46:23DivXファイルだとISampleGrabberCBでのコールバックの指定も無視されてしまうようです。
キャプチャされないように何かロックされてる?
0669デフォルトの名無しさん
2007/07/31(火) 17:13:25あとpbFormat以外のメジャータイプとサブタイプを見たほうがいい。
もしかするとDivX6はパーサーとデコーダがセットで使用されていて、
パーサーとデコーダは互いを知っているのでpbFormatなんか使わないっていう実装かもしれん。
そこにサンプルグラバがパーサーとデコーダの間に挟まれば、ありうる。
0670667
2007/07/31(火) 17:32:37ありがとうございます。
さらに調べてみたら、どうもDivXはRGB24への自動変換をサポートしていなかったり結構中途半端な模様。
で、レンダラまで自前実装してやるとキャプチャできる(SDK付属サンプルのWindowlessなら動く)ようなので、
そっちをベースにした実装にしたいと思います。
0671デフォルトの名無しさん
2007/07/31(火) 20:55:11コマ落ちばっかりです
なんか早くする方法はありませんか?
0672デフォルトの名無しさん
2007/07/31(火) 23:18:450673デフォルトの名無しさん
2007/08/01(水) 22:13:09普通にCで書いて間に合わないんなら、SIMD命令使え。
それでも間に合わないんならPCをパワーアップ。
0674デフォルトの名無しさん
2007/08/01(水) 22:25:010675デフォルトの名無しさん
2007/08/01(水) 22:40:55CTransformFilterの中で今の時間を取得することはできますでしょうか?
シークするとTransformに渡ってくるIMediaSampleのGetTimeやGetMediaTimeの時間が0に戻ってしまって、今の時間がわからなくなってしまいます・・・
それからCTransformFilterから動画の長さ(再生時間の合計)を知る方法ってありますか
0676デフォルトの名無しさん
2007/08/02(木) 09:54:52SYSTEMTIME st;
GetLocalTime( &st );
こんな感じ。
CTransformFilterから動画の長さをとることはできますが、フィルタ設計上
カメラもつなげる想定で作るべきっぽいから書いていいんだろうか
0677デフォルトの名無しさん
2007/08/03(金) 01:26:18教えてください〜
0678デフォルトの名無しさん
2007/08/03(金) 03:13:20それをfpsで割るのが「動画スタートからの時間」を得るのには最適だと
思うよ。変にタイマを使ったりすると動画のレートが変わった時点で
使えなくなっちゃうから。わからんならコードをどっかにうpするよ
んで動画の長さを得るのは、ソースフィルタから変換フィルタに渡してやるような
つくりにするのはどうでしょうか?
0679デフォルトの名無しさん
2007/08/03(金) 19:35:31"シーク可能ストリームでは、メディア タイムは常にストリームの開始タイムから相対的になる。"
とあるからGetMediaTimeはシークしても時間は0にならないみたい。
さっき試してみたけどそうなっていました。
0680デフォルトの名無しさん
2007/08/04(土) 01:05:41ありがとうございます
試してみます
0681デフォルトの名無しさん
2007/08/06(月) 23:28:44手持ちのWebカメラでは0〜100や0〜130といった値が返ってきました。
http://msdn2.microsoft.com/en-us/library/ms779747.aspx
によると、2^0 = 1sec〜2^130secといった、大きな値に相当してしまいますが、
単位はあてにできないのでしょうか?
せめて+1する毎にexposure timeが二倍になってほしいのですが、
何か方法があったら教えてほしいです。
0682デフォルトの名無しさん
2007/08/07(火) 00:48:42露光時間って、写真の撮影で、弱い光でも感光版が感光できるようにシャッタースピードを遅くするとかのあれだよな?
0683デフォルトの名無しさん
2007/08/07(火) 00:54:49pCaptureGraphBuilder2->SetOutputFileName( &MEDIASUBTYPE_Avi , L"test.avi" , &pFileOut , &pSink );
pCaptureGraphBuilder2->RenderStream( &PIN_CATEGORY_CAPTURE , NULL , pDeviceFilter , NULL , pFileOut );
というようなグラフ構築を行ったのですが、何回かテストしてtest.aviを上書きするとき、
上書き前の容量より小さいと、ファイルのプロパティに表示される容量が上書き前のまま
になります。(上書き前より大きいと更新されます)
再生してみると、正しくキャプチャされているのですが、この容量表示の問題はどのように
すれば解消できるでしょうか?
(表示上だけでなく、実際に無駄な容量が付加されているのかも?)
0684デフォルトの名無しさん
2007/08/07(火) 14:30:46DeleteFile
0686デフォルトの名無しさん
2007/08/08(水) 05:39:26削除の場合は実際にエントリが書き換えられるので、サイズを0にするのも有り。
RIFF解析して自前でサイズ調整するのも意外と簡単だよ。一番外側のチャンクだけ計算するだけで済むしな。
0688デフォルトの名無しさん
2007/08/09(木) 07:52:410689デフォルトの名無しさん
2007/08/09(木) 21:37:520690デフォルトの名無しさん
2007/08/09(木) 22:26:35世界中のソフトハウス探せばどっかにあると思う。
0691688
2007/08/09(木) 23:30:48簡単に手に入れられるなら作る必要もないと思ったのですが、作る価値はありそうですね。
やってみます。
ありがとうございました。
0692デフォルトの名無しさん
2007/08/11(土) 10:56:07GraphEditではあるのですが、アプリでインスタンスを作成できません。
CoCreateInstance( CLSID_NullRenderer , NULL , CLSCTX_INPROC_SERVER , IID_IBaseFilter , ( void** )&pNull );
このように書いたところ、ビルド時にCLSID_NullRendererが定義されていない、と言われます。
調べてみると、qedit.hにあるようなので、includeしたところ、今後はdxtrans.hがないと言われました。
でも、このヘッダファイルはPC内にはありませんでした。
どのようにすれば作成できるでしょうか?
0693デフォルトの名無しさん
2007/08/11(土) 13:10:14そのファイル名で検索すると幾つか情報が見つかるんだが・・・
俺のPCにはDirectX SDKの中に普通に入ってた。
つかDirectXSDKとPlatformSDKはいつのを使ってるかくらいは書いたほうがいいと思うぞ。
0694692
2007/08/11(土) 14:06:01Windows SDKのバージョンは最新だと思います。
DirectX SDKはインストールしていませんでした。
最新版のJune 2007を入れたら、それに入っていました。
VC++でインクルードパスを指定したのですが、それでもコンパイルはエラーになります。
エラーの内容は、DirectX SDKのIncludeフォルダにあるd3drmobj.hというファイル内に
構文エラーがある、というものがたくさん。
あと、
To compile qedit.h you must install the DirectX 9 SDK, to obtain the dxtrans.h header.
というエラーメッセージも。
0695デフォルトの名無しさん
2007/08/11(土) 14:31:58必ず発生するというわけではないのですが、高確率で発生します。
スプリッタにflvsplit.dllを使用した時のみこの現象がおきます。
WMPやMPCでは普通にシークできているので、コーディングの問題だと思うのですが...
思い当たる点として、WMPやMPCと違う部分はISampleGrabberを咬ませていることぐらいです。
(シーク時にSetBufferSamples(FALSE)を指定しても変化無しでした)
原因が分かる方はいませんでしょうか。
0696デフォルトの名無しさん
2007/08/11(土) 14:34:08なんか言ってることが
>>564-565 とか
>>621-623 あたりと全く同じに聞こえるんだが、これは試したの?ちゃんとレスを検索してる?
0699デフォルトの名無しさん
2007/08/11(土) 16:01:43>>565ためしても>>621みたいなのが出るってこと?
0700デフォルトの名無しさん
2007/08/11(土) 16:57:43GUID CLSID_NullRenderer = {0xc1f400a4, 0x3f08, 0x11d3, {0x9f, 0x0b, 0x00, 0x60, 0x08, 0x03, 0x9e, 0x37}};
0701デフォルトの名無しさん
2007/08/11(土) 17:28:22レスがそうさくしてめんどいのであまり読んでないが、
NULLレンダラのCLSIDが定義されているヘッダを読み込んだら
こんどはDirectXのヘッダが見つからないって言われたんだろ?
最新のPlatformSDKでDirectShowを使うには同時にDirectXSDKをインストールする必要がある。
もう試した?
>>700
のようにソースにじかに定義しても動くだろうが、PlatformSDKとDirectXSDKをインストールするのが正しい解決方法。
0702デフォルトの名無しさん
2007/08/11(土) 17:41:03>>693 >>694読めよ・・・ 指摘されてどっちもインストールした、って書いてんだろ
あと「レスがそうさく」、って何? 「錯綜」(さくそう)って言いたいのかな?
レス読まずに余計なレスすると余計にレスがそうさくするよ?
まずは日本語を勉強して、レスをちゃんと読むことから訓練しましょう。
0703デフォルトの名無しさん
2007/08/11(土) 18:26:350704デフォルトの名無しさん
2007/08/11(土) 18:41:20質問者はスレを全く検索せずに質問
回答者はレスを全く読まずに回答、しかも日本語が不自由
これはひどい
0705デフォルトの名無しさん
2007/08/11(土) 19:07:55',::::j ==ュ r== 〈::::::j
fヾ}.., __ i i..__ l:イ めんどい!
lと', ゚ ̄ ,l l  ゚̄ ,リぅ!
ヽ-ヘ .,_ ,ィ''。_。ヽ、_,. /_ン' レスがそうさくしてめんどい!
', / _ } ,'
l、{ |__〉 /!
0706デフォルトの名無しさん
2007/08/11(土) 21:06:39基本的には
CoCreateInstance( ・・・ );
pGraphBuilder->AddFilter( ・・・ );
・・・
pCaptureGraphBuilder2->RemoveFilter( ・・・ );
pFilter->Release();
という流れですが、以下のようにリリース前に再度作成、追加するのはマズいでしょうか?
CoCreateInstance( ・・・ );
pGraphBuilder->AddFilter( ・・・ );
・・・
pCaptureGraphBuilder2->RemoveFilter( ・・・ );
・・・
CoCreateInstance( ・・・ );
pGraphBuilder->AddFilter( ・・・ );
・・・
pCaptureGraphBuilder2->RemoveFilter( ・・・ );
pFilter->Release();
0707デフォルトの名無しさん
2007/08/12(日) 21:50:14だとしたら基本的に下なんじゃない?
ソースフィルタだけを入れ変えたい時など、わざわざフィルタグラフごと新規で作り直したりはしないよ。
0708706
2007/08/12(日) 22:10:24すみません、pFilterというのはIBaseFilter型DirectShowフィルタの例です。
おっしゃる通り、キャプチャデバイスフィルタなどを入れ替えるときに下の手順を踏んでいます。
問題ないようであれば良かったです。
ありがとうございました。
0709デフォルトの名無しさん
2007/08/12(日) 23:11:460711デフォルトの名無しさん
2007/08/15(水) 00:41:29AVIファイルに保存するようにしました。
キャプタを実行 → グラフ停止 → ファイルライタに繋がるピンを切断
と進めるた時点では保存したAVIファイルは再生できるのですが、上記流れの後、グラフを再生
すると、AVIファイルが使用中となり再生できなくなります。
アプリを閉じれば再生は可能ですが、アプリ使用中においても再生できるようにするには
どのようにすればよいでしょうか?
なお、ファイルライタはRelease()で参照カウントのデクリメントを行っています。
よろしくお願いします。
0713デフォルトの名無しさん
2007/08/16(木) 17:57:09・キー入力があるまでプレビューを表示
・キー入力があると録画を開始
上記を行うために、録画前にStop()→キャプチャピンを繋ぐ→Run()としてるですが
Webカメラの露光やホワイトバランスなどの自動設定が初期化されるので
プレビューの状態からStop()せずに録画を行う方法はありますか?
0714デフォルトの名無しさん
2007/08/21(火) 11:40:44DirectShowで取得できるハード知らない?
io dataのGV-MVP/TZが手元にあるんだけど、なんか無理そうなんだ
0715デフォルトの名無しさん
2007/08/21(火) 14:27:46キャプチャピンの先にFileWriterか何かつないでるんかな。
SampleGrabberやTeeを挟んで自前で横取りするようにしてみては。
0716デフォルトの名無しさん
2007/08/24(金) 03:55:14GV-VCP3R/PCI はダメ?
これでアプリ書いてるけど普通に
S-Video×1、コンポジット×2の
キャプチャデバイスとして見えてる。
もっとも玄人志向のTVチューナ付きに比べると
かなり高いのが難点やなあ。
0717デフォルトの名無しさん
2007/08/24(金) 05:13:32ttp://www.gdcl.co.uk/articles/MultipleGraphs.pdf
0718デフォルトの名無しさん
2007/08/24(金) 16:03:37「DirectShow.dllにアクセスして・・・云々」って書いてあるんです
けど、PlatformSDKインスコしてもDirectX9.0cインスコしても、そん
なのどこにもないんですよー。DirectShow.dllって自前で作るんです
か?どうやって?
0719デフォルトの名無しさん
2007/08/24(金) 16:15:310720デフォルトの名無しさん
2007/08/24(金) 17:17:030721デフォルトの名無しさん
2007/08/25(土) 03:22:010722デフォルトの名無しさん
2007/08/26(日) 21:55:50すげえな
0723デフォルトの名無しさん
2007/08/28(火) 01:56:12たぶん
0724デフォルトの名無しさん
2007/08/28(火) 12:40:56Inflateで格納されてたらNG
0725デフォルトの名無しさん
2007/08/28(火) 17:54:30関連付けの都合なんかで.zip.mp3なんて拡張子が付けられていることも当たり前。
0726デフォルトの名無しさん
2007/09/03(月) 00:13:21Media Plyaer SDKと戦っているんですが、
どっかわかりやすいwebページありませんか?
散々ぐぐったけど日本語で書いてあるのはGoogleキャッシュにのこってた
1サイトしかありませんでした。
http://72.14.235.104/search?q=cache:msvxh08gfA0J:developer.mine.nu/
wiki/index.php%3FWMPSDK%252FDSP%25A5%25D7%25A5%25E9%25A5%2
5B0%25A5%25A4%25A5%25F3%25B2%25F2%25C0%25E2+%E3%81%82%E3%8
1%84%E3%81%9D%E3%81%B3%E3%80%80%E9%96%8B%E7%99%BA+Meida+Player+SDK&hl=ja&ct=clnk&cd=4&gl=jp
0727デフォルトの名無しさん
2007/09/06(木) 04:28:02それを読み込んだアプリケーションの終了時にメモリリークが出る
最初は解放の手順が間違っているのかなと思ったんだけど
Grapheditでそのフィルタを読み込んだときも、終了時にエラーがでる。
CTransformFilterを継承しているインプレイスフィルタでも同じ
考える限りSDKにうついているCTransformFilter自体に根本的なバグが隠れている気がするんだが…
0728デフォルトの名無しさん
2007/09/06(木) 05:01:530729デフォルトの名無しさん
2007/09/07(金) 17:17:21一度接続したフィルタの画像サイズを変更することは可能でしょうか?
実際にやりたいこと
320*240で描画していたところを途中から640*240サイズのストリームを
描画する方法があれば教えてください。
CBaseOutputPinで作成しております。
0730デフォルトの名無しさん
2007/09/07(金) 21:59:210731デフォルトの名無しさん
2007/09/10(月) 19:08:17フォーマットチェンジはどのようにすればいいですか?
(追記)
CTransformFilterからの派生でGetMediaTypeを使用して出力ピンの情報を取得
し、変更をこころみたんですがだめでした。
0732デフォルトの名無しさん
2007/09/11(火) 23:13:08あと、入力、出力両方のメディアタイプをかえたいの?
0733デフォルトの名無しさん
2007/09/12(水) 15:59:31停止してピンの再接続はOKです。
(停止せずに出来るのであればベターです)
変更は出力のみの変更です。
0734デフォルトの名無しさん
2007/09/12(水) 21:17:40ダウンストリームが受け入れるかどうかはフィルタ次第ばい
0735デフォルトの名無しさん
2007/09/13(木) 11:02:14サンプルのフラグを立てるとはどのようにすればいいですか?
YV12などのグラフィックボード依存のフォーマットでなくRGBで接続しているので
サイズ変更で受け入れが出来ないことは考慮してないです。
0736デフォルトの名無しさん
2007/09/13(木) 20:53:53受け取る相手が何をするのか書いてあるからチェックチェック
0737デフォルトの名無しさん
2007/09/14(金) 11:32:34Receive関数の引数IMediaSample *pで出力先のピン情報は取得
出来るのですが書き換える(更新する)方法がわからないです。
SetMediaTypeで新規情報(サイズ変更)を設定しても初期設定の
情報は書き換わってないです。
0738デフォルトの名無しさん
2007/09/14(金) 14:49:08SetMediaType なんかじゃ済まず、アロケートし直しが必要になってくるような気がする。
0739デフォルトの名無しさん
2007/09/14(金) 15:34:32サンプルバッファのサイズは変更しません。
初期値で必要な最大サイズを設定しています。
メディアタイプでの変更はサイズのみです。
VIDEOINFOHEADERで設定するbiWidth,biHeightの値のみの変更です。
0740デフォルトの名無しさん
2007/09/14(金) 15:36:05↑
>>738様でした。
0741デフォルトの名無しさん
2007/09/15(土) 08:05:23Vistaで、bcdedit /debug onを実行すると、MPEGのDecodeが動作しなくなります。
Q1 これはProtected Media Pathのせいなんでしょうか?それとも、Vistaに付属しているMPEG Decoderの仕様なんでしょうか?
Q2 MPEG Decoderの仕様だとしたら、Kernel Debugできる環境で動く他のMPEG Decoderはありますか?
0742デフォルトの名無しさん
2007/09/15(土) 16:23:02表示を切り替えるプログラムを作成しています。
SDK内のサンプルプログラムBlenderでは、
2つのファイルの同時再生/透過率変更は行えるようですが、
個々のファイルに対し、再生/停止/シークといった制御が
行えません。(再生時には2つ同時に再生されてしまう)
このようなプログラムを開発する場合、何か参考になる
情報がありましたらお教え下さい。
0743デフォルトの名無しさん
2007/09/15(土) 23:15:41ムービーのアスペクト比を取得するにはどうしたらいいでしょうか?
アスペクト比が設定されているのですがIBasicVideo2が使えない状況に
ありまして困っております。
0744デフォルトの名無しさん
2007/09/18(火) 14:02:47Q1. (DVD再生時以外は)おおむねベンダ独自の耐タンパの仕組みのせい。
Q2. ffdshow
0745デフォルトの名無しさん
2007/09/18(火) 17:30:330746デフォルトの名無しさん
2007/09/20(木) 08:59:09Geekなページの記事を見ながら、チューナからの動画は表示(プレビュー?)できたのですが、音が出ません。
音周りの処理が書かれている様子もないので当然だと思うのですが、それに関する情報が見当たりません。
MSDNの概要あたりを眺めてもみました。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdx8_c/ds/appdev/capture_intro.asp
眺めてみたのですが、どのインターフェイスを使えばいいのかわかりません。
IAMAudioInputMixerかと思っているのですが、メソッドを眺めるとミキサ全体のようでこれだけではないような気がします。
この辺りの情報ってありませんか?
ヒントがいただければと思います。
0747デフォルトの名無しさん
2007/09/20(木) 15:13:220748デフォルトの名無しさん
2007/09/20(木) 15:18:56クロスバー
0749デフォルトの名無しさん
2007/09/22(土) 06:17:44何?やる気がありません?なら辞めろや、他の派遣雇うからw
0750デフォルトの名無しさん
2007/09/23(日) 18:56:300751デフォルトの名無しさん
2007/09/24(月) 20:52:13これをプログラムとして記述する際、困ったことが起きました。
フィルタを生成するのにCoCreateInstance関数を使いますが、このとき必要なGUIDが
分からないフィルタがあるんです。
Microsoftから標準で提供されているフィルタはMSDNを調べればGUIDが分かりますが、
そうでないフィルタは分かりません。
どうすればそのフィルタのGUIDを知ることができるでしょうか?
ご助言、よろしくお願いします。
0752デフォルトの名無しさん
2007/09/24(月) 21:18:100753751
2007/09/24(月) 21:32:35すみません、どこを見ればよいんでしょうか?
例えば、NullレンダラーのGUIDは
{0xc1f400a4, 0x3f08, 0x11d3, {0x9f, 0x0b, 0x00, 0x60, 0x08, 0x03, 0x9e, 0x37}}
ですが、
GraphEditを見てもこの記述があるところが見つけられません。
0754デフォルトの名無しさん
2007/09/24(月) 23:46:54メニューの[Graph]-[Insert Filter] から ダイアログ立ち上げたら
DirectShow Filter -> NULL Renderer 選んでください。んで、展開すると Display Name の後に
@device:sw:{083863F1-70DE-11D0-BD40-00A0C911CE86}\{C1F400A4-3F0B-006008039E37}
ってあるよね。
後半の { } を見てくれ。これってGUIDじゃない?
君に幸あれ
0755デフォルトの名無しさん
2007/09/24(月) 23:51:19最悪、フィルタ名でレジストリ検索したりとか、まあ頑張ってください
0756デフォルトの名無しさん
2007/09/24(月) 23:56:18Guidにしては何か微妙に短いと思ったw
0758デフォルトの名無しさん
2007/09/25(火) 00:14:29困ったらまたおいでお嬢さん
0759デフォルトの名無しさん
2007/09/25(火) 02:34:15有識者だけどおっちょこちょいの>>752(褒め言葉)で盛り上がるスレはここですか。
0760デフォルトの名無しさん
2007/09/25(火) 07:12:460761デフォルトの名無しさん
2007/09/25(火) 10:24:35どのようにコーディングしたら良いでしょうか。
0762デフォルトの名無しさん
2007/09/25(火) 20:04:080763デフォルトの名無しさん
2007/10/02(火) 15:58:31QuartzTypeLib.dllに参照設定して
RenderFile()→各種設定→Play()
とすると(初回だけ)再生出来るのですが、もう一度別のファイルを
RenderFile()したあと、IVideoWindowを再取得して
スタイルを設定しようとしたところで0x80004002が発生します。
MSDNによると再度RenderFile()するためにはフィルタを全削除しろと
あるのですが、QuartzにはEnumFilters()やRemoveFilter()がないので
やむなくいったんFilgraphManagerを解放→GC.collect()してから
RenderFile()しても、結局上記と同じ場所で例外が起きてしまいます。
アドバイスよろしくお願いします。
0764デフォルトの名無しさん
2007/10/02(火) 20:53:59中で使われているフィルタが怪しい
0765デフォルトの名無しさん
2007/10/02(火) 20:55:26自作の変換フィルタ間に入れてデータがLRとなっているのをLLかRRにすればいいんじゃないの?
0766デフォルトの名無しさん
2007/10/02(火) 21:28:38単純にどんどんファイルを読んで再生とかやると継ぎ目に真白なフレームがはさまったり汚くなってしまいます
音なしのAVIなのでそこまでシビアにつなげられなくてもいいのですが
映像として奇麗につなげるには
グラフ内でソースをどんどん切り替えていく、って形になるんでしょうか?
0767763
2007/10/02(火) 22:41:48やはりそんなところですかね…。
ただ一応、開発ターゲットの端末に添付の再生アプリでは
ふつうに別のファイルを再生できるので、回避策はあるのかも知れません。
フィルタを削除するさいにやっておく後始末とかって
何かあるんでしょうか。
0768763
2007/10/03(水) 02:39:01試しに思い切ってQuartzTypeLib.dllを参照する方法を止め、
[ComImport, Guid(...), ...] interface IGraphBuilder ... { ... }
と手動で定義する方法(DirectShowNetで採用してるもの)にしたら
ちゃんと動くようになりました。
typelibでラップする方法の不具合かな? CE限定なのかは謎。
ちなみにその端末だとやっぱりIEnumFiltersは取得できても
Next()で未実装エラーが戻りました。とにかくCE要注意。
0769デフォルトの名無しさん
2007/10/03(水) 17:59:04再生リスト(.wpl)使えば順番に再生してくれる
0770デフォルトの名無しさん
2007/10/03(水) 18:00:04たまたまかもよ
デバッガで追うべし
0771デフォルトの名無しさん
2007/10/03(水) 22:06:41音なしのAVI程度なら avi 関連 API と DrawDibDraw で・・
0772768
2007/10/04(木) 05:29:28や、これまで再現率100%だったのがこの改良で全く出なくなったので、
対処方法としてはこれで間違いなさそうです。
COM相互運用(マネージドとCOMのやり取り)はけっこう高度な
トピックらしいですね。するとCEは関係ないかも。
一度QuartzTypeLib.dll(tlbimpというツールに自動生成させる)を
解析したものと、DirectShowNet方式の手動定義を比較して、
ちゃんとした原因を突き止めてみたいです。
0773デフォルトの名無しさん
2007/10/07(日) 18:30:13DirectShowで再生してる動画の上にテキストを置きたいんですけど(ニコニコ動画みたいな感じに)
普通に再生している動画をSetWindowPositionでウィンドウに表示させて、そのウィンドウの子ウィンドウとして
スタティックコントロールを動画の上に置こうとすると、動画の下に隠れてしまいます。
WS_EX_TOPMOSTを指定しても隠れてしまいました。
そこで、SetWindowPositionでウィンドウに動画を表示させるのをやめて
グラバフィルタでフレームを取得して、フレームを取得するごとに呼ばれる
コールバック関数内で取得したフレームをウィンドウに再描画するという形にしたところ
スタティックコントロールが上手く見えるようになりました。
しかし、今度は動画の再生が進むうちに動作が重くなってしまい、コマ飛びが起きるようになってしまいました。
コマ飛びが起きないような方法はないでしょうか。
0774デフォルトの名無しさん
2007/10/07(日) 18:38:020775773
2007/10/07(日) 19:08:58ありがとうございます。
VMRについて少し調べてみたんですが、確かに動画とテキストを合成して
表示するような形にすれば出来そうです。
ただ、773に書いたような方法ではテキストは表示せずに動画を再生しているだけで
重くなってしまいます。
VMRを用いて、動画とテキストを合成して再生する方法だと、動画再生自体が重くなる
ようなことはなくなるでしょうか。
0776デフォルトの名無しさん
2007/10/07(日) 20:46:420777デフォルトの名無しさん
2007/10/07(日) 22:05:35自分の書いたプログラムが悪いのに、他に原因があるように思っている時点で、
どうやって処理させても結果は同じ。
0778デフォルトの名無しさん
2007/10/09(火) 19:36:44をもとに、ISampleGrabberCBインタフェースの実装を試みているのですが、
『error C2512: 'CUnknown' : クラス、構造体、共用体に既定のコンストラクタがありません。』
『error C2614: 'mySampleGrabber' : イニシャライズ リスト内のクラス 'Cunknown' が基本クラスでもメンバでもありません。』
の2つのエラーが出てしまいます。ヘッダファイルやリンクの問題は解決したと思うんですけど
C++に慣れていないのでここからどう直せばいいかが分かりません。
以下、ソースです(行数の関係で詰めているので見にくいと思いますが…)
class CGrabCB: public CUnknown, public ISampleGrabberCB{
public:
DECLARE_IUNKNOWN;
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv) {
if( riid == IID_ISampleGrabberCB ){
return GetInterface((ISampleGrabberCB*)this, ppv);
}
return CUnknown::NonDelegatingQueryInterface(riid, ppv);
}
// ISampleGrabberCB のメソッド
STDMETHODIMP SampleCB(double SampleTime, IMediaSample *pSample){
return E_NOTIMPL;
}
STDMETHODIMP BufferCB(double SampleTime, BYTE *pBuffer, long BufferLen){
cerr << "Sample time: " << SampleTime << "\t";
cerr << "BufferLen: " << BufferLen;
cerr << endl;
SaveOneImage("C:\\tmp.yuv", pBuffer, BufferLen); // 後に定義する
return S_OK;
}
// コンストラクタ
CGrabCB( ) : CUnknown("SGCB", NULL){ }
};
0779デフォルトの名無しさん
2007/10/09(火) 20:45:340780778
2007/10/09(火) 21:49:39今度は部分DECLARE_IUNKNOWNマクロで実装されているAddRef()周りが原因で
プログラムを起動した瞬間強制終了してしまいます。
DECLARE_IUNKNOWN部分を自分で実装して、AddRef()のみ実装しないようにしたところ
一応動作はするようになりました。
AddRef()を実装するために、他に実装する何かがあるのでしょうか。
0781デフォルトの名無しさん
2007/10/09(火) 23:38:58pCaptureGraphBuilder2->SetOutputFileName( &MEDIASUBTYPE_Avi , キャプチャファイルのパス , &pFileOut , &pSink );
pFileOut : AviMux( IBaseFilter型 )
pSink : ファイルライタのインターフェイス( IFileSinkFilter型 )
キャプチャ終了後、AviMuxのピンを切り離し、プレビュー用のグラフ再生を行うと、ファイルライタが
グラフ内に残っているため、それによって作成したファイルが使用中となって再生できません。
キャプチャが終了したファイルはすぐに再生して確認できるようにしたいのですが、
(現状はグラフ停止中かアプリを終了しないと再生できません)
どのようにすればよいでしょうか?
上記のような便利なユーティリティ関数を使わず、地道にファイルライタ( IBaseFilter型 )の
インスタンスを作成して、ファイル名の設定、フィルタグラフの構築、と進め、キャプチャ終了後、
ファイル名を変えるかファイルライタを削除するかなりをしないといけないでしょうか?
0782デフォルトの名無しさん
2007/10/10(水) 03:18:00HRESULT CGrabRenderer::DoRenderSample(IMediaSample *pMediaSample) {
HRESULT hr=S_OK;
CAutoLock mylock(&m_CritSec);
LPBYTE pbSrc=NULL;
const long lActualSize=pMediaSample->GetActualDataLength();
pMediaSample->GetPointer(&pbSrc);
// 表示ウィンドウからデバイスコンテキストを取得して描画
if(IsWindow(m_hwnd)==TRUE) {
BITMAPINFO bi={m_Vih.bmiHeader};
const HDC hdc=GetDC(m_hwnd);
RECT rect;
GetClientRect(m_hwnd,&rect);
StretchDIBits(hdc,0,0,rect.right-rect.left,rect.bottom-rect.top
,0,0,m_Vih.bmiHeader.biWidth , m_Vih.bmiHeader.biHeight
,pbSrc,&bi,DIB_RGB_COLORS, SRCCOPY);
ReleaseDC(m_hwnd,hdc);
}
return hr;
}
この実装方法をインターネット上のソース等を参考に試したのですが、音声だけが再生され、画像が表示されません。
pMediaSample->GetPointer(&pbSrc);でpbSrcにビットマップを読み込んでいると思っていたのですが、MSDNを参照したところ
GetPointer()は引数のバッファへのポインタを返すだけなようです。そうすると、直前で宣言、しかもNULLを代入しているpbSrcへの
ポインタを取得したところでビットマップを読み込めていないのではないかと考えたのですが、IMediaSampleでの画像の読み込み方法が
分かりません。
長文ですみません。
DoRenderSampleはどのように実装したら良いのでしょうか。
0783デフォルトの名無しさん
2007/10/10(水) 03:23:300784デフォルトの名無しさん
2007/10/11(木) 18:55:44を元に、DirectShowで擬似ストリーミングを行おうと思ったのですが
ネットワークからダウンロード中はプログラムが固まってしまい
ダウンロードが全て完了したら再生出来るような形になってしまいます。
単にファイル名をネットワーク上のファイルにするだけでは駄目ということでしょうか。
これだとローカルにファイルを落として、そのローカル内のファイルを
再生するのと変わらないので意味がないのですが、DirectShowで
ストリーミングを行う場合、自作のソースフィルターを作らないといけないのでしょうか。
出来れば完全なストリーミング、難しければ擬似ストリーミングを考えています。
0785781
2007/10/12(金) 21:50:32pSink->SetFileNameで名前を変更すれば録画ファイルは解放されました。
0786デフォルトの名無しさん
2007/10/17(水) 19:07:53を作成したいのですが、お勧めの書籍などありましたらご教授願えないでしょうか。
directxやdirectshowには触れたこともない初心者なのですが、これは無謀というも
のでしょうか?
0787デフォルトの名無しさん
2007/10/17(水) 20:06:54ライブラリでも何でも探してみるとよろしいかと
0788デフォルトの名無しさん
2007/10/17(水) 20:36:160789デフォルトの名無しさん
2007/10/17(水) 20:50:460790デフォルトの名無しさん
2007/10/18(木) 04:16:210791デフォルトの名無しさん
2007/10/18(木) 04:17:56ttp://www1.bbiq.jp/kougaku/link_videocap.html
が参考になると思う
0792デフォルトの名無しさん
2007/10/18(木) 14:03:41サポート外なら
DirectShowでカメラ画像取得→画像形式変換→OpenCVで処理
という手が使える・・・ちょっと面倒くさいが
0793デフォルトの名無しさん
2007/10/25(木) 18:25:240794デフォルトの名無しさん
2007/10/25(木) 18:40:251.5倍速再生で声が甲高くならないように、とか?
オーディオレンダラの前にフィルタを追加して、
再生速度に応じてピッチを変更する。
ピッチ変更の処理の実装にはLGPL のライブラリなんかもあるね。
ttp://www.surina.net/soundtouch/
GPL が嫌なら自分で作っても1.5倍位までならそう聞き苦しくないものが
簡単にできる。
0795デフォルトの名無しさん
2007/10/28(日) 03:51:40もしかして他スレで動画をフーリエ変換したいと質問されていた方かな?
そうだったらこんなところに誘導するような羽目になってすいません。
単にWebカメラから動画をキャプチャしたいというならdirectshow付属のgrapheditを使ってしまうのが楽だと思いますよ
grapheditから、フィルタを呼び出して
カメラとFilewriterフィルタを繋いで上げましょう。間に動画圧縮のフィルタを入れてもよいです。
あとは、aviutil等のツールから連番のbmpで吐き出してしまえばよいと思います。
(他のツールもあるかも)
directshow自体は、それなりにプログラム経験と能力のある人でも使い方覚えるだけで一月くらいはかかるので
大学の学部クラスで大学からプログラム覚えたとかなら苦労は避けられないかと・・・。
0796デフォルトの名無しさん
2007/11/01(木) 16:53:14DirectShowのデコーダフィルタ部で、オーディオのタグ情報(曲名など)は取得できないのでしょうか?
やりたい事は、MP3デコーダ(自作)でタグ情報を取得し、アプリに投げてやるという事です。
どうも上流のMPEG-1 Stream Splitterからは、タグのデータが流れてこない気がします。
例えば、先頭にタグの付いたMP3ファイルをDirectShowで再生すると、
デコーダにはタグ部のデータは渡されず、タグの後のフレームデータから渡されるようです。
入力ピンのWAVEFORMAT構造体の後ろにタグがあるかと考えましたが、そこにも無いようです。
どうかヒントをお願いします。
0797デフォルトの名無しさん
2007/11/01(木) 20:04:02もしスプリッタがタグ情報を流してくれるとするならば、ヘルプにどのように格納して渡すのか記しているはず。
一般的にはアプリケーションがそのMP3をパースしてタグ情報を引っ張り出して表示するんじゃないかな。
それともどっかに「タグ情報流すよ」みたいな記述があったの?
0798796
2007/11/02(金) 01:28:50いや無いですが、そういう要望があったので、可能なのかと思って質問しました。
何かのビデオで入力ピンのAM_MEDIA_TYPEのVIDEOINFOHEADERの後ろに
ヘッダが格納されていることがあったので、同じようにどこかにあるかと思っていました。
となるとデコーダからタグ情報を得るのは難しそうですね…
0799796
2007/11/05(月) 19:06:27スプリッタがこのインターフェイスを実装していました。
ということで解決しました。ありがとうございました。
0800デフォルトの名無しさん
2007/11/05(月) 19:44:070801デフォルトの名無しさん
2007/11/14(水) 19:09:38DVキャプチャしつつ同時に
プロキシファイルを作成しようと考えているのですが、
どんな方法が考えられるでしょうか。
MSDVからの出力をInfTeeでふたつに分けて
片方はDVAVIに落とし
もう片方はエンコード処理をしてプロキシファイルに落とす、というのは素人の考えでしょうか。
出来ればプロキシの方は5分単位で分割して複数ファイル作りたいです。
DirectX,Window SDKs共に最新のものをインストールしてあります。
ご教授宜しくお願いします。
0802デフォルトの名無しさん
2007/11/14(水) 20:03:22それでもいいですけど、Inplace フィルタを作って、そ奴が間に入って素通ししつつ
プロキシファイルも作るって方が簡単だと思いますよ。
性能面で余裕があるなら、標準入力から DV ストリームを受け取って
プロキシファイルを作るexeを CreateProcess してパイプで流すとか
そんな構造にするとデバグも楽です。
0803デフォルトの名無しさん
2007/11/14(水) 20:56:58ありがとうございます。
Inplaceフィルタと聞いてパッと浮かんでこないですが
イメージ的にFileWriterフィルタの機能を持たせつつOutPutで
入力されたストリームを流すということでしょうか
フィルタを作るというのが想像できなくて
素人が1から作れるものでしょうか。
作る上で802さんが参考になられたサイトとかありますでしょうか。
0804デフォルトの名無しさん
2007/11/15(木) 15:18:17そんな感じです。
NullNull フィルタサンプルを改造してゆくのが一番簡単・・・
と思ったんですが、現行の SDK には含まれていないのかな。
だとすると tee で分けて Dump フィルタの改造版で書いてゆくのが
いいかも知れませんね。
マルチスレッドのプログラミングに慣れていれば(あるいは慣れる気があるなら)、
普通のフィルタを素人が1から作るのはそう難しくはありません。
(ソースフィルタやスプリッタ、パーサは別。これらは結構難しい)
参考になるサイトはありません。
0805デフォルトの名無しさん
2007/11/15(木) 20:49:37ありがとうございます。
NullNullフィルタサンプルは見つかりませんでしたが
Dumpフィルタを改造してみます。
もうひとつ問題にあたってしまって
エンコードするほうの処理ですが
Splitter→(V)DVDecoder→ASFWriter(V)
→(A)→→→→→→ASFWritter(A)
とGraphEdit上で接続、ビデオのほうは繋がりましたが
オーディオの方が「中間に必要な…」というメッセージが出てしまい
繋ぐことが出来ません。
実はDVキャプチャといいましても
HD(TV局などで使う機器、出力解像度は1920*1080)で
音声の周波数が48kHzのようです。
一般的なDVのほうは上記のフィルタ構成で接続確認は出来ました。
こちらは32kHzらしくてAsfWriterが32kHz以上対応していないんじゃないかと思い
調査していましたが情報は手に入らず・・・。
何か知っていればご教授下さい。
0806デフォルトの名無しさん
2007/11/16(金) 12:51:26ちょっとわからない事がありましたのでどなたか教えていただけないでしょうか。
プロパティページの OnReceiveMessage で、マウス関係のメッセージを拾ってくれません。
INT_PTR CHogeProperties::OnReceiveMessage(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_MOUSEMOVE:
Point_x = LOWORD(lParam);
Point_y = HIWORD(lParam);
//ここにフィルターへマウス座標を通知するコードを書く
return (LRESULT) 1;
}
return CBasePropertyPage::OnReceiveMessage(hwnd,uMsg,wParam,lParam);
}
これじゃダメなんでしょうか。
WM_LBUTTONDOWN とか WM_LBUTTONUP なんかも拾ってくれないのですが・・。
こちらが提供すべき情報で、これ以外に何か必要なものがありましたら指摘していただけませんか。
0807デフォルトの名無しさん
2007/11/19(月) 21:07:55差分タイムを指定して、mpeg2動画のスクリーンショットを取得しようとしています。
�@指定:100 100秒ごとに画像取得
�A指定:1 1秒ごとに画像取得
しかし、プログラム動作がうまくいったと思っても、上記のような指定をした際に
�@での100秒時の画像と �Aでの100秒時の画像 が食い違う現象がおきてしまいます。
(違うといっても誤差1秒程度のもののようですが・・)
上記の関数を使って mpeg2から確実に指定位置の画像を取得する方法を知りたいのですが・・。
0808デフォルトの名無しさん
2007/11/19(月) 23:24:30よく状況がわかんないけど�Aが間に合ってないの?
0809デフォルトの名無しさん
2007/11/20(火) 03:00:490810デフォルトの名無しさん
2007/11/20(火) 06:38:41少々長くなりますが、詳細を書いてみます。
今現在は、このような形になっています。
n100TimePos //nsec時間
pSampleGrabber->SetOneShot(true); //サンプルが届く度にグラフを停止
pMediaSeek->SetPositions(&n100TimePos, AM_SEEKING_AbsolutePositioning, NULL, AM_SEEKING_NoPositioning); //指定位置へのシーク
pMediaControl->Run();
Sleep(3000); //必要はないです SetOneShot の動作確認のために入れたものです。
long param1, param2; loop = true;
while( loop ){
hr = pMediaEvent->GetEvent(&evCode, ¶m1, ¶m2, 100);
if( hr==S_OK ){
switch( evCode ){
case EC_COMPLETE : //イベント確認
printf("EC_COMPLETE\n");
pMediaControl->Stop();
loop = false;
break;
default:
printf("------\n");
break;
}
}
else{
printf("loop\n");
}
}
pSampleGrabber->GetCurrentBuffer(&nBufferSize, (long *)(rgbImg)); //イメージ取得
0811デフォルトの名無しさん
2007/11/20(火) 06:47:49hr = pMediaEvent->GetEvent(&evCode, param1, param2, 100);
理解の仕方が間違えているとまずいので質問します。
上記のようにsleepを挟むと 指定時間からかなりずれた画像が取得されます。
SetOneShot(true);によって グラフの動作は停止するはずなので Sleepを入れても問題ないと思ったのですが
実際には サンプルが届いても停止していないのでしょうか?
また、下記でGetEventによりイベント取得をしていますが、
GetState関数で Running や Stopped を参照していた際は いつまでたってもRunningが来続けていました。
SetOneShot(true); はサンプルを行った際にグラフを停止するとの事だったので、Stop に切り替わるものと
考えていたのですが、考え方が違うのでしょうか・・。
多分、この辺りの理解が間違っているから、今のような状況に陥っているような気がするのですが・・。
他にも、StopWhenReady や WaitForCompletion など色々組み合わせてもうまくいかないので
ご教授願えるとありがたいです。
やりたい事は、最初に書いたとおり
pMediaSeek->SetPositions と pSampleGrabber->GetCurrentBuffer を使い
差分タイムを指定して、mpeg2動画のスクリーンショットを取得しようとしています。
です。
0812デフォルトの名無しさん
2007/11/20(火) 06:52:01こちらとしては、どんなに処理が重いときでも、
処理が間に合ったから取れたとかでなく、同じタイム指定を行ったときは同じ画像が得られることを期待したいのです。
0813810〜812
2007/11/20(火) 12:04:08これからテストを重ねて検証してきます
お騒がせしました
0814デフォルトの名無しさん
2007/11/20(火) 12:33:21とりあえず回避策として一度DVEncoderを使ってDVMuxで
映像と音声と同期させた後、もう一度DVSplitterで映像と音声を分けて
AsfWriterに繋ぐことができました。
またまた質問になってしまいますが
テープが録画可能状態かというの情報はどうしたら取得できるでしょうか。
GraphEdit上でMSDVのプロパティページを開くと
テープのつめの状態で書込み可能か書込み出来ないか出来ています。
IAMExtDeviceかIAMExtTransportが怪しいのですが
それらしいメソッドが見つかりませんでした。
IAMExtDeviceのED_DEVCAP_CAN_RECORDと思ったのですが
テープのつめを変えてもステータスの戻り値に変化ありませんでした。
DirectShowサンプルのDVCapにもそれらしい記述は見当たりません。
どうかもう一度ご教授下さい。宜しくお願いします。
0815デフォルトの名無しさん
2007/11/26(月) 22:00:16現在ストリーミングサーバとしてWindos Media サービスを使い
Windows Media Format 11 SDKで作った動画プレイヤーで
MMSプロトコルのストリーミング再生を行っています。
但し、MMSプロトコルですとシークの度にバッファリングが起きてしまい
再生速度を変えるためにIWMReader::Start()を呼び出すと、その度に
バッファリングが起きてしまいます。
MMSプロトコル、Windows Media Format 11 SDKで、バッファリングを起こさずに
スムーズな再生速度変更を行う方法はないでしょうか。
0816デフォルトの名無しさん
2007/11/26(月) 23:08:19バッファリングを起こさないためにはResumeメソッドを呼べ、って書いてるけど、これじゃだめなのかな?
(再生速度は変更できない、とか?)
Any call to Start while paused is treated as a seek through the file, and incurs a buffering penalty from
network files. This is true even for calls to Start with the WM_START_CURRENTPOSITION value.
To continue playing from the current paused position with no buffering penalty, call Resume.
0817815
2007/11/26(月) 23:17:56ありがとうございます。
一旦Pauseして、Resumeすれば再生速度も1倍になるかもしれないと思ってやってみましたが、無理でした。
PauseしないでResumeすると、やはり何も起こりません。
再生速度のみ変更するような関数があればよかったのですが・・・。
0818デフォルトの名無しさん
2007/11/26(月) 23:29:140819デフォルトの名無しさん
2007/11/27(火) 17:15:28GraphEditを使いながらいじってのですが
なぜか一度Video,Soundレンダラを通して
グラフを再生させないとAsfWriterのAuidoが繋がりません。
一度レンダラを使ってグラフを再生させると何が変わるのでしょうか。
0820デフォルトの名無しさん
2007/11/28(水) 03:17:100821デフォルトの名無しさん
2007/11/28(水) 17:03:37ありがとうございます。
原因を調べてみる必要がありますが、
とりあえず動いたみたいなのでこれで良しとします。
0822デフォルトの名無しさん
2007/11/29(木) 20:56:27個人趣味ならいいけど仕事だと気持ち悪いよねぇ…
0823デフォルトの名無しさん
2007/11/29(木) 22:13:14連動して動くアプリの場合はある程度しようがないよ。
0824デフォルトの名無しさん
2007/11/30(金) 00:06:410825デフォルトの名無しさん
2007/12/02(日) 23:34:36WCHAR wszFileName[260];
MultiByteToWideChar( CP_ACP, 0, name, -1, wszFileName, 260 );
hResult = g_pGrph->RenderFile( wszFileName, NULL );
if( FAILED(hResult) )MessageBoxA(hWindow,"PlayShow()内 その名前のムービーはないです","PlayShow No2",MB_OK);
// フィルタ グラフの構築
hResult = g_pGrph->QueryInterface( IID_IMediaControl, (LPVOID *)&g_pMdaCtrl );
hResult = g_pGrph->QueryInterface( IID_IVideoWindow, (LPVOID *)&g_pVdoWin );
hResult = g_pGrph->QueryInterface( IID_IMediaEvent, (VOID **)&g_Event2 );
// ウィンドウ内で出力
RECT grc;
g_pVdoWin->put_Owner( (OAHWND)hWindow );
g_pVdoWin->put_WindowStyle( WS_CHILD | WS_CLIPSIBLINGS );
GetClientRect( hWindow,&grc );
g_pVdoWin->SetWindowPosition( 0,0,grc.right,grc.bottom );
// フィルタ グラフの開始
g_pMdaCtrl->Run();
// ムービーが終わるまでここから先へは進ませない
g_Event2->WaitForCompletion(INFINITE,&g);
if ( g == EC_COMPLETE ){
no.movie_end = 1;
UninitShow();
}
音だけしか出ません;;
なにかご指摘があるのならお願いします
0826デフォルトの名無しさん
2007/12/02(日) 23:50:30から
// フィルタ グラフの開始
までをいじくるとなんとかなりそう
0827デフォルトの名無しさん
2007/12/03(月) 14:13:43あとウィンドウ操作しといメッセージポンプ止めるなんて、Windows を舐めてるよ。
0828デフォルトの名無しさん
2007/12/03(月) 17:01:26既にVistaでは、新しくMedia Foundationが出ていて、
これがDirectShow後継になっている。
0829デフォルトの名無しさん
2007/12/04(火) 00:54:25役立たずは黙ってろよカス
0830デフォルトの名無しさん
2007/12/04(火) 08:58:16827 のは
> // ムービーが終わるまでここから先へは進ませない
> g_Event2->WaitForCompletion(INFINITE,&g);
のせいでメインのメッセージループ止まってて描画命令飛んでないんじゃないのという
非常に的を射たエスパー回答だと思うぞ。
0831デフォルトの名無しさん
2007/12/14(金) 12:54:00USBで接続されたビデオキャプチャ IO-DATAのGV-MVP/RZ3の
アナログビデオ入力(RGB)にカメラをつないで、
まずは、画像をプレビューしようかと考えています。
参考にしようと思ったプログラム、
http://www.geekpage.jp/programming/directshow/list-capture-device-3.php
を、コンパイルすることはできたのですが、うまく動きませんでした。
(ライブラリのリンクはできました。)
デバイス選択のところで、製品名のRZ3は認識しているようなのですが、
HRESULTをチェックしていくと、
// Graphを生成する
pCaptureGraphBuilder2->RenderStream(&PIN_CATEGORY_PREVIEW,
NULL, pDeviceFilter, NULL, NULL);
のところだけ、S_OKでなく、VFW_E_CANNOT_CONNECTが返ってきました。
&PIN_CATEGORY_PREVIEWのところを、
&PIN_CATEGORY_CAPTURE や &PIN_CATEGORY_VIDEOPORT
に変えてもエラーをはいてしまいます。
周りに相談できる方が折らず、困っています。
どなたか、ご助言いただけませんでしょうか?
OSはXP home SP2に
Windows Server 2003 SP1 SDK
DirectX SDK 2007
Microsoft Visual C++ 2005で開発しています。
お手数かけますが、どうかよろしくお願いいたします。
0832デフォルトの名無しさん
2007/12/15(土) 01:53:41・GraphEditでの動作結果
・デバイスの情報
(デバイスマネージャの出力とか同じとこのサンプルプログラムとかインターフェース問い合わせるとか)
とかがあると答えやすいかも
0833831
2007/12/17(月) 15:38:32お手数かけまして申し訳ありません。ありがとうございます。
いくつかご指摘の点を実行してみましたので、
下記の通り、どうかよろしくお願いいたします。
少し前のサンプル結果としてmpgファイルの再生。
http://www.geekpage.jp/programming/directshow/renderfile.php
は成功しました。
デバイス情報を表示するサンプルからは、
FriendlyName : Python2 USB WDM Encoder RZ3
Description : Python2 USB WDM Encoder RZ3
DevicePath : \\?\usb#vid_04bb&pid_0519#6&25ee13b8&0&2#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global
となりました。
graphedit使ってみたところ、
フィルターから
Python2 USB WDM Endoderが見つかりました。
入力は、RGB入力と(おそらくです。文字化けしていました)
Audio inが見つかっています。
出力は、Mpeg out,Audio Preview,Index,VBI,Video Previewが見つかりました。
このまま、video renderの入力にVideo Previewをつなげようとしたところ、
「接続に必要な中間フィルタの組み合わせが見つかりませんでした。
エラーコード、0x80040217」
が出力されました。Mpeg Outのほうを、直接つないだり、mpeg decoderなどにつないでも
同様に中間フィルタの組み合わせが見つかりませんでした。
との結果を得ました。
ここで、詰まってしまいました。
不勉強のために不十分かとは思いますが、どうかご教授いただければ幸いです。
0834デフォルトの名無しさん
2007/12/17(月) 21:18:27とりあえず、GraphEditでVideo Preview Pinのプロパティを見て、MEDIASUBTYPEと出力サイズを調べる。
そこが変じゃないのなら、Video RenderとしてVMR9やOverlayなども試してみる。
0835デフォルトの名無しさん
2007/12/25(火) 12:11:57音量の変更の仕方をどなたか知ってる方いらっしゃいませんか?
プロファイルを指定して解像度なりビットレートは変えられています。
PCの音量を最大にしても人が喋ってる声とかがあまり聞こえないんです。
ちなみにAviの方ははっきり聞こえています。
0836デフォルトの名無しさん
2007/12/31(月) 23:33:07「半透明で」「最上面」に映し出すためのプログラムを書こうと思っています。
http://codezine.jp/a/article/aid/322.aspx
のプログラムを下記の環境でデバッグしたのですが、
VS2005 Pro SP1
MS Platform SDK for Server 2003 SP1
MS Direct X SDK Nov 2007
下記のようなエラーがでてきてしまいます。
エラー 2 error C2504: 'IDXEffect' : 定義されていない基本クラスが宣言されています。 c:\program files\microsoft platform sdk\include\qedit.h 980
自分の経験・勉強不足は十分承知しております。
解決方法をご教授していただければ幸いです。
0837デフォルトの名無しさん
2008/01/01(火) 23:49:53ニコニコ動画のXMLファイルを読み込んで
入力動画に表示するフィルタは需要ありますか?
エンコード一発で字幕付き動画作れるようになる
0838デフォルトの名無しさん
2008/01/02(水) 21:15:36てらほしいっす!
0839デフォルトの名無しさん
2008/01/03(木) 03:56:17てら微妙。
DirectShowフィルタ作ってももはやだめなのかな。
0840デフォルトの名無しさん
2008/01/04(金) 00:50:16とりあえず「半透明で」はなく「最上面」とは限らないプログラムの動作状況がわからないと
なんともしようがない
0841デフォルトの名無しさん
2008/01/04(金) 04:53:48ノシ
そんなの作ろうとしてDirectShow勉強しはじめた人間です
0842デフォルトの名無しさん
2008/01/04(金) 05:57:17魑魅魍魎な設計ここに極まれり
0843デフォルトの名無しさん
2008/01/04(金) 06:43:25マジで?
DirectShow部分は簡単だから一緒に作ろうか?
メールのやり取りでもしながらさ。
とりあえず、文字を右から左に送るフィルタでも作ってプロジェクト一式渡そうか?
XMLのタグをどう扱うかで勉強しようかと思っていたが需要ないから諦めかけてた
0844デフォルトの名無しさん
2008/01/04(金) 15:09:32エラーメッセージを見る限り、
デバッグ以前の問題でコンパイルが通ってない、
と思われるがその認識でよい?
手元の環境では IDXEffect は以下のファイルで宣言されている。
C:\Program Files\Microsoft DirectX SDK (August 2007)\Include\dxtrans.h
DirectX SDK Nov 2007 でも同様の場所にあると思われるので、
そこにインクルードパスが通っているかどうかを確認してみるべし。
0846デフォルトの名無しさん
2008/01/04(金) 19:39:53ほい。了解。
なら一日くらいかけて作るよ(とはいってもやる気出すのに半日使うだけだけど・・・)
ところでDirectShowのフィルタをビルドできる環境はあるかい?
0847841
2008/01/04(金) 21:05:16* Windows 2000 SP4
* VC++ 2005 Express Edition
* Microsoft Platform SDK for Windows Server 2003 SP1
* DirectX 9.0b SDK
ttp://www.geekpage.jp/programming/directshow/ のサンプルをビルドできたから多分大丈夫
0848デフォルトの名無しさん
2008/01/05(土) 07:42:07環境あわせようとしたけどVC2005とDXSDK9.0は相性悪いな〜。
0849841
2008/01/05(土) 09:04:57別のXPプレインスコマシンがあるのでそこに環境作ってみます。
0850デフォルトの名無しさん
2008/01/05(土) 10:50:14DX9.0c+VC6とVC2005+WindowsSDKこの2つの環境を作りました。
両方のプロジェクトファイルを付ければいいですね。
文字を画面に出すとこまで作ったけど環境作るのでへこたれた為、少しだれた
0852836
2008/01/07(月) 22:48:08レスありがとうございます
>>そこにインクルードパスが通っているかどうかを確認してみるべし。
といってもVC++自体初心者なのでインクルードパスの通し方がわかってないかもしれませんが…。
ツール>オプション>
プロジェクトおよびソリューション>VC++ディレクトリ
プラットフォーム:Win32
インクルードファイルのところに
C:\Program Files\Microsoft Platform SDK\Include
C:\Program Files\Microsoft DirectX SDK (November 2007)\Include\
と入れてあります。
これであってるでしょうか?
0853デフォルトの名無しさん
2008/01/08(火) 16:13:27おkです。
あと、ライブラリのパス(ライブラリファイル)の方も同様に設定しておかないと
リンク時に見つからないと怒られます。
0854デフォルトの名無しさん
2008/01/09(水) 21:37:09おーい。一緒に開発しよっせ。
こんなクソソースよめっかっとかでもなんでもいいからなんかないの?
0855デフォルトの名無しさん
2008/01/11(金) 15:28:360856デフォルトの名無しさん
2008/01/11(金) 21:47:02千里の道もまずはGraphedtから
0857836
2008/01/11(金) 22:42:04C:\Program Files\Microsoft DirectX SDK (November 2007)\Include\
の中にdxtrans.hがありませんでした。消したつもりはないので、最初から入ってないような気がするのですけど、
dxtrans.hってNov 2007には入っていないのでしょうか?
0858デフォルトの名無しさん
2008/01/11(金) 23:04:28どうもすいません、自己解決しました。
DreictX SDK November 2007
ではdxtrans.hが元々入っていないようです。
↓ここを参照しました。
ttp://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2617687&SiteID=1
0859デフォルトの名無しさん
2008/01/12(土) 07:33:47( ´-`).。oO(といってもいろいろ削って雛型作っただけ…)
( ´-`).。oO(GraphEditでは四角の箱がとりあえずでた…)
0860デフォルトの名無しさん
2008/01/12(土) 09:36:47×戦かってみた (たたかかってみた、いくさかってみた)
○戦ってみた (たたかってみた)
0861デフォルトの名無しさん
2008/01/12(土) 10:18:10( ´-`).。oO(こまかいことは気にしないでね…)
0862デフォルトの名無しさん
2008/01/12(土) 10:43:50DirectX+VMR9 を使ってムービーを再生させると WMP を
起動してないときに比べて滑らかに再生される...
timeBeginPeriod(1)やD3DPRESENT_INTERVAL_ONEは
指定してあるんだけどな何かあるのかなあ
0863デフォルトの名無しさん
2008/01/12(土) 11:20:360864862
2008/01/12(土) 17:04:10アロケータ・プレゼンタを使ってテクスチャに転送して
Direct3Dでポリゴン板に貼り付けて描画しています
一応それなりに再生できるのですが
少しカクカクするところがあって WMPで見ているようにはいかないですね
己の限界を思い知らされてますw orz
0865デフォルトの名無しさん
2008/01/12(土) 19:10:04視聴に耐えられないほど悪いのでマルチスレッド化して高速化したいのですが、
ffdshowも何故かシングルスレッドしか動いてないみたいなんですが、
DirectShowの デコード→変換フィルタで変換→レタリング の流れをマルチスレッド化する方法を知っていたら教えてください。どうかお願いします
0866デフォルトの名無しさん
2008/01/12(土) 23:25:23まさかデバッグ版が重いという落ちではないだろうな?
デバッグ版だとスタックチェック等でとんでもなく重くなるので本来のパフォーマンスはわからない。
あと、たいていはメモリの読み書きでもっとも時間を消費するので、少なくなるようコードを改良汁。
マルチスレッド化は、自分で別スレッドを作っておいてデータ処理の段階で、自スレッドと別スレッドで同時に処理を分散し
待機関数で別スレッドがすべて処理が終わるのを待って、処理を完了するってかんじ。シグナルはイベントを使うのが良い。
0867デフォルトの名無しさん
2008/01/13(日) 00:28:19レスありがとうございます
プロジェクトの設定を確認しましたがデバッグ版ではなく、ちゃんとリリース版でビルドしています
マルチスレッド化の話はたいへん参考になりました。難しそうですが、やってみます
0868デフォルトの名無しさん
2008/01/13(日) 15:01:04Novemver2007 では未確認でした…。スマンカッタデス。orz
リンク先のフォーラムの回答「August 2007 を使え」が泣けてくる。
この削除が MS による意図的なものとすると
→dxtrans.h をインクルードしている qedit.h が使えない
→qedit.h で定義されているクラスやインターフェース
(DirectShow 編集サービスや SampleGrabber など)が使えない
となる訳で、かなり影響があるんでは…。
0869デフォルトの名無しさん
2008/01/14(月) 18:53:580870デフォルトの名無しさん
2008/01/14(月) 23:16:38そんなAPIは知らないけどフィルタグラフ作って最初にソースファイルとレンダラ繋げば
自動挿入されるけど…?
インテリジェンス接続ってやつ
0871デフォルトの名無しさん
2008/01/14(月) 23:48:36って具体的に言うと
IBaseFilter* s = ソースフィルタ、 IBaseFilter* r = ヴィデオレンダラ
graph->AddFilter(s)、graph->AddFilter(r)
あとどうするの?
sとrのピンを直接繋ぐ?
0872デフォルトの名無しさん
2008/01/14(月) 23:52:12そんなのどこの解説記事にも書いてある基本中の基本なんだからやってみればいいじゃん
0873デフォルトの名無しさん
2008/01/15(火) 00:14:46このスレで何度も言っちゃってるんですが
Graphedtを使ってどうなるかシミュレーションしてからコード書いてください。
そしてコード直接貼っての質問は最終手段にしてくださいね
0874デフォルトの名無しさん
2008/01/15(火) 00:19:59> sとrのピンを直接繋ぐ?
はい。そうです。
メディアタイプが非圧縮YUVならフィルタはさまないでつながるし、
圧縮されていてもMPEG4のV2ならコーディックも挟んでくれますよ。
後は試してないから知らない
0875デフォルトの名無しさん
2008/01/15(火) 01:12:31どうもありがとう。ちょっとやってみる。
GraphEditではやってみたんだけどね、ダメだったから何か追加処理が必要だなと思って質問してみた
0876デフォルトの名無しさん
2008/01/15(火) 01:34:01下の文章も付けて質問した方が今後早い解決に繋がりそうですね。
コーデックに寄ってはフィルタの優先度を上げないと自動で繋いでくれないものもあります。
自分の環境だけでなくユーザーの使うような環境でもテストしてみましょう
0877monamona
2008/01/18(金) 13:06:38そうですね。
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2617687&SiteID=1
ここにjiapeiさんが書かれている方法を元に編集したら若干警告はあるもののビルドできました。
SampleGrabber も使えました。
私の環境における編集内容は下記です。
//#include "dxtrans.h" ・・・ 495行目
IDxtCompositor //: public IDXEffect ・・・ 979行目
IDxtAlphaSetter //: public IDXEffect ・・・1484行目
IDxtJpeg //: public IDXEffect ・・・1725行目
IDxtKey //: public IDXEffect ・・・2400行目
0878デフォルトの名無しさん
2008/01/24(木) 11:34:22ここのサイトの一番したのプログラムを使わしてもらったんですが、不具合が起きてます。
Windowは2つ出ますがなにもしないと一つは真っ黒、もう一つの画面に2つのカメラの映像が交互に出ているらしく、
合成したみたいな映像になっています。
どうしたらいいでしょうか?
0879デフォルトの名無しさん
2008/01/25(金) 22:13:34・RenderStreamの引数を明示的に指定
0880デフォルトの名無しさん
2008/01/27(日) 01:55:50しかし、実装が悪いようで非常に重たいプログラムになってしまいました。
現在はメッセージループでPeekMessage関数によってメッセージを取り出し、
アイドル時にキャプチャと表示を行う仕様になっています。
改善策をご教授ください。
0881デフォルトの名無しさん
2008/01/27(日) 02:00:590882デフォルトの名無しさん
2008/01/27(日) 02:07:15キャプチャした画像に処理を加える必要があるので静止画をキャプチャしています。
0883デフォルトの名無しさん
2008/01/27(日) 09:55:140884デフォルトの名無しさん
2008/01/27(日) 11:46:050885デフォルトの名無しさん
2008/01/27(日) 11:59:290886デフォルトの名無しさん
2008/01/27(日) 15:52:350887デフォルトの名無しさん
2008/01/27(日) 16:51:15静止画に対する処理をスレッドでやればいいんでしょうか?
0888デフォルトの名無しさん
2008/01/27(日) 17:57:51flvからaviに変換するようなアプリを作ろうと思っているのですが、
PCにインストールされている映像のエンコードのコーデック(フィルター)の一覧を取得する方法ってどうやればよいのですか?
0889デフォルトの名無しさん
2008/01/27(日) 22:13:49graphEditでもフィルタ一覧表示してるでしょ。大丈夫さ君ならやれるさファイトファイト
0890デフォルトの名無しさん
2008/01/27(日) 22:15:55フィルタ構成は
「ソースフィルタ」-「サンプルグラバ」-「レンダラ」
にしてサンプルグラバから静止画を取得するようにします。
このように設計してやることでマルチスレッド必要なく軽いアプリができます
0891デフォルトの名無しさん
2008/01/27(日) 23:55:25ttp://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/DirectX9_c/directx/htm/enumeratingdevicesandfilters.asp
0892デフォルトの名無しさん
2008/01/28(月) 00:30:39dshowutil.cppやstreams.hを使っています。
このとき、error lnk1181 でc:\program.objが見つからないとのえらがーでます。
どうやったら解決するでしょうか?
0893デフォルトの名無しさん
2008/01/28(月) 00:39:190894デフォルトの名無しさん
2008/01/28(月) 01:16:43お力かしてください。
0895デフォルトの名無しさん
2008/01/28(月) 01:25:22VC2005でDirectShowがインストールできませんよ
といっているの?
私もvc2005でDX9をインストールに失敗した経験があります。
vc2005(有料版)では素直にwindowsSDKを使ったほうが簡単でしょう
>>894
あなたもインストールに困っているのでしょうか?
その問題は昔のDirectShowプログラムをビルドすると出てきます。
直し方は新しくプロジェクトを作ればよかったと思います。
が、その後別の問題があったような覚えがあります。
DirectShowのインストールをやりなおしましょう
0896デフォルトの名無しさん
2008/01/28(月) 19:30:500897デフォルトの名無しさん
2008/01/28(月) 19:31:130898デフォルトの名無しさん
2008/01/29(火) 01:15:09英語のサイト見るとそのあたりの情報調べられるよ?
DirectShow人口増やしたいから答えるけどさ…
0899デフォルトの名無しさん
2008/01/29(火) 01:16:52そんなに難しくないだろ・・
0900デフォルトの名無しさん
2008/01/30(水) 01:00:16「MEDIATYPE_Video メジャー タイプを持つあらゆるタイプ」
になっていますが、これはYV12なども接続可能ということでしょうか?
つなげてみると、うまく繋がらないのですが。。。
0901デフォルトの名無しさん
2008/01/30(水) 02:01:26CLSID_VideoInputDeviceCategoryに属するフィルタの作成が出来ません。
g_TemplatesでCLSID_VideoInputDeviceCategoryを指定しているのですが、
CreateClassEnumeratorで列挙しても検出してくれません。
デバイスを伴ったWDMフィルタでなければ作成できないのでしょうか?
なにかヒントでも良いので教えてください。
0902デフォルトの名無しさん
2008/01/30(水) 04:16:17ちなみに、Baseclassのコードでは結論から言うとデフォルトの CLSID_LegacyAmFilterCategory にしか登録されない素敵仕様。
一からコード書くのも面倒なんで、俺はDllSetup.cppを改造したものを使ってこの問題に対処した。
0903901
2008/01/31(木) 00:17:30私も902さんに倣ってDllSetup.cppから必要な部分抜き出して、
登録部分を実装しました。
感謝感激でございます。
0904デフォルトの名無しさん
2008/01/31(木) 00:51:11DirectShowを利用したプログラムを作成していました。
今度、VB2005で同じようにDirectShowを利用するプログラムを作成するの
ですが、やはり、DirectX Software Development Kit(August 2006)がよい
のでしょうか?
0905デフォルトの名無しさん
2008/01/31(木) 01:03:460906デフォルトの名無しさん
2008/01/31(木) 08:25:47資料数と実装難易度の問題で。やっぱりメジャーな使い方が地雷を踏みにくくさせる
0907デフォルトの名無しさん
2008/02/02(土) 14:20:25ビットマップを挿入するタイミングは非同期でないといけないので、
今回の場合はPushSourceフィルタでは駄目でした。
Asyncfltを改造すれば、要求にこたえる機能が実装できそうだと思い見ています。
IAsyncReaderのRequestでIMediaSampleを渡すところまでたどり着ければ何とかなりそうなのですが、
取っ掛かりがつかめません。
どなたか作ったことがある、又は分かる方居ませんか?
下流フィルタとのつながりのやり取りのフローだけでも参考になるものがほしいです。
ちょっと、難易度の高い質問で申し訳ないですが、分かる方お願いします。
0908デフォルトの名無しさん
2008/02/02(土) 15:18:47ttp://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/DirectX9_c/directx/htm/pullmodel.asp
0909デフォルトの名無しさん
2008/02/02(土) 15:40:48教えていただいたURLはすでに読んでいました。
MSDNのそれらしきところを読んで回った末に、
>IAsyncReaderのRequestでIMediaSampleを渡すところ
というのが出てきたところです。
フィルタが出力ピンを用意して、それがIAsyncReaderをインターフェイスに持っているということですよね。
たとえばpushsourceでは
フィルタ>出力ピン の順に作って、
その出力ピンに下流ピンがGetMediaTypeを呼んで、良ければ繋がって、
FillBufferが呼ばれてIMediaSampleに内容を渡す
という流れですよね。これはグラフが動いている間は常に要求されているので渡す時間は実時間と違います。
パソコンが早ければ1秒で1分のビデオが作れます。そして、渡すべき物が無く、戻り値にS_OKを返さない場合、終了します。
今の段階ではFillBufferがRequestにとって代わるような感じを持っています。
渡すべき内容が無い場合、グラフに待ってもらいたいのです。
サンプルのAsyncfltはキューとかIOとかで割とシンプルじゃ無いので取っ掛かりがつかめません。
理解している人に噛んで砕いて教えていただけたら手っ取り早いなというのが実のところです。
任意のビットマップが用意できたら下流に流し、次のビットマップが無ければリクエストに対し無いと言って次回。
次のが用意できるまでは下流はリクエストをタイミングごとに出し続けて待機というイメージです。
そのようなシンプルなサンプルがほしいと思っています。
よろしくおねがいします。
0910デフォルトの名無しさん
2008/02/02(土) 17:56:15DirectShowを使って、オーディオ入力デバイスに対してファイルストリームから入力を行う事は可能ですか?
やりたい事は、ファイルシステム上のwavファイル等をオーディオ入力にいれるというものです。
よろしくお願いします。
0911デフォルトの名無しさん
2008/02/02(土) 18:56:020913デフォルトの名無しさん
2008/02/02(土) 20:57:210914デフォルトの名無しさん
2008/02/02(土) 22:14:08pushsourceで出来ました。
CSourceStream をちゃんとしらべれば簡単な話でした。
掲示板で質問すれば手っ取り早い、と思うのは自分勝手でした。
すみません。
しかし、MSDNに限らず、こういうのの説明文はさらっとしすぎで初めての人には理解に時間がかかる。
もう少しデータのナガレをきちんと載せてほしいとこです。
あと、恩返しではないですが、
Delphiでやってるので、質問があればお答えします。
0915デフォルトの名無しさん
2008/02/02(土) 22:33:53レスありがとうございます。
ソースフィルタでストリームに処理を加えると、
自分以外のそのデバイスをlistenしてるアプリにも反映されるのでしょうか?
0916デフォルトの名無しさん
2008/02/02(土) 23:37:390917デフォルトの名無しさん
2008/02/03(日) 05:27:36自分のやりたいことがPULLモデル/PUSHモデルどちらなのか
良くわかってなかったっつーことか。なんだかなー
0918デフォルトの名無しさん
2008/02/03(日) 14:06:550919デフォルトの名無しさん
2008/02/04(月) 02:12:37全レスのなかで私くらいしかしてないような…
ゴバクかいな
0920デフォルトの名無しさん
2008/02/04(月) 17:16:44Pull でも FillBuffer で待たせておけばOK.
0921デフォルトの名無しさん
2008/02/05(火) 13:48:49起承転結みたいだなw
0922デフォルトの名無しさん
2008/02/11(月) 00:41:520923デフォルトの名無しさん
2008/02/11(月) 01:01:570924デフォルトの名無しさん
2008/02/11(月) 01:14:59戦っちゃだめだよな
0925デフォルトの名無しさん
2008/02/11(月) 01:58:210926デフォルトの名無しさん
2008/02/11(月) 10:11:210927デフォルトの名無しさん
2008/02/11(月) 18:58:20CSourceStream はどのタイミングで FillBuffer を呼ぶの?
CSourceStream::DoBufferProcessingLoop の説明には
毎回ループを通じてアロケータから空のメディア サンプルを取得する。
とあるので、スレッドループから常に呼び出されていると理解したけど?
タイミングは随時?それとも下流フィルタから呼ばれてるの?
要は、渡すべきサンプルが FillBuffer 呼び出しに間に合わなかった場合の処置だけど、
戻り値に S_FALSE を渡すと終了してしまうよね。
IMediaSample を更新しないで単に S_OK を渡してやれば次回にスキップできる?
今やってるのではうまく行かないんだよね。
0928デフォルトの名無しさん
2008/02/11(月) 19:47:040929デフォルトの名無しさん
2008/02/11(月) 20:34:380930デフォルトの名無しさん
2008/02/11(月) 20:58:040931デフォルトの名無しさん
2008/02/11(月) 21:43:21知ったかぶりすんな。
0932デフォルトの名無しさん
2008/02/11(月) 22:11:37DirectShowの場合、説明だけに頼らずソースのある箇所は必ず読む方が良い。
>>927
サンプルを得られるまで返らない、とか?
昔作った時は、停止要求とかの処理で悩んだ挙句、
DoBufferProcessingLoop自体をオーバーライドしちゃった記憶が(汗
0933デフォルトの名無しさん
2008/02/11(月) 22:16:490934デフォルトの名無しさん
2008/02/11(月) 22:36:380935デフォルトの名無しさん
2008/02/12(火) 02:15:50タイムスタンプに関係なくFillBufferを呼び続けるんだな。
渡すべきサンプルが無くてもお構いなしだ。
FillBufferがS_OKを返すとサンプルはDeliver(Sample: IMediaSample): HRESULT;から
Receive(Sample);に回される。ここでS_FALSEならおしまい。
ここらはMSDNから読めるだろ?
このReceiveの動作がDoBufferProcessingLoopが受け取る戻り値になるんだよ。
これはピンの状態なんかもかかわってくる。
問題は(Sample);の中身が無い状態で、とりあえず渡してどうなるかってこと
必要な動作のヒントがほしいなら、Receiveのとこはソースを見て自分で判断するしかない。
渡されたサンプルを無視するように何とかすればいいかもね
0936デフォルトの名無しさん
2008/02/13(水) 18:39:20RenderFileで成功するか否か判断するしかない?
0937デフォルトの名無しさん
2008/02/13(水) 22:13:41拡張子ではわかりません。
0938デフォルトの名無しさん
2008/02/13(水) 22:27:18サポートしている拡張子は取得できない、ってことですか?
0939デフォルトの名無しさん
2008/02/13(水) 22:43:02そこからはコンテナのフォーマットが推測できるだけであって、
中の映像や音声がどんなコーデックで圧縮されているかは全く不明。
0940デフォルトの名無しさん
2008/02/13(水) 22:46:42レンダラ、ライタまでたどり着けるかはシステムに拠りますね。
0941デフォルトの名無しさん
2008/02/13(水) 23:16:38ありがとうございます。
あるフォルダの中から、DirectShowで表示できるファイルだけを列挙したいのですが、
できればDirectShowにRenderさせる前に、DirectShowでサポートされているか拡張子で判断したいのです。
理由は判断ロジックのパフォーマンス確保のためです。
(この時、拡張子がrmなのに中身はwmvだった、という例外は除外してOKです。)
ファイル数が500個あった場合に、DirectShowにRenderさせてS_OKだったら、
これはサポートファイルであるという判断は時間がかかります。
もしくは、サクッとDirectShowサポートファイルか判断する手段はありますでしょうか?
0942デフォルトの名無しさん
2008/02/13(水) 23:42:33コンテナとコーデックの違いを理解しましょう
0943デフォルトの名無しさん
2008/02/13(水) 23:46:01そこにDivXの映像入りのAVIがあったとする。
しかし、そのコンピュータにはDivX(やXvidその他)がインストールされていなかったとする。
どうしよう。
0944デフォルトの名無しさん
2008/02/14(木) 00:20:05レジストリの HKEY_CLASSES_ROOT\Media Type と SDK のドキュメントの
「カスタム ファイル タイプの登録」を眺めるとひょっとしたら幸せに
なれるかも
# スプリッター/パーサーフィルタが対応してるファイルかどうかは判定できる
# ただし拡張子だけじゃなく、ファイル先頭のビットパターンまで見る必要が
# あるけど
0945デフォルトの名無しさん
2008/02/14(木) 00:26:46はい。
>>943
列挙されたファイルをDirectShowで使用する場合、Renderのタイミングでエラーになりますので、
そのタイミングで該当ファイルをリストから除外します。
ファイルの列挙のタイミングでは、精度よりもパフォーマンスを確保したいのです。
私の理解が不十分ですので、出直してきます。
ありがとうござしました。
0946デフォルトの名無しさん
2008/02/14(木) 00:28:51ヒントありがとうございます。
調べてみます。
0947デフォルトの名無しさん
2008/02/14(木) 17:00:20ffdshowと比べて負荷が高いような気がします。
※色空間は暫定で、一番最初にCheck〜関数へ飛んでくる色空間にしてます。
自作フィルタをGRFで見てみると、AVIDecompressorが出力ピンに付くんですよね・・・そのせいでしょうか?
一応ffdshowのソースを見てみましたが、私には難解すぎました・・・orz
どなた様かご教授よろしくお願いいたします。。
0948デフォルトの名無しさん
2008/02/14(木) 21:46:510949デフォルトの名無しさん
2008/02/14(木) 22:14:09http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/DirectX9_c/directx/htm/mediatypes.asp
MEDIASUBTYPE_WAVEで出力している自前のソースフィルタがあるけど普通に動いているな〜
どういうことだこれはwww
0950デフォルトの名無しさん
2008/02/14(木) 23:05:06MEDIASUBTYPE_PCM = MEDIASUBTYPE_WAVE
と考えていいのか?(いやまずいだろうとは感じているのだが)
0951デフォルトの名無しさん
2008/02/14(木) 23:10:440952デフォルトの名無しさん
2008/02/14(木) 23:29:43そしたら、サブタイプがWAVEだった場合、
中身のフォーマットはどのようにして取得するの?
0953デフォルトの名無しさん
2008/02/16(土) 21:17:20質問です。
メモリ上のH.264とAACを含んだTSを再生したく、調べてみて、
ハードディスク等に保存されている動画を再生するには
IMediaControl->RenderFileを使用する事が分かったのですが、
自分でHeapAlloc等を使い、
メモリ上に展開した動画データを直接再生する方法が分かりません
何か方法はあるでしょうか?
宜しくお願いしますm(__)m
0954デフォルトの名無しさん
2008/02/16(土) 21:18:570955デフォルトの名無しさん
2008/02/16(土) 21:38:02ソースフィルタ書け。
0956デフォルトの名無しさん
2008/02/16(土) 21:51:410957デフォルトの名無しさん
2008/02/16(土) 22:14:14>>956
分かりました
それらのキーワードでぐぐってみます
レスありがとうございましたm(__)m
0958デフォルトの名無しさん
2008/02/22(金) 14:38:56開発環境はWinXP + VS2005 です。
DirectShowでmp3のデコードを行ってメモリ上にrawデータを展開し、
そのデータをDirectSoundで再生させようと考えているのですが、
なかなか参考になりそうなwebページや書物が見つかりません。
そもそもこのことは可能でしょうか?
もし可能であれば簡単に展開の仕方を教示していただきたいです。
また参考になるHP等ございましたらご提示願います。
0959デフォルトの名無しさん
2008/02/22(金) 15:52:58DirectSoundでWAVEをストリーミングするサンプルを見つける
MP3をWAVEに変換するサンプルを見つける
それら2つのサンプルを組み合わせる
0960デフォルトの名無しさん
2008/02/22(金) 22:00:35yaneSDK3rd で DirectShow 使って PCM に直す処理があったと思うので
気合でソース読め。
DirectSound 使わんで普通に再生フィルタにつなげばそれで良いと思うのだがな。
0961デフォルトの名無しさん
2008/02/25(月) 23:55:58ttp://blog.monogram.sk/janos/tools/monogram-graphstudio/
オープンソース版GraphEditだそうだ。
0962デフォルトの名無しさん
2008/02/28(木) 13:15:03ttp://www.codeproject.com/KB/audio-video/dsgraphedit.aspx
0963デフォルトの名無しさん
2008/02/28(木) 20:37:550964デフォルトの名無しさん
2008/03/02(日) 16:58:32キーフレーム、バッファリングと関係があったりするのでしょうか。
また、再生レートを変更しても動画が一瞬止まらないようにするための解決法などありますか?
0965デフォルトの名無しさん
2008/03/03(月) 03:02:10どうすれば同期しますか?
0966デフォルトの名無しさん
2008/03/04(火) 03:23:05PSDK?
0967デフォルトの名無しさん
2008/03/04(火) 17:36:08最新の6.1(Windows Server 2008/.NET Framework 3.5まで対応)にも収録されている。
0968ddd
2008/03/06(木) 17:31:300969デフォルトの名無しさん
2008/03/06(木) 17:32:55http://pc11.2ch.net/test/read.cgi/tech/1162913156/l50
http://pc11.2ch.net/test/read.cgi/tech/1162913156/l50
http://pc11.2ch.net/test/read.cgi/tech/1162913156/l50
0970デフォルトの名無しさん
2008/03/07(金) 19:09:03「USB Video Class Extension Units」と戦ったかた居ませんか?
ttp://msdn2.microsoft.com/en-us/library/ms803127.aspx
サンプルどおりに.axのDLLを作成して、infで登録し、
デバイスマネージャのドライバリストには入ってるんですけど
実際にAPLから、
pKsTopologyInfo->get_NumNodes(&nNodesNum);
for( int i=0 ; i<nNodesNum ; i++ ){
GUID guid;
hr = pKsTopologyInfo->get_NodeType(i,&guid);
if (!SUCCEEDED(hr)){
printf("err\n");
}
}
ってやると、extension unitのnodeで
KSNODETYPE_DEV_SPECIFICが帰ってくるんですよ。
(他のnodeは正常なGUIDが取れる)
ここではextension unitのGUIDeが帰ってくると
思ってたんですけど。・・・?
0971デフォルトの名無しさん
2008/03/08(土) 09:19:060972デフォルトの名無しさん
2008/03/08(土) 12:51:36IPersistStream::Save()は成功するのですが、IPersistStream::Load()はいつどのフィルタで呼んでも「初期化は既に完了している」とエラーが出てしまいます。
そもそも、設定の保存にIPersistStreamを使うので合っているのでしょうか?
0973デフォルトの名無しさん
2008/03/08(土) 13:20:42http://mimizun.com/search/perl/dattohtml.pl?http://mimizun.com/log/2ch/tech/pc8.2ch.net/tech/dat/1026666092.dat
0974デフォルトの名無しさん
2008/03/10(月) 12:26:29AM_SEEKING_SeekToKeyFrame
最も近いキー フレームをシークする。これは高速だが、精度は落ちる。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/DirectX9_c/directx/htm/imediaseekingsetpositions.asp
という記載がありますが、AM_SEEKING_SeekToKeyFrameを加えても高速になりません。
これって体感できるほどの効果があるのでしょうか?
0975デフォルトの名無しさん
2008/03/10(月) 22:09:400976デフォルトの名無しさん
2008/03/11(火) 11:27:40UVCのExtension関連の記憶は少しあやふやだけど、KSNODETYPE_DEV_SPECIFICで
良かった気がする。アクセス自体はその後Pinインタフェイスで行ったような。
ただ、UVC周辺は動作が怪しいんだよね…XPでの経験しかないんだけど、Extensionの
サンプルってそのままだと上手く動かなかった気がする。
あとXPだとUVCドライバの対応が中途半端なので、MSDNの説明通りにドライバが動かない
部分もあったり。Vistaだとそこらへん改善してるのかどうか少し気になる。
0977970
2008/03/11(火) 13:03:33HINTありがとう。
Pinインタフェイスですか・・・。試してないので早速試してみます。
KSNODETYPE_DEV_SPECIFICのノードのPinですよね。
あと、VISTAでもやって見ますね。
0978970
2008/03/12(水) 19:58:39VISTAでやったところ、get_NodeTypeはDEV_SPECIFICが返り、
やっぱり、CreateNodeInstanceは失敗したんですが、
IKsControlのKsPropertyでアクセスできました!やった。
ただ、XPは同様な方法ではダメでした。
(MSDNにもFilterではなくnodeからしか出来ないと書いてありますし・・)
で、Pinインタフェイスなのですが、IKsPinの事ですよね!?
インタフェイスは取得できたのですが、どう扱えばよいのか・・。
0979デフォルトの名無しさん
2008/03/13(木) 12:49:04他のアプリがUSB接続のカメラの映像をプレビューしている状態で、
自分のアプリでそのカメラの映像をキャプチャーしたいんですけど、
それって、DirectShowのAPIで実現可能でしょうか?
Geekさんの、ビデオ入力デバイスからの映像をAVIに保存するサンプルコード
http://www.geekpage.jp/programming/directshow/video-capture-save-avi.php
を使用させてもらい、試してみたのですが
pCaptureGraphBuilder2->RenderStream(&PIN_CATEGORY_CAPTURE,
NULL, pDeviceFilter, NULL, pFileOut);
でE_INVALIDARGが返却され、映像を横取りキャプチャーすることはできませんでした。
X-LiteというSIPクライアントソフトはその横取りキャプチャー行為が可能で、
その真似がしたいのですが、どうやっているのかが分かりません…
X-Liteのキャプチャーを開始すると他のアプリのプレビュー映像は消えるので、
カメラに映像配信を停止するような?命令を出しているのかもしれません。
0980デフォルトの名無しさん
2008/03/13(木) 17:38:50どなたかアドバイスください。
IBasicAudio::put_Volume だとOSのWAVE音量が変わってしまうようです。
DirectSoundのSetVolumeのように、OSの設定には影響を与えない
アプリ内でのみ有効な音量の変更は出来ないでしょうか?
(設定できるのはOSの音量設定以下での相対値で構いません)
よろしくお願い致します。
0981980
2008/03/14(金) 10:26:08Winampとかでムービー再生するとアプリ内の音量調整はOSのボリューム
コントロールに影響しないので、何かしら方法はあると思うのですけど。
WinampがDirectShowを使ってるかは分らないですが…。
失礼いたしました。
0982デフォルトの名無しさん
2008/03/14(金) 11:34:26DirectShowでの実現方法は分かりませんが…
WinAPIならコレでできたような…
ttp://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpmltimd/html/_win32_waveoutsetvolume.asp
0983980
2008/03/14(金) 12:52:40レスどうもです
>waveOutSetVolume
このAPIでは、WAVEボリュームどころかOSのマスターボリュームまで
変わってしまいました。やりたいのはOSのボリューム設定を動かさずに
DirectShowの音声出力だけを制御する(下げる)ことなんです。
0984デフォルトの名無しさん
2008/03/14(金) 13:14:050985980
2008/03/14(金) 13:39:01ヒントありがとうございます。手持ちのデバイスで試してみました。
OSデフォルト:WAVE変更無し
マザボのオンボードカード:WAVE変更あり
USB音源:WAVE変更無し
となりました。さらにモニカのGetDisplayNameに"DirectSound:"が含まれ
ない場合にWAVEボリューム変更ありという感じでした。
なら"DirectSound:"が含まれるデバイスを選択すれば大丈夫なのですが、
PCによってはこれだと音が出ない場合もあったりで、結構困りモノです。
なんとかユーザーに選択させる方向で考えたいと思います…。
0986デフォルトの名無しさん
2008/03/14(金) 14:24:35そのバッファの音量変えればいいようにも思えるんだが違うのかな?
もともとの音関係のライブラリはデバイスに激しく依存していて
WAVE系APIで複数音を鳴らせることはできないのも多かった。
で、DirectSoundによってアプリごとの設定ができるようになった。
Winampの場合は出力するときに使うDLLに依存してて、
そのDLLが音量を調節する機能を盛っていたはず。
だから、自力で実装するかDirectSound使うか。
列挙についてはWindowsのガイドライン通りにやっても
うまくいかないことは多いので下手に作りこむとはまると思う。
0987デフォルトの名無しさん
2008/03/14(金) 15:39:26フィルタはレジストリに登録しなくても使えるみたいだし。
0988980
2008/03/15(土) 10:41:01>DirectShowの何かがDirectSoundバッファにストリーミングさせてるから
>そのバッファの音量変えればいいようにも思えるんだが違うのかな?
バッファがどこにあるのか(どう取得するのか)自分の知識範囲では
わかんないです。
>>987
その発想はありましたが、サクッと作れるなら苦労しないです^^;
画像だとサンプルグラバってのを参考にして出力画像を加工する
ってのはやったことあるんですが、音だとどこら辺参考にしたら
いいでしょうか?
デコード後の生データの流れにルーチンを割り込ませることが出来れば、
確かにボリューム調整は単なる乗算なので出来そうではありますが、
そこまでたどり着くので難儀してますね…。
0989デフォルトの名無しさん
2008/03/15(土) 11:29:03理解に5分もかからないけどな。
0990デフォルトの名無しさん
2008/03/15(土) 11:34:50追加して掛け算するようにすれば簡単にできると思う。
コールバックを登録するインタフェイスを追加して、掛け算の代わりにコールバックを
呼ぶフィルタにすれば今後映像音声のいろんな加工やモニタリングに流用可能。
レス数が950を超えています。1000を超えると書き込みができなくなります。