视频采集

前一段时间写的“实时语音通信”,朋友们给了我很大鼓励,甚感欣慰!但是就那个程序,现在让我困苦不堪。在这里恳请高手帮助解决这些问题:

1、回放问题,仍然没有实现的双缓冲播放。播放两个声音块的效果就像火车经过两节铁轨的接点,不连续,有杂音。这简直让人无法忍受!为了弱化这个问题,不得不增大INP_BUFFER_SIZE值,以减少“接点”个数。于是第二个问题就来了。

2、延时问题,那个程序的延时达到秒级,当时考虑了网络壅塞以及节省内存的情况多次使用了内存申请、释放、内存拷贝函数再加那个巨大的缓冲区,难怪有这么大的延时。在网络品质很好的局域网里,这更让人不可接受!

许多朋友希望我能介绍一下视频的编程,时下视频聊天几乎成了网吧老板们制胜的法宝,自己的软件嵌入视频通信方式又显得那么酷,而一个摄像头只需要百来块钱。本软件功能上可以实现视频采集、预览,选择压缩器(视频文件可是大得惊人!)进行压缩、解压,回放。抓取单帧图片保存等。

简单介绍一下程序吧,在 OnInitDialog() 里面:

InitCaptureFormat()初始化BITMAP m_InInfo,设置视频采集数据的格式。

接着,触发OnDisplay().装载动态链接库VideoDll.dll,如果成功则初始化COMPVARS m_CV这个变量,设置压缩器,可以手动设置也可以调用系统对话框。

在 VideoDll.dll 中根据压缩器初始化解压器COMPVARS m_2CV,InitVideoCard()调用了系列cap...()函数,

详情请参考MSDN或与我联系(terrist007@163.com或candy0624@163.com)索取更进一步代码。

void CVideoPlayBackDlg::InitVideoCard()
{
  if(!capDriverConnect(m_hWndCapture,0))//连接设备驱动程序
    AfxMessageBox("Driver Connect Failure");
  //set the video format
  if(!capSetVideoFormat(m_hWndCapture,&m_InInfo,sizeof(BITMAPINFO)))
    AfxMessageBox("Fail to set the video format");//如果驱动不支持此格式将返回0
  capPreviewRate(m_hWndCapture,24);//预览桢速
  capPreview(this->m_hWndCapture,TRUE);//可以预览
  if(!capSetCallbackOnFrame(this->m_hWndCapture,FrameCallBack))//设置单桢的回调函数
    AfxMessageBox("fail to setCallbackOnFrame function");
}

值得一提的是那个回调函数 FrameCallBack(),它对采集到的数据(单幅图片)进行处理。为了方便理解,我把压缩ICSeqCompressFrame()、解压ICDecompress()、窗口刷新InvalidateRect()三个函数全写在这里而省略了网络发送部分,实际运用当中通过Socket把Buf里面的数据发送出去即可,读者可以轻松完成,您当然也可以参考我在“实时语音通信”中介绍的网络传送机制。当然如果您很厉害,还可以运用各种算法对数据进行运算,实现一些号称“智能”的效果。运行结束后别忘了释放资源,就OK了

结束语

如果想实现实时的语音、视频通信,而且语音视频要同步;如果想保存成avi动画,还得啃那些cap打头的函数们。

本文配套源码

时间: 2024-10-31 23:53:18

视频采集的相关文章

入门视频采集与处理(BT656简介)

