DV数码摄像机(以下简称DV机),随着人民生活水平的不断提高,正逐步进入百姓家庭中。如何将拍在磁带上的视频内容,转成媒体文件,乃至刻成光盘,是个值得探讨的问题,也是一件很有意思的问题。还好,因为我们选择了DirectShow,这一切看起来是那么的简单!
DV机通过1394接口与电脑相连(如果你的电脑没有1394接口的话,需要装一张1394转接卡);支持即插即用。使用DirectShow的一个工具软件GraphEdit,我们可以在“Video Capture Sources”目录下看到一个名为“Microsoft DV Camera and VCR”的Filter,即代表我们的DV机。微软提供的DV相关的Filter还有DV Splitter、DV Video Decoder、DV Video Encoder、DV Muxer等。DV数据,视频采用帧内压缩,音频仍然为PCM格式,采用交叉的方式来存储;PAL制的图像大小为720x576,单帧为144000字节,NTSC制的图像大小为720x480,单帧为120000字节;所以DV数据保存为文件,文件还是很大的。
一般DV数据可以直接保存到AVI文件中。有两种格式,一种格式(Type-1)仍然将音视频按DV原有的交叉格式保存,另一种格式(Type-2)将DV数据的音视频分开后再保存(这种格式视频部分其实仍然带有音频的冗余数据)。两种格式各有优缺点:Type-1可以节省CPU使用时间,适合实时捕捉的场合;而Type-2保持了对VFW的向后兼容性。
接下去,我们来看一下如何来创建我们的DV应用程序。第一步,如何通过程序去控制DV机?DV机可以有两种工作模式,一种是摄像模式,一种是回放模式。我们这里说的“控制”,主要是指如何控制DV机对磁带的一系列操作(如播放、暂停、快进、快退、停止等)。答案很简单,主要是通过DV Filter上的IAMExtTransport接口来实现的。(需要提醒一下的是,创建DV Filter,必须通过系统枚举器枚举视频捕捉设备来完成;如何枚举系统设备,请参考DirectX帮助文档,这里不再赘述。)下面是获得这个接口的参考代码:
HRESULT hr; IBaseFilter *pDVCam; // Pointer to the capture filter. IAMExtTransport *pTransport; // Create an instance of the capture filter (not shown). hr = pDVCam->QueryInterface(IID_IAMExtTransport, (void **)&pTransport); |
获得这个接口后,我们就可以通过其接口方法put_Mode来实现对DV机播放的控制了。相应地,通过get_Mode也可以得到当前DV机的状态,如下:
LONG State; hr = MyDevCap.pTransport->get_Mode(&State); if (SUCCEEDED(hr)) { switch (State) { case ED_MODE_PLAY: // playing break; case ED_MODE_STOP: // stopped break; case ED_MODE_FREEZE: // paused break; } } |
除了IAMExtTransport接口外,还有其他两个控制接口:IAMExtDevice接口,可以获得DV机当前的工作模式,参考如下:
IAMExtDevice *pDevice; hr = pDVCam->QueryInterface(IID_IAMExtDevice, (void **)&pDevice); LONG lDeviceType = 0; pDevice->GetCapability(ED_DEVCAP_DEVICE_TYPE, &lDeviceType, 0); if (lDeviceType == ED_DEVTYPE_VCR) { // Device is a VCR. Enable all VCR functions. } else { // Device is a camera. // Enable record and record-pause; disable other functions. } |
IAMTimecodeReader接口,可以获得每一个DV帧的时间戳。
第二步,我们就来看一下DV的各种实际应用场合。如下图:
我们可以将DV Filter输出的DV数据直接以Type-1的方式保存为AVI文件。如上图所示,MSDV即为DV Filter,后面紧跟着接了一个Smart Tee Filter,将一路DV流分成了两路;这样,我们在写文件的同时又能够预览,一举两得。以上的Filter Graph结构,是在视频捕捉场合最常用的。当然,我们也可以将DV数据解码后再保存,如下图:
其中,Infinite Pin Tee Filter的功能类似于Smart Tee,是SDK中提供的一个带有源码的Filter;两者的区别主要在于它们对输出数据的时间戳处理上不同。上面我们讲了两种从DV机上抓取数据的应用,那么,能不能将我们电脑上的媒体文件写到DV机的磁带上呢?答案是肯定的。请看如下参考图:
这里假设我们的AVI文件包含的视频格式是DV。(如果不是DV格式,我们需要用DV Video Encoder将视频压缩成DV格式后,再往下连接。)我们还用到了DV Mux Filter,将音频和视频流交互打包成标准的DV帧,然后送到DV Filter进行录像。
好了,讲到这,大家对DV的应用编程应该有所了解了吧?!更多的细节,还要参考DirectX的帮助文档,以及SDK中一个叫DVApp的例子,研究一下吧,可以加深理解哦!
查看本文来源