用VFW存储AVI文件

shiqingkun 2012-11-15 02:06:41
从服务器上得到2种解码后的数据,一种是H.264的视频数据,一种是wav音频数据,都是解码后的数据。我的任务 是把这两种数据保存到AVI文件里。可以用windows播放器播放。我在网上找了一个例子。


AVIFileInit(); //初始化环境

PAVIFILE aviFile;
PAVISTREAM aviVideoStream;

//创建AVI文件
if(AVIFileOpen(&aviFile,"output.avi",OF_CREATE|OF_WRITE,0))
{
::MessageBox(NULL,"Error when creating file output.avi",NULL,0);
return;
}

//设置视频流格式
AVISTREAMINFO aviVideoStreamInfo;
aviVideoStreamInfo.fccType = streamtypeVIDEO;
aviVideoStreamInfo.fccHandler = 0;
aviVideoStreamInfo.dwFlags = 0;
aviVideoStreamInfo.dwCaps = 0;
aviVideoStreamInfo.wPriority = 0;
aviVideoStreamInfo.wLanguage = 0;
aviVideoStreamInfo.dwScale = 1;
aviVideoStreamInfo.dwRate = 5; //每秒5帧
aviVideoStreamInfo.dwStart = 0;
aviVideoStreamInfo.dwLength = 0;
aviVideoStreamInfo.dwInitialFrames = 0;//初始帧
aviVideoStreamInfo.dwSuggestedBufferSize=0;
aviVideoStreamInfo.dwQuality = 0;
aviVideoStreamInfo.dwSampleSize = 0;
aviVideoStreamInfo.rcFrame.left = 0;
aviVideoStreamInfo.rcFrame.top = 0;
aviVideoStreamInfo.rcFrame.right = width;
aviVideoStreamInfo.rcFrame.bottom = height;
aviVideoStreamInfo.dwEditCount = 0;
aviVideoStreamInfo.dwFormatChangeCount = 0;
strcpy((char *)aviVideoStreamInfo.szName,"output.avi");

//创建数据流
AVIFileCreateStream(aviFile,
&aviVideoStream,
(AVISTREAMINFO*)&aviVideoStreamInfo);

//设置位图格式
LPVOID pBits=NULL;
BITMAPINFO bmpInfo;
ZeroMemory(&bmpInfo,sizeof(bmpInfo));
bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biBitCount=32;
bmpInfo.bmiHeader.biCompression=BI_RGB;
bmpInfo.bmiHeader.biSizeImage=width*height*bmpInfo.bmiHeader.biBitCount/8;
bmpInfo.bmiHeader.biPlanes=1;
bmpInfo.bmiHeader.biHeight=height;
bmpInfo.bmiHeader.biWidth=width;

//创建位图
HBITMAP hBmp=CreateDIBSection(memDC,
&bmpInfo,
DIB_RGB_COLORS,
&pBits,
NULL,
NULL);
memDC.SelectObject(hBmp);

//字体
LOGFONT lf;
lf.lfHeight = -300;
lf.lfWidth = 0;
lf.lfEscapement = 0;
lf.lfOrientation = 0;
lf.lfWeight = FW_DONTCARE;
lf.lfItalic = 0;
lf.lfUnderline = 0;
lf.lfStrikeOut = 0;
lf.lfCharSet = DEFAULT_CHARSET ;
strcpy ( lf.lfFaceName, "楷体_GB2312" );
//创建字体并选中
CFont newFont;
if (! newFont.CreateFontIndirect (&lf))
return;
CFont* pOldFont = memDC.SelectObject (&newFont);

CRect rect(0,0,width,height);
CBrush b(RGB(255,255,255));
CString str;
int aviVideoFrame=0;
while(aviVideoFrame<100)
{
str.Format("%d",aviVideoFrame);
memDC.FillRect(&rect,&b);
memDC.DrawText(str,&rect,DT_CENTER | DT_VCENTER);
//设置帧格式
AVIStreamSetFormat(aviVideoStream,
aviVideoFrame,
&bmpInfo,
sizeof(bmpInfo));

//写数据
AVIStreamWrite(aviVideoStream,
aviVideoFrame,
1,
(LPBYTE)pBits,
bmpInfo.bmiHeader.biSizeImage,
AVIIF_KEYFRAME,
NULL,
NULL);
aviVideoFrame++;
}

//恢复字体
memDC.SelectObject(pOldFont);

//释放数据流及文件
if(aviVideoStream)
{
aviVideoStream->Release();
aviVideoStream = NULL;
}

if(aviFile)
{
aviFile->Release();
aviFile = NULL;
}

AVIFileExit();


这个例子网上有很多。。我也是用这个例子去写的。但是当我打开avi文件之后,要建立一个avi视频流。用AVIFileCreateStream这个函数创建视频流。总是返回非0.MSDN上说返回0是正确的。

真心求教。。为什么会这样。。还有。我看了下要储存AVI文件要写avi文件头,上面的例子好像没有写avi头的地方啊。。如何用VFW去写头?如果这个例子不对。求大家给个例子让我去做这个事情,解码编码不用管。。我只要把得到数据保存到avi文件里就可以了。。。全部家产52分。。我全部拿出来了。。希望大家帮忙。。。。网上找方法找了好几天。。实在是没办法了。。。
...全文
260 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zch6163608 2013-04-24
  • 打赏
  • 举报
回复
这边的avi头在调用AVIStreamWrite的时候好像就会写了吧~
zch6163608 2013-04-24
  • 打赏
  • 举报
回复
引用 楼主 shiqingkun 的回复:
本帖最后由 shiqingkun 于 2012-11-15 14:16:53 编辑 从服务器上得到2种解码后的数据,一种是H.264的视频数据,一种是wav音频数据,都是解码后的数据。我的任务 是把这两种数据保存到AVI文件里。可以用windows播放器播放。我在网上找了一个例子。 C/C++ code?123456789101112……
这边到创建数据流都没错。返回的是0,至于你说返回的不是0,是不是因为字符集问题~
zch6163608 2013-04-24
  • 打赏
  • 举报
回复
LZ问题解决了么。。。我也是想把h264视频和amr音频存入avi,也遇到问题。。止步不前 = =
shiqingkun 2012-11-16
  • 打赏
  • 举报
回复
为什么没人回答。。。。
shiqingkun 2012-11-15
  • 打赏
  • 举报
回复
CSDN现在没大神了吗?
shiqingkun 2012-11-15
  • 打赏
  • 举报
回复
自己顶一顶。。。求大神指点啊。。。困扰好久了。。我的视频数据是服务器传过来的。。上面忘记说了。

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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