加载中…
个人资料
南冠彤
南冠彤
  • 博客等级:
  • 博客积分:0
  • 博客访问:415,028
  • 关注人气:59
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

(转)DirectShow应用——支持数码摄像机

(2012-09-06 11:42:43)
标签:

杂谈

分类: DirectShow
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的各种实际应用场合。如下图:

(转)DirectShow应用——支持数码摄像机

   我们可以将DV Filter输出的DV数据直接以Type-1的方式保存为AVI文件。如上图所示,MSDV即为DV Filter,后面紧跟着接了一个Smart Tee Filter,将一路DV流分成了两路;这样,我们在写文件的同时又能够预览,一举两得。以上的Filter Graph结构,是在视频捕捉场合最常用的。当然,我们也可以将DV数据解码后再保存,如下图:

(转)DirectShow应用——支持数码摄像机

   其中,Infinite Pin Tee Filter的功能类似于Smart Tee,是SDK中提供的一个带有源码的Filter;两者的区别主要在于它们对输出数据的时间戳处理上不同。上面我们讲了两种从DV机上抓取数据的应 用,那么,能不能将我们电脑上的媒体文件写到DV机的磁带上呢?答案是肯定的。请看如下参考图:

(转)DirectShow应用——支持数码摄像机

   这里假设我们的AVI文件包含的视频格式是DV。(如果不是DV格式,我们需要用DV Video Encoder将视频压缩成DV格式后,再往下连接。)我们还用到了DV Mux Filter,将音频和视频流交互打包成标准的DV帧,然后送到DV Filter进行录像。

  好了,讲到这,大家对DV的应用编程应该有所了解了吧?!更多的细节,还要参考DirectX的帮助文档,以及SDK中一个叫DVApp的例子,研究一下吧,可以加深理解哦!

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有