社区
Windows SDK/API
帖子详情
如何用VFW SDK进行AVI视频剪切?
bigbear
2013-01-25 10:45:32
有知道的给提示一下呗!
...全文
590
6
打赏
收藏
微信扫一扫
点击复制链接
分享
举报
写回复
6 条
回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
bigbear
2013-09-06
谢谢各位的回复.不过我现在不用VFW了,直接改用Videograbber了,视频处理方便多了.
打赏
举报
回复
赞
u010245650
2013-07-10
谢谢2楼 很好,很详细
打赏
举报
回复
赞
zzhong2
2013-03-04
VFW好像没有对视频进行编辑的功能,你得去找怎么生成AVI文件(AVI格式剖析),怎么把两个AVI合成一个AVI以及相关的音、视频压缩解压如何实现 据说微软已经用DirectShow代替了VFW,DirectShow可以实现二次录像(对一个现有的视频录像)
打赏
举报
回复
赞
bigbear
2013-03-01
谢谢楼上的回复,不过,这些我已经知道了!我说得是如何对视频文件进行剪切,合并等等的剪辑功能。
打赏
举报
回复
赞
我不懂电脑
2013-01-28
我在做一个小的视频聊天软件的过程中,充分利用了vfw提供的各种特性。下面分几个部分讲述我对vfw的认识。比较适合入门级别。 视频截取 视频聊天软件中,由一端到另一端的视频流先后要经历 视频截获、视频帧压缩、视频帧传输、视频帧解压缩、视频显示。这里就讲述视频截取我的看法。 第一,由视频设备(usb摄像头或者其他)抓取模拟视频数据并转化为适于计算机处理的数字视频数据。 第二,把原始的视频数据传至视频驱动程序的缓存区。 第三,进过我的实践,在调用vfw的进程空间内,会有个缓存区,用于保存从驱动程序传过来的视频数据。 第四,进程通过vfw窗口把进程缓存区里面的视频帧数据提取出来并且显示。 第五,通过注册回调函数,可是处理各种情况,状态回调,错误回调,视频流回调,视频帧回调,让步回调。 (1)创建cap窗口 HWND VFWAPI capCreateCaptureWindow( LPCSTR lpszWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWnd, int nID ); 这个函数创建截取窗口,这个窗口也就是用来显示截取的视频。 可以通过 CAPSTATUS CapStatus; capGetStatus(hWndC, &CapStatus, sizeof (CAPSTATUS)); 组合来获取截取窗口的状态,在程序中,每当需要知道窗口的状态,就必须实时调用capGetStatus函数,因为窗口的状态是随时可能改变的。 CAPSTATUS 结构的说明: typedef struct { UINT uiImageWidth; UINT uiImageHeight; BOOL fLiveWindow; BOOL fOverlayWindow; BOOL fScale; POINT ptScroll; BOOL fUsingDefaultPalette; BOOL fAudioHardware; BOOL fCapFileExists; DWORD dwCurrentVideoFrame; DWORD dwCurrentVideoFramesDropped; DWORD dwCurrentWaveSamples; DWORD dwCurrentTimeElapsedMS; HPALETTE hPalCurrent; BOOL fCapturingNow; DWORD dwReturn; UINT wNumVideoAllocated; UINT wNumAudioAllocated; } CAPSTATUS; uiImageWidth 窗口的像素宽度,也就是窗口显示的图像的像素宽度。 uiImageHeight 窗口的像素高度,也就是窗口显示的图像的像素高度。 fLiveWindow 如果窗口使用预览模式(capPreview)来显示视频,那么这项为true,否则false。 fOverlayWindow 如果窗口使用重叠模式(capOverlay)来显示视频,那么这项为true,否则false。 fScale 如果窗口使用重叠模式,则此项无效。若true,图像的显示被比例被改变(capPreviewScale),即原始图像被改变比例以适应截取窗口的大小,若false,则显示原始图像比例。 ptScroll 截取窗口左上角像素相对于原始图像左上角的偏移(应该是因为fScale的原因)。 fUsingDefaultPalette 若true,驱动使用默认的调色板。 fAudioHardware 我不关心。 fCapFileExists 我不关心。 dwCurrentVideoFrame 当前视频截取时得到的总的帧数,包括丢失的。 dwCurrentVideoFramesDropped 当前视频截取时丢失的总帧数。 dwCurrentWaveSamples 不关心。 dwCurrentTimeElapsedMS 从当前视频截取开始到当前的微秒数。 hPalCurrent 当前调色板的句柄。 fCapturingNow 若true,视频截取正在进行中。 dwReturn 不关心。 wNumVideoAllocated 进程内视频缓存区的大小。 wNumAudioAllocated 不关心。 (2)枚举驱动-获取驱动的参数 char szDeviceName[80]; char szDeviceVersion[80]; for (wIndex = 0; wIndex < 10; wIndex++) { if (capGetDriverDescription( wIndex, szDeviceName, sizeof (szDeviceName), szDeviceVersion, sizeof (szDeviceVersion) )) { // Append name to list of installed capture drivers // and then let the user select a driver to use. } } 以上代码段获取每一个视频驱动的描述信息 驱动名字 以及 驱动的版本号。 capGetDriverDescription的wIndex参数只能是0、1....、9,可能是系统最多支持10类型视频设备的驱动。并且capGetDriverDescription优先获取热拔插视频设备的驱动信息,比如usb视频设备。 CAPDRIVERCAPS cps; capDriverGetCaps(hCaptureWindow,&cps,sizeof(CAPDRIVERCAPS)); 以上代码用于获取 截取窗口所连接的驱动的 参数。 以下是CAPDRIVERCAPS说明: typedef struct { UINT wDeviceIndex; BOOL fHasOverlay; wDeviceIndex 驱动序号,即0-9之一。 fHasOverlay 此驱动是否支持重叠模式。 fHasDlgVideoSource 此驱动是否支持视频源选择对话框。 fHasDlgVideoFormat 此驱动是否支持视频帧格式设置对话框。 fHasDlgVideoDisplay 此驱动是否支持视频控制对话框。 fCaptureInitialized 若true,则视频设备已经初始化完成。 fDriverSuppliesPalettes 若true,此驱动可以创建调色板。 hVideoIn 忽略。 hVideoOut 忽略。 hVideoExtIn 忽略。 hVideoExtOut 忽略。 (3)窗口连接驱动 使用capDriverConnect(hCaptureWindow,wIndex)即可完成窗口hCaptureWindow和第wIndex号驱动的连接。窗口在现实视频之前必须先和一个驱动连接,因为视频数据由驱动程序提供给窗口,然后由窗口显示。 (4)获取并视频帧格式 DWORD dwSize =capGetVideoFormatSize(hCaptureWindow); lpbi=(LPBITMAPINFO)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY|HEAP_NO_SERIALIZE,dwSize); capGetVideoFormat(hCaptureWindow, lpbi, dwSize); 以上代码段获取截 取窗口连接的 驱动的 视频帧格式。是一个BITMAPINFO可变长度结构。 lpbi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); lpbi->bmiHeader.biBitCount=8; lpbi->bmiHeader.biWidth=200; lpbi->bmiHeader.biHeight=400; lpbi->bmiHeader.biPlanes=1; lpbi->bmiHeader.biCompression=BI_RGB; lpbi->bmiHeader.biClrImportant=0; lpbi->bmiHeader.biClrUsed=0; lpbi->bmiHeader.biSizeImage=lpbi->bmiHeader.biWidth*lpbi->bmiHeader.biHeight; 以上设置BITMAPINFO可变长度结构的各个项,按照自己的需求来改,但是一定要是驱动程序支持的。一般都可以使用默认值,不需要改。改的话一般只改长宽值。 capSetVideoFormat(hCaptureWindow, lpbi, dwSize); 以上设置更改后的视频帧格式。 从驱动程序截取过来的帧都是以上设置的格式。 (5)预览视频 CAPDRIVERCAPS cps; capDriverGetCaps(hCaptureWindow,&cps,sizeof(CAPDRIVERCAPS)); if (cps.fHasOverlay) //如果驱动支持重叠模式的话,就优先选择重叠模式,我的机器不支持,仅凭msdn上的一点洋文,我无法理解何为重叠模式。 一般来说,可能就是重叠模式更多的利用了硬件特性,效率速度比预览模式要高。 capOverlay(hCaptureWindow, TRUE); else { capPreviewScale(hCaptureWindow,true); //设置预览模式拓展源图像比例以适应截取窗口的大小。显示出来后会失调。 capPreviewRate(hCaptureWindow,30); capPreview(hCaptureWindow,TRUE); //开启预览模式。 } 这样之后,就可以在截取窗口中看见视频了。 (6)回调函数 回调函数是vfw里面重要的一环,很多重要的功能都需要回调函数才能完成。 状态回调: BOOL capSetCallbackOnStatus( hwnd, fpProc ); 设置状态回调函数。 // StatusCallbackProc: 状态回调函数 // hWnd: capture window handle // nID: 状态码,一个状态码对应一个特定的状态改变。 // lpStatusText: 与状态相关的文本信息。 // LRESULT PASCAL StatusCallbackProc(HWND hWnd, int nID, LPSTR lpStatusText) { if (!hWnd) return FALSE; if (nID == 0) { // Clear old status messages. SetWindowText(hWnd, (LPSTR) gachAppName); return (LRESULT) TRUE; } // Show the status ID and status text... wsprintf(gachBuffer, "Status# %d: %s", nID, lpStatusText); SetWindowText(hWnd, (LPSTR)gachBuffer); return (LRESULT) TRUE; } 错误回调: BOOL capSetCallbackOnError( hwnd, fpProc ); 以上设置错误回调函数。 LRESULT CALLBACK capErrorCallback( HWND hWnd, int nID, LPCSTR lpsz ); 相关的参数和状态回调意义相同。 下面重点说明视频流回调,和帧回调,这也是视频截取中最最重要的部分,主要是因为msdn是说的实在是太过简单,聊聊几句带过。而网上也都是些粘贴党。 BOOL capSetCallbackOnFrame( hwnd, fpProc ); 以上设置帧回调函数。下面是回调函数的原型。 LRESULT CALLBACK capFrameCallback( HWND hWnd, LPVIDEOHDR lpVHdr ); hWnd就是截取窗口的句柄值。 lpVHdr基本上我们只关心它的两个成员即lpVHdr->lpData,lpVHdr->dwBufferLength。lpVHdr->lpData是一个指针,指向进程空间内的视频缓存区内, lpVHdr- >dwBufferLength是这个缓冲区的长度。但是实际的数据长度却要通过strlen(lpVHdr->lpData)来获取。lpVHdr->lpData指向的数据仅仅是图像的实际数据,就是说不包括 BITMAPINFO结构。如果要传输的话,还需要获取当前驱动的截取的视频格式capGetVideoFormat()来得到 BITMAPINFO结构,然后把BITMAPINFO和lpVHdr->lpData数据组合起来成为一幅位图经过压缩后发送。 capFrameCallback在什么时候被调用呢?这是个很重要的问题。看了下msdn说这个函数只用在预览模式下。在视频帧从内存缓存区传送的窗口显示之前被调用。有两点很重要条件,一是视频帧要是从内存缓存区出来的(不是直接从驱动缓存区出来的。貌似重叠模式下就是视频数据不经过进程空间的内存缓存区,而是直接由驱动缓存直送窗口显示,这样就提高了效率)。二是,帧要被送往窗口显示。这两点是我自己总结的,只要符合这两个条件,capFrameCallback就会被调用。 那么就顺便讨论一下几个截取视频的函数capCaptureSingleFrame(),capGrabFrame(),capGrabFrameNoStop()。 capCaptureSingleFrame(),就是用来提取单帧,这个函数就是从视频驱动缓存提出视频帧数据,然后存入内存缓存区,然后从内存缓存区送至窗口显示,也就是说满足了capFrameCallback调用的两个条件。真实的结果也是如此。 capGrabFrame(),工作方式与capCaptureSingleFrame()一样,唯一不同的是capGrabFrame()执行完后会禁止重叠模式以及预览模式(msnd上如是说,我就不明白了,两种模式都禁止了,那之后还怎么截取视频流啊?可能这个函数可以专门用来截单帧图像,类似于QQ截图,框选完后整个画面就静止了,应该就是禁止了重叠模式以及预览模式,之后就不再需要这两种模式了,因为接完一张图我就不干了,再截图的时候再开启就可以了)。 capGrabFrameNoStop(),capGrabFrame()工作的时候进程内其他事务就暂停就像死机一样,而这个函数之所以NoStop就是 它会开辟一个新线程来执行capGrabFrame()所干的事情。 我觉得理解到这个程度只要对编程没有影响就可以了。 最后是视频流回调: BOOL capSetCallbackOnVideoStream( hwnd, fpProc ); LRESULT CALLBACK capVideoStreamCallback( HWND hWnd, LPVIDEOHDR lpVHdr ); 以上设置了视频流回调。 这个回调函数在进程视频缓存区可用(应该就是满的时候)的时候才被调用。所以才能体现 流 这一概念。像水一样,把缓存区流满了要溢出的时候就要采取措施了,于是capVideoStreamCallback被调用了用以处理缓存区满或者可用的情况。 也有相关的函数capCaptureSequence(),capCaptureSequenceNoFile()。 capCaptureSequence(),作用就是从进程缓存区把视频流存入一个AVI文件(由capFileSetCaptureFile指定)。 capCaptureSequenceNoFile(),的作用应该来说仅仅是通过不断地截取视频使内存缓存区满,来使capVideoStreamCallback不断地被调用。这个函数不会把视频流存入文件。显然这个函数适用于视频聊天程序,不断地通过回调函数获取视频帧,然后......
打赏
举报
回复
赞
bigbear
2013-01-26
自己顶一下!
打赏
举报
回复
赞
相关推荐
windows下
视频
捕捉
VFW
和DirectShow
windows下
视频
捕捉
VFW
和DirectShow
利
用
VFW
在Delphi中开发
视频
捕获程序
文中详细介绍了如何利
用
VFW
在Delphi中开发
视频
捕获程序的步骤,同时给出了程序实例。...微软为软件开发人员提供了一个专门
用
于
视频
捕获的
VFW
SDK
,从而为在Windows系统中实现
视频
捕获提供了标准的接口,并大大
视频
VFW
微软为软件开发人员提供了一个专门
用
于
视频
捕获的
VFW
(Video for Windows)
SDK
。
VFW
SDK
为在Windows系统中实现
视频
捕获提供了标准的接口,从而大大降低了程序的开发难度。由于
VFW
SDK
只有VC和VB版,没有Delphi版,...
基于Delphi的
VFW
视频
捕获程序的开发
摘要:许多关于
视频
的软件(如...微软为软件开发人员提供了一个专门
用
于
视频
捕获的
VFW
SDK
,从而为在Windows系统中实现
视频
捕获提供了标准的接口,并大大降低了程序的开发难度。由于
VFW
SDK
只有VC和VB版,没有Delphi
技术分享| 如何使
用
FFmpeg命令处理音
视频
它既可以使
用
API对音
视频
进行
处理,也可以使
用
FFmpeg命令编辑音
视频
文件。 包含
用
于音频、
视频
和字幕流的多个解码器和编码器,以及多个位流过滤器。 FFmpeg目录及其作
用
libavutil: 是一个包含
用
于简化编程的函数...
vfw
控制摄像头采集图像
基于
VFW
的摄像头
视频
捕捉程序 #include <
vfw
.h> #pragma comment(lib, "
Vfw
32.lib") 初始化操作 1、创建捕获窗口 函数 capCreateCaptureWindow() 返回
视频
捕获窗口,它是...
VFW
介绍
一种实现
视频
捕捉的简单方法沈旭(湛江师范学院...实现
视频
捕获的方法有很多,本文主要介绍了微软公司
VFW
(Video for Windows)软件包中的
AVI
Cap窗口类的成员函数和一些关键宏,以及与编写
视频
捕捉程序紧密相关的几个结构
用
Delphi实现网络
视频
编程
在MSN、QQ等聊天类的应
用
程序中,都应
用
到了网络
视频
技术。Delphi使
用
Object Pascal语言是一种完全面向对象语言,可以开发出灵活强大的程序...微软为软件开发人员提供了一个专门
用
于
视频
捕获的
VFW
(Video for Window...
用
Delphi开发
视频
聊天软件
摘要:目前网上
视频
聊天软件、
视频
会议软件、可视IP电话软件随处可见,你是否想自己做一个玩玩?...微软为软件开发人员提供了一个专门
用
于
视频
捕捉的
VFW
SDK
,
用
它实现
视频
捕捉很简单,至于网络传输嘛
VFW
视频
捕获
今天刚刚试过使
用
VFW
做
视频
捕获。放了近半年始终想做这个一直摸不着头绪,今天终于初见成果。实现了利
用
VC程序控制普通摄像头。 Microsoft 的Visual C++自从4.0版就开始支持Video forWindows(简称
VFW
),这给
视频
...
大学生上网调查报告4篇.pdf
大学生上网调查报告4篇.pdf大学生上网调查报告4篇.pdf大学生上网调查报告4篇.pdf大学生上网调查报告4篇.pdf大学生上网调查报告4篇.pdf大学生上网调查报告4篇.pdf大学生上网调查报告4篇.pdf大学生上网调查报告4篇.pdf
js音乐播放器Demo
js音乐播放器Demo
煤矿安全监测监控系统管理制度汇总(最新、完整).pdf
煤矿安全监测监控系统管理制度汇总(最新、完整).pdf煤矿安全监测监控系统管理制度汇总(最新、完整).pdf煤矿安全监测监控系统管理制度汇总(最新、完整).pdf煤矿安全监测监控系统管理制度汇总(最新、完整).pdf煤矿安全监测监控系统管理制度汇总(最新、完整).pdf
电动执行器的维护.pdf
电动执行器的维护.pdf电动执行器的维护.pdf电动执行器的维护.pdf电动执行器的维护.pdf电动执行器的维护.pdf
导入导出链接,网站内链外链,反向链接是什么意思?.pdf
导入导出链接,网站内链外链,反向链接是什么意思?.pdf导入导出链接,网站内链外链,反向链接是什么意思?.pdf导入导出链接,网站内链外链,反向链接是什么意思?.pdf导入导出链接,网站内链外链,反向链接是什么意思?.pdf导入导出链接,网站内链外链,反向链接是什么意思?.pdf导入导出链接,网站内链外链,反向链接是什么意思?.pdf导入导出链接,网站内链外链,反向链接是什么意思?.pdf导入导出链接,网站内链外链,反向链接是什么意思?.pdf
黄河小浪底调水调沙问题(mathmatica)
利
用
mathmatica数学工具解决黄河小浪底调水调沙问题,其中设计了插值法(三次样条函数)和拟合方法(线性和非线性)。 文档中包含了实验原理,实验过程,实验代码,实验感想与收获方面,有详细的数据分析,图像制作说明。 该资源包包含实验报告和实验代码,其中实验代码是.nb格式。
调度理论及算法- 车间流水线调度 各种类型机台调度,决策模型
Supplementary Electronic Material ............................. xix 1 Introduction ................................................ 1 1.1 The Role of Scheduling .................................... 1 1.2 The Scheduling Function in an Enterprise ................... 4 1.3 Outline of the Book....................................... 7 Part I Deterministic Models 2 Deterministic Models: Preliminaries ........................ 1
调味品行业发展现状概述.pdf
调味品行业发展现状概述.pdf调味品行业发展现状概述.pdf调味品行业发展现状概述.pdf调味品行业发展现状概述.pdf调味品行业发展现状概述.pdf
大学生网络阅读现状调查与思考-最新作文.pdf
大学生网络阅读现状调查与思考-最新作文.pdf大学生网络阅读现状调查与思考-最新作文.pdf大学生网络阅读现状调查与思考-最新作文.pdf大学生网络阅读现状调查与思考-最新作文.pdf大学生网络阅读现状调查与思考-最新作文.pdf大学生网络阅读现状调查与思考-最新作文.pdf大学生网络阅读现状调查与思考-最新作文.pdf大学生网络阅读现状调查与思考-最新作文.pdf
发帖
Windows SDK/API
加入
微信扫一扫
点击复制链接
1214
社区成员
8152
社区内容
C++ Builder Windows SDK/API
社区管理员
申请成为版主
帖子事件
创建了帖子
2013-01-25 10:45
社区公告
暂无公告