お世話になります。

現在x64版のDirect Showを利用して、aviファイルから任意のフレーム画像を取得する
プログラムを作成しております。

Direct Showは今まで使ったことが無かったのですが、ネットにあるサンプルなどを
参考に手探りで作業を進めております。最終的にはx64版を作る必要があるのですが、
メインで作業しているPCが32bit環境であるため、とりあえずx86版で作業を進め、
なんとか期待する動作をするものが出来ました。

最終的に処理する動画ファイルは1440x810のものと、3840x2160の2つがあり、
x86版ではどちらも期待する動作をしてくれるのですが、x64にてコンパイルし64bit環境で
動作させると1440x810の方は問題ないのですが、3840x2160の方はうまく動作しません。

なお、プログラムは以下のような流れでDirectShowを利用しております。

CoInitialize
CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, &pIGB);
pIGB->QueryInterface( IID_IMediaControl, &pIMC );
pIGB->QueryInterface( IID_IID_IMediaSeeking, &pIMS );
CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, &pIBF );
pIBF->QueryInterface( IID_ISampleGrabber, &pISG );
pIGB->AddFilter( pIBF, NULL );
pISG->SetMediaType(&stMT); // stMTはMEDIATYPE_Video,MEDIASUBTYPE_RGB24,FORMAT_VideoInfoを設定
pIGB->RenderFile( ファイル名, NULL );
:

調べてみると、RenderFileのところでx64の場合はVFW_E_NO_TRANSPORTが帰ってきているようです。なお、その64bit環境でx86コンパイルしたものを動かすと問題なく動作します。

なお、もともとDirect X SDK 9.0を使っていましたが、念のため最新版のものをダウンロードして
試してみましたが、症状は変わりませんでした。また、Videoドライバも変えてみましたが、同様に
変化なしです。

どんな原因が考えられるか、どなたかご助言頂ければ助かります。

なお、開発環境・動作環境は以下の通りです。

Windows 7 Pro 64bit版
VisualStudio 2010 Pro
Direct X SDK 9.0 or Direct X Jun_2010
C++ (純粋なネィティブプログラム)

このQ&Aに関連する最新のQ&A

A 回答 (1件)

↓あたりを参考に調べてみてはいかがでしょうか。



VFW_E_NO_TRANSPORTについてのQ&A
http://social.msdn.microsoft.com/Forums/en-US/wi …

DirectShowのフィルタについて(ちょっと古い情報みたいです。)
http://www.geocities.co.jp/SiliconValley/7406/ti …

grapheditについて
http://blogs.msdn.com/b/windows_multimedia_jp/ar …

この回答への補足

grapheditを使ってフィルタを自動生成してみたところ、
x64版では同じ様にピン関係のエラーが表示され、うまくいきませんでした。
ただしx86版では問題なく自動生成されたので、x86版の結果を頼りに
x64版で手動でフィルタを追加していったところ、AVI SplitterからAVI Decompressorへの
入力で失敗していることがわかりました。

結局のところ64bit版のコーデックが無いために、このようなエラーになっていたようです。
(考えてみれば当然な気がしますが、全然気づきませんでした^^;)

なにぶん動画関係とか疎かったので、頂いた情報は大変参考になりました。
ありがとうございました!!

補足日時:2011/04/14 11:40
    • good
    • 0
この回答へのお礼

情報ありがとうございます!
さっそく確認してみます^^

お礼日時:2011/04/14 09:29

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q64bit対応と32bit対応のソフトの違いについて教えてください。恐

64bit対応と32bit対応のソフトの違いについて教えてください。恐らく64bit用のソフトを起動しても32bitのOSでは起動しないということだと思うのですが、それならなぜ64bit対応版のソフトがあるのでしょうか?64ビットにすることによって何か良い点があるのでしょうか?

Aベストアンサー

64ビットにすることによって、処理速度の向上・命令の種類を増やせる・
大きなメモリ空間を得られるなどの利点があります。
そのため、パソコンは、昔は8ビットマシン 今は64ビットマシンへと進化しました。
次は128ビットでしょうか?

64ビットCPUには、32ビットの命令を処理する機能があります。
メモリのデータの参照に関しては、32ビットと64ビットでは、
まったく違うのですが、ある一定の規則で変換することが可能です。

