AVI再生について

[戻る]
SH 2008/04/08(火) 23:02:57
現在、ファイルを開くダイアログを使用してAVIファイルの再生するプログラムを
作成しているのですが、上手くいきません。
上手くいかないというのは、コンパイルは通るのですがAVIを再生する際に何もイベ
ントが起こりません。
ソースを記載いたします。
ちなみに環境はWindows XPでVS2005 VC++です。

void CXXXDlg::OnBnClickedAvi()
{
    // TODO: ここにコントロール通知ハンドラ コードを追加します。
        PAVISTREAM lpas;
        
        ifstream fin;
    CFileDialog f(TRUE,"*.*","", 
        OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
        "AVIファイル (*.avi)|*.avi|");
    if(f.DoModal()==IDOK){
    // ファイルを開く
        AVIFileInit();

    if (AVIStreamOpenFromFile(&lpas, TEXT("test.avi"), streamtypeVIDEO, 
0, OF_READ, NULL) == 0) {
        LONG             lSize;
        LPBYTE           lpBits;
        BITMAPINFOHEADER bih;
        
        lSize = sizeof(BITMAPINFOHEADER);
        AVIStreamReadFormat(lpas, 0, &bih, &lSize);

        lpBits = (LPBYTE)HeapAlloc(GetProcessHeap(), 0, 
bih.biSizeImage);
        AVIStreamRead(lpas, 0, 1, lpBits, bih.biSizeImage, NULL, 
NULL);


        AVIStreamRelease(lpas);
    }
    AVIFileExit();
    }
    if(fin.fail()){
    AfxMessageBox("ファイルを開けません");
    fin.close();
    }    
}

表示しようとしているウィンドはIDC_RECT_WINDOW(m_rectwindw)です。
何が足りないのでしょうか?

よろしくお願いいたします。

PATIO 2008/04/09(水) 15:41:19
ざっと見ただけですが、イベントって何のイベントが起こることを
期待しているのでしょう?

あと、書かれたコードでは描画部分が全く無いようなので表示はされないと思います。

あと、何処にも関連が無いifstreamのインスタンスが有り、
これに対してcloseをかけているのも気になります。
failを呼んでいるのも意味があるのかどうか。

多分、サンプルソースをそのまま持ってきただけなのではないかと言う気がしますが、
書く関数が何をやるものでこのソースの中で何を処理しているのかを
きちんと理解する必要があると思います。
また、Read系の関数の返却値を全くチェックしていないのも気になります。
エラーを返す可能性がある関数に関してはちゃんとチェックするようにしないと
何処で間違っているかを特定するのも大変になりますので
ちゃんとチェックしましょう。

SH 2008/04/09(水) 16:27:13
PATIOさん

返信ありがとうございます。

AVIの再生の方法を全く変えてみました。

MCIWndCreate関数とMCIWndPlayFrom関数を用いて、

HWND hMMWnd = MCIWndCreate(
             GetDlgItem(IDC_aaa)->m_hWnd,
             AfxGetInstanceHandle(),
             MCIWNDF_NOMENU | MCIWNDF_NOOPEN | MCIWNDF_NOPLAYBAR |
             WS_MAXIMIZE | WS_VISIBLE | WS_CHILD,
             "xxx.avi");
 if(hMMWnd != 0)
   MCIWndPlayFrom(hMMWnd, 0); //再生開始

にしてみたら再生はすることに成功しました。

しかし、ファイルを開くダイアログとの関連がなく予め指定しているAVIファイルしか
再生できません。
どうしてもファイルを開くダイアログと関連させたいのですが
よい方法はありませんか?

瀬戸っぷ [E-Mail] 2008/04/10(木) 00:21:37
> しかし、ファイルを開くダイアログとの関連がなく予め指定しているAVIファイルしか
> 再生できません。
> どうしてもファイルを開くダイアログと関連させたいのですが
> よい方法はありませんか?

fopen()等でもよく出る問題ですね。

http://itpro.nikkeibp.co.jp/article/COLUMN/20061128/255158/
こちらではscanf()でやっていますが…
やり方は似たようなものです。

「ファイルを開く」のコモンダイアログでファイル名を受け取れますので、
同じように処理すればAPIにファイル名を渡せるでしょう。

PATIO 2008/04/10(木) 11:54:32
えーと。

そこまで出来ていてうまく行きませんと言っていると言うことは、


「ファイルを開く」のコモンダイアログで選択したファイル名を
受け取る方法を理解できていない。

MCIWndCreate関数の何処にどういう形でファイル名を渡せば良いかを
理解できていない。


この二つのいずれか、もしくは両方が解決できていないからですよね。
問題を一つ一つ順番に解決するように考えて見てください。
「ファイルを開く」のコモンダイアログに関しては使い方を説明したHPは
たくさんあると思いますし、MCIWndCreate関数の仕様に関してもMSDNで
調べる事が可能だと思います。

SH 2008/04/11(金) 21:21:44
[[解決]]
PATIOさん

ご指導ありがとうございます。
おっしゃる通り勉強不足でした。

GetFileName()で読み込むことができました。

皆様、いろいろとありがとうございました。

古いスレッドには追加発言できません。