怎样生成AVI文件!

周公梦游 2003-12-10 09:54:16
怎样将多幅图片结合在一起生成AVI文件!通过其它播放软件可直接播放
...全文
313 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Azusa 2003-12-10
  • 打赏
  • 举报
回复
写的匆忙
sprintf("%.3d.bmp", strFileName);

改成sprintf(strFileName, "%.3d.bmp", nImageNO);

如果文件不存在,可能会造成错误,请注意判断。
Azusa 2003-12-10
  • 打赏
  • 举报
回复
忘了::
Header: Declared in Vfw.h.
Library: Use Vfw32.lib.
Azusa 2003-12-10
  • 打赏
  • 举报
回复
// 给你一个例子程序,可以将000.bmp, 001.bmp,002.bmp...等图片压成AVI文件。
// 详细请参考MSDN中Video for Windows的说明
BOOL SaveAVI()
{
PAVIFILE pf = NULL; // AVI File.
PAVISTREAM ps = NULL; // AVI Stream.
PAVISTREAM psCompressed = NULL; // AVI Stream for Commpression.
HRESULT hr = NULL;
BOOL br = TRUE;
LONG nImageNO = 0;
int NumOfImages = 10; // 10 Images

// Initialize the AVI library.
AVIFileInit();

// Create new AVI file using AVIFileOpen.
hr = AVIFileOpen(&pf, "Sample AVI.avi", OF_WRITE | OF_CREATE, NULL);
if (hr != 0) goto EXIT_AVI;

for (nImageNO = 0; nImageNO < NumOfImages; nImageNO++)
{
TCHAR strFileName[10];
sprintf("%.3d.bmp", strFileName);

// Read the stream data.
CFile SrcFile(strFileName, CFile::modeRead);
UINT FileLength = SrcFile.GetLength();
SrcFile.Seek(sizeof(BITMAPFILEHEADER), CFile::begin);

// Windows DIB format.
HGLOBAL hDIB =
GlobalAlloc(GMEM_MOVEABLE, FileLength - sizeof(BITMAPFILEHEADER));
CHAR* pBuffer = (CHAR*)GlobalLock(hDIB);
SrcFile.Read(pBuffer, FileLength - sizeof(BITMAPFILEHEADER));

BITMAPINFO * pInfo =(BITMAPINFO*)pBuffer;
CHAR * pBits =
(CHAR*) pInfo + sizeof(BITMAPINFOHEADER) +
pInfo->bmiHeader.biClrUsed * sizeof(RGBQUAD);

// And create the stream. This job will be done only once.
if (nImageNO == 0)
{
AVISTREAMINFO strhdr;
memset(&strhdr, 0, sizeof(strhdr));

strhdr.fccType = streamtypeVIDEO;
strhdr.fccHandler = 0;
strhdr.dwFlags = NULL;
strhdr.dwCaps = NULL;
strhdr.wPriority = NULL;
strhdr.wLanguage = NULL;
strhdr.dwScale = 1;
strhdr.dwRate = 25; // Frames per second
strhdr.dwStart = 0;
strhdr.dwLength = NumOfImages;
strhdr.dwInitialFrames = 0;
strhdr.dwSuggestedBufferSize = pInfo->bmiHeader.biSizeImage;
strhdr.dwQuality = 10000;
strhdr.dwSampleSize = 0;
strhdr.dwEditCount = 0;
strhdr.dwFormatChangeCount = 0;
strcpy(strhdr.szName, "AVI VIDEO #1");
SetRect(&strhdr.rcFrame, 0, 0,
(int)(pInfo->bmiHeader.biWidth),
(int)(pInfo->bmiHeader.biHeight));

// Create a stream using AVIFileCreateStream.
hr = AVIFileCreateStream(pf, &ps, &strhdr);
if (hr != 0)
goto EXIT_AVI;

AVICOMPRESSOPTIONS opts;
AVICOMPRESSOPTIONS FAR * aopts[1] = {&opts};
memset(&opts, 0, sizeof(opts));

br = AVISaveOptions(
NULL, 0, 1, &ps, (LPAVICOMPRESSOPTIONS FAR *) &aopts);
if (!br) goto EXIT_AVI;

hr = AVIMakeCompressedStream(&psCompressed, ps, &opts, NULL);
if (hr != 0) goto EXIT_AVI;

// Set format of new stream using AVIStreamSetFormat.
hr = AVIStreamSetFormat(
ps, 0, &(pInfo->bmiHeader),
pInfo->bmiHeader.biSize +
pInfo->bmiHeader.biClrUsed * sizeof(RGBQUAD));
if (hr != 0) goto EXIT_AVI;
}

// Save the data using AVIStreamWrite.
hr = AVIStreamWrite(ps, nImageNO, 1, pBits,
pInfo->bmiHeader.biSizeImage, AVIIF_KEYFRAME, NULL, NULL);
ASSERT(hr == 0);

GlobalUnlock(hDIB);
GlobalFree(hDIB);
}

EXIT_AVI:

// Close the stream and file.
if (psCompressed)
AVIStreamRelease(psCompressed);

if (ps)
AVIStreamRelease(ps);

if (pf)
AVIFileRelease(pf);

AVIFileExit();

if (hr == 0 && br == TRUE)
return TRUE;
else
return FALSE;
}
yifengling0 2003-12-10
  • 打赏
  • 举报
回复
呵呵,flash可以, 没有做过,关注一下!~

zhucde 2003-12-10
  • 打赏
  • 举报
回复
呵呵,想法挺好.

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