凡是做模拟信号采集的,很少不涉及BT.656标准的,因为常见的模拟视频信号采集芯片都支持输出BT.656的数字信号,那么,BT.656到底是何种格式呢?      本文将主要介绍 标准的 8bit BT656(4:2:2)YCbCr SDTV(标清) 数字视频信号格式,主要针对刚刚入门模拟视频采集的初学者入门之用. 1.  帧的概念(Frame)     一个视频序列是由N个帧组成的,采集图像的时候一般有2种扫描方式,一种是逐行扫描(progressive scanning),一种是隔行扫描(i

入门视频采集与处理(学会分析YUV数据)

做视频采集与处理,自然少不了要学会分析YUV数据.因为从采集的角度来说,一般的视频采集芯片输出的码流一般都是YUV数据流的形式,而从视频处理(例如H.264.MPEG视频编解码)的角度来说,也是在原始YUV码流进行编码和解析,所以,了解如何分析YUV数据流对于做视频领域的人而言,至关重要.本文就是根据我的学习和了解,简单地介绍如何分析YUV数据流.     YUV,分为三个分量,"Y"表示明亮度(Luminance或Luma),也就是灰度值:而"U"和"V

android中如何将视频采集到缓冲区中

问题描述 android中如何将视频采集到缓冲区中 我打算先通过摄像头将视频采集到缓冲中,然后再从缓冲中读取数据 解决方案 视频采集这块的 我记得自己有demo

用DirectShow实现视频采集-流程构建

DirectShow作为DirectX的一个子集,它为用户提供了强大.方便的多媒体开接口,并且它拥有直接操作硬件的能力,这使得它的效率远胜于用GDI等图形方式编写的多媒体程序.前面一篇文章已经对DirectShow作了粗略的介绍,阐述了它的原理及一些编程方法.这里结合实践中运用DirectShow实现视频采集(WIN32)来加深对DirectShow的理解和操作能力. 1.系统环境及开发环境    l       系统支持DirectX(Win 2K以上系统) l       VC++  6.0

视频流-Android端音视频采集到推流这一步,服务器端不需要

问题描述 Android端音视频采集到推流这一步,服务器端不需要 各位大牛,小弟现在因为项目需求,需要做一个android端采集音视频并实时对音视频编解码(AAC/H.264), 然后封包RTMP推送至流媒体服务器,服务器端再实时将可播放的流发送至其他android客户端以支持RTMP协议的流媒体播放. 在网上找了很多文章都大同小异,而且感觉不是很适合. 感觉视频流用MediaRecorder进行H264硬编码 + LocalSocket的方案可行,但要是直接可播放的流貌似应该要先发送SPS和P

提取DirectShow中视频采集的数据

DirectShow中,数据流(Data Flow)都是依次流过各个Filter的.它对数据的管理也有自己的方法,而且并没有向用户提供一个统一的接口,供用户操作数据流.这里以提取视频采集在的每帧为位图数据为例,说说如何在Directshow中提取数据. 这里我们用到了DirectShow提供给我们的接口ISampleGrabber,并定义了一个供它回调的CSampleGrabberCB对象(继承ISampleGrabberCB接口). 我们知道,DirectShow中的数据存储是通过Sample

(DirectX系列05)DirectShow 视频采集

    前几小节陆续介绍了Directsound.Directshow音频处理方面的技术,还没有介绍视频方面的技术,从这节开始介绍视频采集方面的技术.今日刚好就介绍Directshow视频采集技术,其实DirectShow视频采集并不复杂,复杂的部分微软已经帮做好了,只需按照顺序将API连接起来即可,如下所叙述: 系统设备枚举     系统设备枚举器为我们按类型枚举已注册在系统中的Fitler提供了统一的方法.而且它能够区分不同的硬件设备,即便是同一个Filter支持它们.这对那些使用Windo

采集视频-基于v4l2的视频采集求助

问题描述 基于v4l2的视频采集求助 想达成这样一个目的:代码运行后弹出一个框框,框框里显示的是摄像头获取的视频(连续取图,不是生成一个视频文件) 最近老师布置课程做人脸识别,我知道opencv所用的是cvQueryFrame,连续取图显示在框框里看起来就像是一个摄像头监控.请问一下v4l2可以做到吗?目前我在 ioctl(fd, VIDIOC_DQBUF, &buf) 取得一帧图像数据后就不知道该怎么处理了.如何才能显示在一个框内?然后下一帧又覆盖框内原先的图,使到框内形成动态?求助.或者给我

Window 下 VFW 视频采集与显示

引言       经过几天的努力终于将VFW视频采集与显示功能完整实现了,不得不说网上对这方面完整的详细讲解文章是在太少了.所以就要本人来好好总结一下让后来者不再像我一样折腾好久.在本文中我将详细讲解VFW视频采集过程的实现,以及采集后视频的显示方法. VFW简介          虽然这是篇技术博文,但是我觉得用一个东西,那么关于它的概述还是不能少,所以特从百度上copy了下VFW的概念描述,如果读者不想看可以直接去观看正文部分.          VFW(Video for Windows)