• 締切済み

RENDERFILEについての質問です

今現在、DIRECTSHOWで動画でいろいろしてみようと思ったのですが、壁に当たりました。 デバッグ無しで開始すると、 RenderFile hr 40258と表示されます。 ソースですが関連するところを書くと #include <windows.h> #include <string.h> #include <dshow.h> // DirectShowのヘッダファイル #include <qedit.h> // SampleGrabber用 #include <conio.h> // getch()用 #include <stdio.h> #include "list502.h" #pragma warning(disable:4996) void main( void ) { // インターフェース用のポインタ // フィルタグラフ用 IGraphBuilder *pigb = NULL; IMediaControl *pimc = NULL; IMediaSeeking *pims = NULL; // サンプルグラバ用 IBaseFilter *pF = NULL; ISampleGrabber *pGrab = NULL; // これらは後で解放すること。 IMG0 img00; // 表示ウィンドウ用の構造体 BYTE *buffer; // 外部バッファ AM_MEDIA_TYPE amt; WCHAR filename[ MAX_PATH ]; HRESULT hr; img00.hi = (HINSTANCE)GetWindowLong( HWND_DESKTOP, GWL_HINSTANCE ); img00.x = 100; img00.y = 100; gr_reg(); // 表示用ウィンドウの登録 CoInitialize(NULL); // COMの準備 // FilterGraphの初期化 CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pigb); // フィルタグラフのインターフェースを得る pigb -> QueryInterface( IID_IMediaControl, (void **)&pimc ); pigb -> QueryInterface( IID_IMediaSeeking, (void **)&pims ); // グラバフィルタを作りフィルタグラフに追加 CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (LPVOID *)&pF); pF -> QueryInterface( IID_ISampleGrabber, (void **)&pGrab ); pigb -> AddFilter( pF, L"SamGra" ); // グラバフィルタの挿入場所の特定のための設定 ZeroMemory( &amt, sizeof(AM_MEDIA_TYPE) ); amt.majortype = MEDIATYPE_Video; amt.subtype = MEDIASUBTYPE_RGB24; amt.formattype = FORMAT_VideoInfo; pGrab -> SetMediaType(&amt); OPENFILENAME fname; static char fn[256]; memset(&fname, 0, sizeof(OPENFILENAME)); fname.lStructSize = sizeof(OPENFILENAME); fname.lpstrFile = fn; // パス付きファイル名が格納されるアドレス fname.nMaxFile = sizeof(fn); fname.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; if( ! GetOpenFileName( &fname ) ) return ; // ファイル名の変換 MultiByteToWideChar( CP_ACP, 0, fn, -1, filename, MAX_PATH ); // 再生するファイルを指定、この時点で使用するフィルタが決まる hr = pigb -> RenderFile( filename, NULL ); printf( "RenderFile hr %x\n", hr ); if(hr != 0) return; ポイント箇所は WCHAR filename[ MAX_PATH ]; hr = pigb -> RenderFile( filename, NULL ); printf( "RenderFile hr %x\n", hr ); hrが0だと、成功を意味していると思います。それ以外だとリターンで終了します。 強引にhr=0で強引に0にしてみたら Just-in-Timeで例外が発生しました。これは強引に0にしたからだと思います。 %xは16進数を意味しているはずです。 余談ですが、動画ファイル以外(テキストファイルなど)を開くと hr=80040625と出ます。 この数字(16進)はエラーコードなのでしょうか? どうかhrが40258になってしまう理由および解決策をお教え下さい。 お願いいたします。

みんなの回答

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

const TCHAR* DXGetErrorDescription9(HRESULT hr); とか役にたつかも。 これじゃないのかな ---------------------------------------------------------------------- hr{0x40258}, errorDescription{Cannot play back the audio stream: no audio hardware is available.} VFW_S_AUDIO_NOT_RENDERED:Partial success; the audio was not rendered. オーディオ ストリームを再生できない。 ユーザーのコンピュータにサウンド カードがない場合、このメソッドは VFW_S_AUDIO_NOT_RENDERED を返す。この場合にはオーディオのプレビューは行われないが、ビデオ プレビューには影響はない。 ---------------------------------------------------------------------- DirectXのリファレンスの「Error and Success Codes」 ページにエラーコードの一覧みたいなのがありましたよ。 ---------------------------------------------------------------------- 0x80040625は該当するものが見つかりませんでした。

noname#189082
質問者

補足

ありがとうございます IGraphBuilder::RenderFileに VFW_S_AUDIO_NOT_RENDERED 不完全な成功。オーディオがレンダリングされなかった。 とMSDNのページに書いてありました. 不完全な成功ということは,サウンドカードさえあれば成功するということでいいのでしょうか?

すると、全ての回答が全文表示されます。

関連するQ&A