Chinaunix首页 | 论坛 | 博客
  • 博客访问: 60833
  • 博文数量: 15
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 220
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-04 13:37
文章分类

全部博文(15)

文章存档

2011年(1)

2009年(14)

我的朋友

分类: WINDOWS

2009-04-07 12:01:22

1,设计中的需要解决的问题

  1,需要以AVI文件格式存储。
  2,保证视频和音频的同步。
 
2,以AVI格式存储
 
  在确定以AVI格式为最终存储格式后,我的存储方案有两个,一个是以AVILib为库进行直接存储我们自己编好的视频和音频格式(h263,mpeg4,h264),经过一段时间的折腾,发现以AVIlib为库存储的文件,许多常用的播放器(wmp,realplayer,quicktime)都不能正常播放,。想不出来是AVILib本省的问题还是我们自己程序编码的问题。(如果有高人请帮忙指点一二).
  由于时间紧迫,决心另辟蹊径,干脆用windows自带的VFWlib库,不过这需要取原始数据在进行编码,而且产生的AVI文件相对比较大,不过现阶段的目标是搞一个有声音和图像的文件出来,其他以后再优化。经过对网上找的一个vfwlib的例子AVIEditor.cpp设计出AVI录像和录音文件,在这个期间最为头痛的是如何将原始的图像数据转换成HBITMAP, 找了n久,终于在一个国外的网站上找的完整的函数(再次感谢老外),至此,所有问题得以解决,终于看到图像和听到声音。
 
3,视频和声音的同步
   到了设计中的第二个难点。我郁闷了好久,通过我的测试方向,声音的每秒中的数据相对稳定,多加帧数据和少一帧数据声音质量都会有问题,一开始我就通过调节视频图像在一秒钟的数据图像帧数来存储视频图像,时间短发现还可以,时间一长发现仍就不同步,算法:是在存一帧图像后检查时间是否在同一秒内,如果是就inc++,如果不在同一秒内(表示下一秒开始)判断inc值,如果大于fps(avi播放的帧率)就不管,如果小于,就需要补帧。难道是我的时间不够精确?
   仔细思考我的设计目标,终于我想到一个更为精确的补帧方法,首先发现我们存储的音频每4次(4000byte*4)播放时间为一秒,我们定义一个变量计算音频时间sec,一个记录音频帧数audiocount,if(audiocount++%4 == 0)
   sec++;
再到视频存储的地方去定义一个视频帧数变量videocount,
int ntmp=0;
ntmp = fps*sec-videocount;
while(ntmp-- > 0)
{
//补帧
}
注意这里视频调用的这一部分的调用写帧最多调用每秒次数只能是fps。
 

结果发现 同步效果非常的好! 因为在网上没有找到同步的比较好的材料,所有把自己的一点心得写一下,希望能够给像我一样遇到此问题的人一个抛砖引玉的作用,本次的AVI录制还有一些不足的地方,希望有高人指点一下关于avilib库的问题和vfwlib中录制的更好办法。

源码需要简单修改即可用。

文件: aviEditor.rar
大小: 4KB
下载: 下载

 

 

阅读(1592) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

chinaunix网友2010-01-13 10:38:08

你好,你用windows自带的VFWlib库产生了AVI文件,请问你的程序是基于PC的还是基于wince的?我想把经过.264编码后的数据保存为AVI文件,但我是基于wince开发,还不清楚VFWlib库在wince上是否可用。如果不可用,我是不是只能用AVILib库了?