この、64ビットのアドレッシングへの変換がうまくできるような、
32ビットのプログラムは、64ビッOSでも動作させることが可能です。
しかし、メモリアクセスをうまく変換できないプログラムは動作させられません。

QDirect Show でUSBカメラキャプチャー

Direct showでUSBカメラキャプチャーしようとしています。
現在、6台のUSBカメラを接続し、連続して撮影をしています。
問題はキャプチャーする時間が長く、640x480画素モードで1000mS、1600x1200画素モードで2000ms程かかります。
Direct Showを使用する場合、この程度かかるのは普通でしょうか。
試しにプログラムに時間計測させた所、

FMediaControl->Run(); で640x480 の時160mS 1600x1200の時620mS(カウンター2-3間)

FMediaControl->Stop(); で640x480 の時310mS 1600x1200の時330ms(カウンター5-6間)

かかって居ました。

プログラム自体は先人が作成したもので、私はDirectXが良く分からないので、これから勉強し、時間が短く出来るのであれば挑戦したいと思って居ます。
ただ、他の開発時間も足りないので、初めからこの位かかるのが正常ならばここの部分はそのままにして置きたいと思い、質問させて頂きました。
  
下記に使用して居るプログラムの抜粋を記します。

この処理時間が正常なのか、正常で無い場合、考えられる原因、若しくは原因の調査の仕方をお教え頂ければ幸いです。

DWORD dTime0;
DWORD dTime1;
DWORD dTime2;
DWORD dTime3;
DWORD dTime4;
DWORD dTime5;
DWORD dTime6;

dTime0 = GetTickCount();
FCurrentCam = Cam;
FCaptured = false;
dTime2 = GetTickCount() - dTime0;
hr = FMediaControl->Run();
dTime3 = GetTickCount() - dTime0;
DWORD dTime0;
DWORD dTime1;
DWORD dTime2;
DWORD dTime3;
DWORD dTime4;
DWORD dTime5;
DWORD dTime6;
dTime0 = GetTickCount();
// 前回のキャプチャー終了待ち
for( int i=0; i<100 && FBusy; i++ ) {
Sleep( 100 );
}

if( FCurrentCam!=Cam ) { // カメラが同じ場合レンタリングしなおす必要なし
   // レンダリングしなおし部分省略

}
FCurrentCam = Cam;
FCaptured = false;
dTime2 = GetTickCount() - dTime0;
hr = FMediaControl->Run();
dTime3 = GetTickCount() - dTime0;

DWORD Ed = GetTickCount() + 3000; // 3000はタイムアウト
do {
Application->ProcessMessages();
Sleep( 20 );
} while( !FCaptured );
dTime4 = GetTickCount() - dTime0;
long ImageSize = Cam->prImageSize;
dTime5 = GetTickCount() - dTime0;
frmMain->lHrs[22] = FMediaControl->Stop();

dTime6 = GetTickCount() - dTime0;;
FBusy = false;
return Cam->prImage;
}

Direct showでUSBカメラキャプチャーしようとしています。
現在、6台のUSBカメラを接続し、連続して撮影をしています。
問題はキャプチャーする時間が長く、640x480画素モードで1000mS、1600x1200画素モードで2000ms程かかります。
Direct Showを使用する場合、この程度かかるのは普通でしょうか。
試しにプログラムに時間計測させた所、

FMediaControl->Run(); で640x480 の時160mS 1600x1200の時620mS(カウンター2-3間)

FMediaControl->Stop(); で640x480 の時310mS 1600x1200の時330ms(カウンター5-6間)

か...続きを読む

Aベストアンサー

#1 です。
>Run/Stopを繰り返さないで、どの様にキャプチャー出来るのでしょうか?

参考URLは SDK の 「サンプル グラバの使い方」というものです。
簡単に言えば、Run() 状態のまま、カメラのストリームから欲しい時にだけスナップショットでイメージを得る方法です。Stop() はアプリが終わるまで呼びません(時間が掛かるので)。

この方法の実装はネットで幾つか見つかると思います(どれも似ています)。
しかし、複数台のカメラで有効なのかどうか私には判りません。

よって #1に書いた「個人的にどうなのかな?」の部分は次のように言い換えたい思います。
・カメラが1台ならRun/Stopは繰り返さない方が早いと思う。しかし、複数台のカメラになると、そうせざるを得ないのも知れない。...です。

