こんばんは。
動画が出来上がらないと言う事でしょうか?
AVIStreamWrite()の2番目のパラメータにAVIストリームの書き込む位置を渡していないなど。
//AVIストリームの長さを取る(次に書き込む位置にもなる)
LONG lLen = ::AVIStreamLength(pAVIStream);
HRESULT hResult = ::AVIStreamWrite(pAVIStream, lLen, 1, dib.dsBm.bmBits, dib.dsBmih.biSizeImage, AVIIF_KEYFRAME, NULL, NULL);
昔参考にしたサイトを紹介しておきます。
http://eternalwindows.jp/winmm/avi/avi07.html
以下は、1秒間30コマ(フレーム)で黒→赤にジュワ~っと変色するAVIファイル作成プログラムをしてみました。
アラもあるかと思いますが、参考程度に。
#include<windows.h>
#include<vfw.h>
#pragma comment(lib, "vfw32.lib")
//BITMAPINFOHEADERを元にAVIストリームのフォーマットを確定する
PAVISTREAM CreateDIBStream(PAVIFILE pAVIFile, LPBITMAPINFOHEADER pbih)
{
PAVISTREAM pAVIStream = NULL;
AVISTREAMINFO asf = {0};
asf.fccType = streamtypeVIDEO;
asf.fccHandler = mmioFOURCC('D', 'I', 'B', ' ');
asf.dwQuality = static_cast<DWORD>(-1);
asf.dwScale = 1;
asf.dwRate = 30;
asf.dwLength = 30;
//描写エリアの設定
::SetRect(&asf.rcFrame, 0, 0, pbih->biWidth, pbih->biHeight);
//AVIストリームの作成
HRESULT hResult = ::AVIFileCreateStream(pAVIFile, &pAVIStream, &asf);
//AVIストリームにBITMAPINFOHEADERを渡してフォーマットを確定する
hResult = ::AVIStreamSetFormat(pAVIStream, 0, pbih, sizeof(*pbih));
return pAVIStream;
}
//DIBイメージを作成する
HBITMAP CreateTestDIB(int width, int height)
{
BITMAPINFOHEADER bmih = {sizeof(bmih)};
bmih.biBitCount = 24;
bmih.biPlanes = 1;
bmih.biWidth = width;
bmih.biHeight = height;
BITMAPINFO bmi = {0};
bmi.bmiHeader = bmih;
LPVOID pvBits = NULL;
return ::CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, &pvBits, NULL, 0);
}
//お試し
int main()
{
PAVIFILE pAVIFile = NULL;
//AVIライブラリの初期化
::AVIFileInit();
//AVIファイルを開く
::AVIFileOpen(&pAVIFile, "test.avi", OF_CREATE | OF_READWRITE | OF_SHARE_EXCLUSIVE, NULL);
//DIBの作成
HBITMAP hBitmap = ::CreateTestDIB(120, 80);
//作成したDIBから情報を取る
DIBSECTION dib;
::GetObject(hBitmap, sizeof(dib), &dib);
//BITMAPINFOHEADERを元にAVIストリームを作成する
PAVISTREAM pAVIStream = ::CreateDIBStream(pAVIFile, &dib.dsBmih);
//AVIストリーム情報を取る
AVISTREAMINFO asi = {0};
::AVIStreamInfo(pAVIStream, &asi, sizeof(asi));
//DIBの背景色等を初期化しておく
HDC hDC = ::CreateCompatibleDC(NULL);
::SetTextColor(hDC, RGB(255, 255, 0));
::SetBkMode(hDC, TRANSPARENT);
::SelectObject(hDC, hBitmap);
for(int frame = 0; frame < asi.dwRate; ++frame)
{
RECT rc = {0, 0, dib.dsBm.bmWidth, dib.dsBm.bmHeight};
//取り敢えず[赤色]を変色させながら背景を塗り潰して見る
HBRUSH hBrush = ::CreateSolidBrush(RGB((256 / asi.dwRate) * frame, 0, 0));
::FillRect(hDC, &rc, hBrush);
::DeleteObject(hBrush);
//フレーム数をテキストで書き込んでみる
TCHAR text[80];
::wsprintf(text, "%d", frame);
::DrawText(hDC, text, ::strlen(text), &rc, DT_CENTER);
//AVIストリームの長さを取る
LONG lLen = ::AVIStreamLength(pAVIStream);
//AVIストリームにDIBイメージを書き込む
HRESULT hResult = ::AVIStreamWrite(pAVIStream, lLen, 1, dib.dsBm.bmBits, dib.dsBmih.biSizeImage, AVIIF_KEYFRAME, NULL, NULL);
}
//フレーム用に使ったリソースを捨てる
::DeleteDC(hDC);
::DeleteObject(hBitmap);
//AVIストリームを閉じる
::AVIStreamRelease(pAVIStream);
//AVIファイルを閉じる
::AVIFileRelease(pAVIFile);
//AVIライブラリの開放
::AVIFileExit();
return 0;
}
お礼
回答ありがとうございます。 教えていただいたサイトは私も参考にしていました。 前の回答者様のところにも書かしていただきましたが1コマづつBMPを登録することはできています。 複数コマを一度に登録しようとするとエラーになってしまします。 複数コマのBMPを一度に登録する例などがありましたら教えていただけないでしょうか?