電子書籍の厳選無料作品が豊富!

今現在、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;// これらは後で解放すること。

IMG0img00;// 表示ウィンドウ用の構造体
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になってしまう理由および解決策をお教え下さい。
お願いいたします。

A 回答 (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は該当するものが見つかりませんでした。

この回答への補足

ありがとうございます
IGraphBuilder::RenderFileに

VFW_S_AUDIO_NOT_RENDERED 不完全な成功。オーディオがレンダリングされなかった。
とMSDNのページに書いてありました.

不完全な成功ということは,サウンドカードさえあれば成功するということでいいのでしょうか?

補足日時:2008/11/04 19:58
    • good
    • 0

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