科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件DirectShow应用——支持数码摄像机

DirectShow应用——支持数码摄像机

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

如何将DV数码摄像机拍在磁带上的视频内容,转成媒体文件,乃至刻成光盘,是个值得探讨的问题。

作者:佚名 来源:hqtech 2007年10月20日

关键字: 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的各种实际应用场合。如下图:



  我们可以将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的例子,研究一下吧,可以加深理解哦!

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章