参考URL:http://msdn.microsoft.com/ja-jp/library/cc371163.aspx

QOS 32BITと64BITの違いを教えてください

Windows Vista Home Premium などのOSの
32BITと64BITの違いを教えてください

一見数の多い64BITのほうが優秀と思い買いそうになりましたが
互換性や使ってる人数などが32BITのほうが多いと聞いて32BIT買いましたけど・・これで良かったのだろうか・・

32BITと64BITのメリット、デメリットなどあったら教えてください

Aベストアンサー

64bit版では
ドライバは 署名付きでないと受け付けません
マルチメディアの対応が遅れています (地デジチューナーは使えません)
特にIOデータ、メルコの日本勢対応が悪い

IEの64bit版では、Flashが使えません
(32bit版IEを普通は使うから 問題ないですけど)

16bitアプリは切り捨てられました
古いソフトだと、本体は32bitだけど インストーラーが16bitというのも多いです
これは使えなくなります

まあ Vistaまでは32bitで問題ないでしょう
DSPの64bit版を買うとき、ショップの人から 「やめておいたら?」といわれましたよ

QVISTA64bit,VS2005/C++で対象コンピュータを「x64

VISTA64bit,VS2005/C++で対象コンピュータを「x64」にして簡単なプログラムをビルドすると以下のエラーが出てしまいます。

「1>.\Debug\stdafx.obj : fatal error LNK1112: モジュールのコンピュータの種類 'X86' は対象コンピュータの種類 'x64' と競合しています。」

OS   :VISTA Ultimate64bit
CPU   :Xeon5080(64bit),
開発環境:VS2005 Team Edition for software developers完全インストール

◎OSもCPUも64bit対応なのに何故かモジュールのコンピュータは32bitでビルドしてしまいます。解決方法はありますでしょうか?

追記:気になることは、VS2005が普通の「Program files」のフォルダではなく「Program Files(x86)」に強制的にインストールしてしまうことです。

Aベストアンサー

ちょっと見にくいですが、
http://www.itmedia.co.jp/enterprise/articles/0506/15/news006.html
の「Fig.4 Visual Studio 2005β版セットアップ画面」
にある「x64コンパイラおよびツール」をチェックONにしてインストール
していますか?
(この画面はβ版なので、製品版と若干違うかもしれません。)

例え64ビット環境にインストールしたとしても、
VisualStudio2005は、32ビットアプリケーションです。
なので「Program Files(x86)」にインストールされるのは正常です。
それでも64ビットアプリの開発ができるのは、クロスコンパイル環境になっているからです。
上記のチェックボックスもデフォルトはOFFだったと思います。

Qwindows7 64bit と windows7 32bit の違い

windows7 64bit と windows7 32bit の違いがいまいち明確に分かりません。PCの構成によっては、64bitをインストールできるものと、32bitでないと駄目なものがあるのも分かったのですが、両方大丈夫な場合は、具体的にどう言うメリットデメリットがあるのでしょうか?
64bitより32bitの方が速度的に早いなどと言う情報も耳にしたりで混乱しています。

Aベストアンサー

Q/両方大丈夫な場合は、具体的にどう言うメリットデメリットがあるのでしょうか?

A/まず、64bitのデメリットとして、64bitのWindowsを使うには、全てのハードウェア(例えばプリンタなどの周辺機器やパソコン内部のサウンド、ネットワークなどのハードウェア)の64bit対応ドライバが確実に揃っている必要があります。

揃っていないハードウェアがあるとその機器は64bitOS上では動作しません。

次に、Windows7で利用したいアプリケーションソフトは全て64bit環境で動作することを確認しておく必要があります。一部のアプリケーションソフトは64bit環境では動作しません。(具体的には16bitで設計されたソフトウェアと、ハードウェアドライバをエミュレートするアプリケーションソフトで32bit設計のもの)

メリットしては、64bitのOSでは、サポートできるメモリ量がHome Premiumで16GB、Professionalで128GBまでとなります。また、64bitで設計されたアプリケーションにおいて、64bitレジスタを利用できるため、大幅に演算性能を引き上げることが出来る場合があります。
また、32bitアプリケーションにおいても、メインメモリが2GBを越える環境では、速度が若干速くなります。4GBを越えるとより快適になることがあります。(但し、見た目で判断できるほどの速度差ではありません)
これはメモリの扱い方が改善することと、WOWが32bitのライブラリ情報を互換する64bitのライブラリに置き換えるため、共通モジュールは64bitのモジュールをキックするためです。

