H264封装成AVI文件,帧率问题

pengweibo 2010-04-30 04:41:06
从视频监控设备收到标准的264编码数据,以AVIFile API封装成.avi文件。
保存后,用暴风或其它播放器打开,视频数据不连续,几秒跳一帧(视频是没问题的,实时看是正常的)
AVIFile部分的代码如下,哪位大侠给说说。

HRESULT CAVIFile::OpenFile(LPCTSTR szFileName)
{
HRESULT result;
int m_ImageWidth = 352;
int m_ImageHeight = 288;
int m_dwBufferSize = 102400;

result = AVIFileOpen(&m_aviFile,szFileName,OF_CREATE|OF_WRITE,0);
//设置视频流格式
m_aviVideoStreamInfo.fccType = streamtypeVIDEO;
m_aviVideoStreamInfo.fccHandler = 0;
m_aviVideoStreamInfo.dwFlags = 0;
m_aviVideoStreamInfo.dwCaps = 0;
m_aviVideoStreamInfo.wPriority = 0;
m_aviVideoStreamInfo.wLanguage = 0;
m_aviVideoStreamInfo.dwRate = 18; //上传的视频是每秒18帧。
m_aviVideoStreamInfo.dwScale = 1;
m_aviVideoStreamInfo.dwQuality = 0;
m_aviVideoStreamInfo.dwSuggestedBufferSize = m_ImageWidth*m_ImageHeight*3;
m_aviVideoStreamInfo.dwStart = 0;
m_aviVideoStreamInfo.dwInitialFrames = 0;
m_aviVideoStreamInfo.dwSampleSize = 0;
m_aviVideoStreamInfo.rcFrame.left = 0;
m_aviVideoStreamInfo.rcFrame.top = 0;
m_aviVideoStreamInfo.rcFrame.right = m_ImageWidth;
m_aviVideoStreamInfo.rcFrame.bottom = m_ImageHeight;
m_aviVideoStreamInfo.dwEditCount = 0;
m_aviVideoStreamInfo.dwFormatChangeCount = 0;
strcpy((char *)m_aviVideoStreamInfo.szName,"ScreenCap.avi");
m_aviVideoStreamInfo.dwLength = 0;
//创建数据流
result = AVIFileCreateStream(m_aviFile,&m_aviVideoStream,(AVISTREAMINFO *)&m_aviVideoStreamInfo);

//设置帧格式
BITMAPINFOHEADER bmpInfoHdr;
bmpInfoHdr.biSize = sizeof(BITMAPINFOHEADER);
bmpInfoHdr.biWidth = m_ImageWidth;
bmpInfoHdr.biHeight = m_ImageHeight;
bmpInfoHdr.biBitCount = 8;//image1.GetBPP();
bmpInfoHdr.biCompression = 0x34363248;//BI_RGB;
bmpInfoHdr.biSizeImage = 0;
bmpInfoHdr.biClrImportant = 0;
bmpInfoHdr.biClrUsed = 0;
bmpInfoHdr.biXPelsPerMeter = 0;
bmpInfoHdr.biYPelsPerMeter = 0;
bmpInfoHdr.biPlanes = 1;
result = AVIStreamSetFormat(m_aviVideoStream,m_aviVideoFrames,&bmpInfoHdr,sizeof(bmpInfoHdr));

//设置音频流格式
m_aviAudioStreamInfo.fccType = streamtypeAUDIO;
m_aviAudioStreamInfo.fccHandler = 0;
m_aviAudioStreamInfo.dwFlags = 0;
m_aviAudioStreamInfo.dwCaps = 0;
m_aviAudioStreamInfo.wPriority = 0;
m_aviAudioStreamInfo.wLanguage = 0;
m_aviAudioStreamInfo.dwScale = 1; //声道数
m_aviAudioStreamInfo.dwRate = 8000; //Hz
m_aviAudioStreamInfo.dwStart = 0;
m_aviAudioStreamInfo.dwInitialFrames = 0;
m_aviAudioStreamInfo.dwSuggestedBufferSize = m_dwBufferSize;
m_aviAudioStreamInfo.dwQuality = 0;
m_aviAudioStreamInfo.dwSampleSize = 1;
m_aviAudioStreamInfo.rcFrame.bottom = 0;
m_aviAudioStreamInfo.rcFrame.left = 0;
m_aviAudioStreamInfo.rcFrame.right = 0;
m_aviAudioStreamInfo.rcFrame.top = 0;
m_aviAudioStreamInfo.dwEditCount = 0;
m_aviAudioStreamInfo.dwFormatChangeCount = 0;
m_aviAudioStreamInfo.dwLength = 0;
//创建数据流
//result = AVIFileCreateStream(m_aviFile,&m_aviAudioStream,(AVISTREAMINFO *)&m_aviAudioStreamInfo);

//设置音频格式
/*WAVEFORMAT waveFormat;
waveFormat.nAvgBytesPerSec = m_Format.nAvgBytesPerSec;
waveFormat.nBlockAlign = m_Format.nBlockAlign;
waveFormat.nChannels = m_Format.nChannels;
waveFormat.nSamplesPerSec = m_Format.nSamplesPerSec;
waveFormat.wFormatTag = m_Format.wFormatTag;
AVIStreamSetFormat(m_aviAudioStream,m_aviAudioFrames,&m_Format,sizeof(m_Format));
*/
return 0;
}

HRESULT CAVIFile::Write(LPVOID lpBuffer, LONG cbBuffer)
{
HRESULT result;
result = AVIStreamWrite(m_aviVideoStream,m_aviVideoFrames,1,lpBuffer,cbBuffer,AVIIF_KEYFRAME,NULL,NULL);
m_aviVideoFrames++;
return 0;
}

void CAVIFile::Close()
{
if(m_aviVideoStream)
{
m_aviVideoStream->Release();
m_aviVideoStream = NULL;
}

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

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


...全文
987 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
小时了了 2010-05-07
  • 打赏
  • 举报
回复
几个建议:
1. 没有音频流的话就把音频流的设置去掉试试;
2. 如果是固定码率的,试着设置一下这个值:bmpInfoHdr.biSizeImage = 每帧字节数;
3. 我之前用的办法比较笨,因为是变码率的,所以在每次AVIStreamWrite前调用了一次AVIStreamSetFormat重新设置biSizeImage;
myearth 2010-05-06
  • 打赏
  • 举报
回复
mark
pengweibo 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ccpaishi 的回复:]

open和close只调用了一次吗
[/Quote]

是的
pengweibo 2010-05-04
  • 打赏
  • 举报
回复
高手来顶呀。。。
ccpaishi 2010-05-04
  • 打赏
  • 举报
回复
open和close只调用了一次吗
pengweibo 2010-05-03
  • 打赏
  • 举报
回复
调用的顺序是 Open,然后write,最后Close.
ccpaishi 2010-05-01
  • 打赏
  • 举报
回复
你调用这几个的顺序是什么??我觉得是调用出了问题了。

2,543

社区成员

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

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