ということです。
即ち、デメリットは既に周辺機器やソフトウェアを沢山持っている場合、32bitのWindows7に比べて動作しないハードウェアやソフトが出てくる可能性が高いということ。

メリットは、上記のデメリットが全て解決されている環境においては、メモリを沢山詰めることと、64bitのリッチなCPU機能を活用することができ、64bit対応のソフトウェアはもちろん、32bit対応のソフトにおいても性能を引き上げてくれることがあるということです。

Q/両方大丈夫な場合は、具体的にどう言うメリットデメリットがあるのでしょうか?

A/まず、64bitのデメリットとして、64bitのWindowsを使うには、全てのハードウェア(例えばプリンタなどの周辺機器やパソコン内部のサウンド、ネットワークなどのハードウェア)の64bit対応ドライバが確実に揃っている必要があります。

揃っていないハードウェアがあるとその機器は64bitOS上では動作しません。

次に、Windows7で利用したいアプリケーションソフトは全て64bit環境で動作することを確認しておく必要が...続きを読む

Qいつもお世話になっております。以下のようなプログラムで現在時刻の表示を

いつもお世話になっております。以下のようなプログラムで現在時刻の表示をしているわけですが、

#include <stdio.h>
#include <time.h>

int main(void)
{
//日付
time_t tmp;
struct tm date;

time(&tmp);
date = *(localtime(&tmp));

printf("現在の時刻:%d-%d-%d %d:%d\n", date.tm_year + 1900 , date.tm_mon + 1 , date.tm_mday , date.tm_hour , date.tm_min);

return 0;
}

このプログラムで動いているので問題は無いのですが、
例えば月・日・時・分が1桁の場合に出力画面が「2010-5-20 14:7」となってしまいます。
個人的には「2010-05-20 14:07」とYYYY-MM-DD HH:MM←(この書き方であってるか不安…)
方式にしたいのですがどのようにすれば良いでしょうか?

いつもお世話になっております。以下のようなプログラムで現在時刻の表示をしているわけですが、

#include <stdio.h>
#include <time.h>

int main(void)
{
//日付
time_t tmp;
struct tm date;

time(&tmp);
date = *(localtime(&tmp));

printf("現在の時刻:%d-%d-%d %d:%d\n", date.tm_year + 1900 , date.tm_mon + 1 , date.tm_mday , date.tm_hour , date.tm_min);

return 0;
}

このプログラムで動いているので問題は無いのですが、
例えば月・日・時・分が1桁の場合に出力...続きを読む

Aベストアンサー

%d-%d-%d %d:%d

%4d-%02d-%02d %02d:%02d
とかにするとか。

Qvistaの32bit64bitの意味違いを!

vistaで32bitとか64bitとかありますが、簡単に説明、意味、違いを教えてください、Windowsxpにも32bitとか64bitがあるのですか?

Aベストアンサー

・64bit版
x86-64(64bitCPU)のみで使える。
64bitアプリ、32bitアプリ双方が使える。
(ただし32bitアプリはすべてが動作するとは限らない。)
4GB以上のメモリが使える。(2^64)
・32bit版
x86(32bitCPU),x86-64(64bitCPU)双方で使える。
32bitアプリしか使えない。
メインメモリが4GBまでしか使えない。(2^32)
(実際にはBIOSの制限で3GBちょっとまでしか使えない)

>indowsxpにも32bitとか64bitがあるのですか?
・Proのみ64bitエディションあり
・IA-32の64bit版(x86-64)以外のIA-64(Itanium)のWindowsXPも当初はあったが発売中止になった。

QDirect Xをやりたいのですが・・・

Direct Xをやろうと思うのですが、DirectXをやるときはやはり、Visual C等が必要なのでしょうか

またOpenGLは、ボーランドのコンパイラ(C言語の奴)でもできますか?

Aベストアンサー

>DirectXをやるときはやはり、Visual C等が必要なのでしょうか

結論を言えば、ボーランドのコンパイラでも
Direct3Dは出来ないことはないです。

ただ、DirectXのSDKに付属するインポートライブラリーは
VC++用しか使えるものがなく、Borland用のlibファイルを
自分で用意しなくてはいけないでしょう。

 また、Direct3Dを使う場合は、D3DXという重要な
スタティックライブラリーがBorlandのコンパイラからは
使用できないという欠点があります。
(ただし、自分でなんとか代用のものを作ることは
できますが、かなり労力がいると思います。)

 また、DirectXのサンプルも主にVC++を対象にしてるので、
やはり、DirectXに限って言えばVC++がベストと言えるでしょう。

 参考までに、
フリーのコンパイラでは、ボーランドのもだけでなく、
VC++ToolKit2003というフリーのコンパイラがあるので、
そちらを使っても良いかも知れません。

Qwindowsの64bitと32bitの違いを教えてください。どちらが上位クラスですか?

windowsの64bitと32bitの違いを教えてください。どちらが上位クラスですか?

Aベストアンサー

2の4乗が32bit。
2の8乗が64bit。
bit数に上や下は有りません。
コンピューターの扱える単位です。
*32bitで使えていたソフトが64bitで使えなくなる場合があります。
*反対に64bit専用でしたら、32bitでは使えません。
OSはCPU・マザーボードで左右されます。
メモリも、
32bit・・4GB以上。
64bit・・8GB以上。
*マザーボードで制限が在りますが、ふつうは倍くらいで十分です。

QMacOS XでX11のgccコンパイルエラー

環境: MacOS X(ver10.10)、Xcode(ver6.1.1)
大学でCentOSの環境でX11ライブラリを用いて勉強しています。
これを家でもやれるようにMacでも環境を整えいざやろうとしたら、コンパイルエラーで躓いてしまいました。
$ gcc -I/opt/X11/include/ xdisp.c
Undefined symbols for architecture x86_64:
"_XCopyArea", referenced from:
_ColorDisplay in xdisp-145c02.o
"_XCreateColormap", referenced from:
_InitWindow in xdisp-145c02.o
"_XCreateGC", referenced from:
_InitWindow in xdisp-145c02.o
"_XCreateImage", referenced from:
_InitWindow in xdisp-145c02.o
"_XCreatePixmap", referenced from:
_InitWindow in xdisp-145c02.o
"_XCreateWindow", referenced from:
_InitWindow in xdisp-145c02.o
"_XFlush", referenced from:
_ColorDisplay in xdisp-145c02.o
_InitWindow in xdisp-145c02.o
"_XGetVisualInfo", referenced from:
_InitVisual in xdisp-145c02.o
"_XMapWindow", referenced from:
_InitWindows in xdisp-145c02.o
"_XOpenDisplay", referenced from:
_InitVisual in xdisp-145c02.o
"_XPutImage", referenced from:
_ColorDisplay in xdisp-145c02.o
_InitWindow in xdisp-145c02.o
"_XRaiseWindow", referenced from:
_ColorDisplay in xdisp-145c02.o
"_XSetWindowBackgroundPixmap", referenced from:
_InitWindow in xdisp-145c02.o
"_XStoreName", referenced from:
_ColorDisplay in xdisp-145c02.o
"_main", referenced from:
implicit entry/start for main executable
(maybe you meant: _ximage_main)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

このようなエラーが出てしまい、調べたところリンクの問題ではないかということでしたがいまいちどのオプションをつけたりしたら直るかよくわかりませんでした。
X11のusr以下にあったりopt以下にあったりしてどっちを指定すればいいのかもわかりませんし、そのわりに普段の/usr/include/以下にはないみたいですが…。
同じような環境で解決した方、もしくはどのようにすればいいかわかる方いましたら回答お願いします。

環境: MacOS X(ver10.10)、Xcode(ver6.1.1)
大学でCentOSの環境でX11ライブラリを用いて勉強しています。
これを家でもやれるようにMacでも環境を整えいざやろうとしたら、コンパイルエラーで躓いてしまいました。
$ gcc -I/opt/X11/include/ xdisp.c
Undefined symbols for architecture x86_64:
"_XCopyArea", referenced from:
_ColorDisplay in xdisp-145c02.o
"_XCreateColormap", referenced from:
_InitWindow in xdisp-145c02.o
"_XCreateGC", referenced from:
_InitW...続きを読む

Aベストアンサー

全く違います. ちゃんとマニュアルで確認してください.


人気Q&Aランキング

おすすめ情報