实现file writer filter

Directshow中用来写文件的filter主要是file writer filter,另外在DirectX的参考代码中有一个dump的例子。由于特定的应用及PPC/Smartphone等Windows CE平台的需求,常常要自己编写file writer filter。

1. filter之间传送数据

两个filter之间是怎样传送数据在Directshow文档中有详细说明,一般都是input pin实现IMemInput接口,outpin pin调用input pin的IMemInput接口上的Receive函数。其实这就是一种推模式,一个filter graph链路中,除了source filter和后续transform filter(如mux/demux filter)之间可能是拉模式外,后面filter之间一般都是采用推模式来传送数据。形象地说,上一级filter对后一级filter说:“来,你要的东东已经准备好了,把你的手升过来,我给你”。这里所说的手也就是下filter提供的接受数据的方法,如IMemInput::Receive()。当然,下一个filter如果是render filter的话,它还可以提供其他方法去供上一级filter调用来获取数据。也就是下面所说的Istream接口。

2. IStream接口

里面的方法就不多说了,它是一个提供数据传送和控制的接口。如果在render filter上实现这个接口,那么它就是向上级filter提供的又一个“手”。当然,IStream接口提供的方法与IMemInput::Receive()用着很大的区别,前者可控制流对象,如文件和整个读写缓存等,在file writer filter中实际应用;后者只是负责接收media sample,在两个filter之间起到传接数据的作用。

3. file writer filter的实现

从文档中可以看出,MS提供的file writer filter与dump filter之间最大的区别在于前者实现的IStream接口。它可以对读写的文件对象进行控制和操作,如在写文件结束之前,在文件的开始处插入一个文件格式头,如AVI文件头。实际的写音视频码流一般是IMemInput::Receive()接收之后,再writefile的,我们也可以直接调用IStream::Write()来实现。所以说,写file writer filter实现Istream接口是关键。下面是我写avi writer filter时IStream::write()的实现,实际上它也可以用来写其他格式的文件:

STDMETHODIMP CStream::Write(const void *pv, ULONG cb, ULONG *pcbWritten)

 DWORD dwWritten;
 
    // If the file has already been closed, don't continue
    if (m_pAVIWriter->m_hFile == INVALID_HANDLE_VALUE) {
        return S_FALSE;
    }
    if (!WriteFile(m_pAVIWriter->m_hFile, (PVOID)pv, (DWORD)cb,
  &dwWritten, NULL))
    {
        return S_FALSE;
    }
 
    return S_OK;
}

也就是一般的写文件,再配合seek()等方法,就可以实现在写文件结束前把avi头写到文件的开始处。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
软件介绍: 解压后直接打开主程序WimTool.EXE即可使用,不需要安装。WimTool是一款WIM文件专用的处理工具,它有四部分功能:1.刷新列表:在表中加入其它工具挂载的映像,或移除其它工具卸载的映像,操作无需选项。2.挂载映像:必选项映像文件名、目标目录、映像号,可改写挂载是可选项。3.卸载映像:必选项是挂载的目标目录,无可选项,卸载可写方式挂载的映像时,WimTool会提示。4.解开映像:必选项与1的相同,无可选项。本工具能解开分割包文件,所有的分包文件必须位于同一目录,且名称要与规则匹配,不能挂载或卸载分包文件。新创建和追加功能:1.制作新的映像文件,必选项有要制作Wim映像的源目录和保存映像的文件名,可选项是压缩类型、映卷名称、映卷描述和启动标记。2.向映像中加入新映卷,必选项与第1部分相同,可选项是映卷名称、映卷描述和启动标记。分割和导入功能:1.分割文件,必选项有被分割的Wim文件和分割后保存的文件,没有可选项。2.导入映像,将Wim文件中存在的映像卷导入到另一Wim文件中,必选项有原文件名、原文件中的映像号和目标文件名。没有可选项。  分割Wim文件时,分包文件建议不要用数字作基本名。已分割的Wim文件不支持再被分割,也不支持向分割包文件导入映像卷。删除卷和信息:1、删除映像分卷   从含多个映卷的Wim文件中删除指定映像卷,必选项是Wim文件名和映像卷号,没有可选项。不支持删除分割包中的映像卷。删除Wim文件中的映像卷仅删除元数据及相关条目,并不能减小Wim文件的体积。2、修改映像信息   修改Wim文件中指定的映卷名称、映卷描述或加启动标记,必选项文件名和映像卷号,可选项是映卷名、卷描述和启动标记(叁者须选其一)。每个映像文件中只能有一个具有启动标记的卷。文件关联功能:1、取消文件关联   用于取消WIM映像文件与WimTool的文件关联设置。当系统中的WIM文件关联出现错误或异常时,可以先点[取消文件关联],再点[设置文件关联]来修复。2、设置文件关联   用于设置双击WIM文件时执行的操作,既可设置双击WIM文件按预设的参数来挂载映像文件,也可设置双击WIM文件打开WimTool窗口界面,再通过WimTool对该映像文件进行其它操作。3、保存挂载参数   用于保存双击WIM文件直接挂载映像的各项参数,默认的自动挂载基础目录为本程序下的 MountPath,默认的挂载卷号为1 ,默认的挂载方式为只读方式。保存挂载参数时将连同《文件关联设置》和第一页的〈双击文件卸载映像〉、〈双击路径打开目录〉两个选项一起保存。   不要将基础挂载目录设置在本程序所处的父目录,自动挂载参数有误(如试图挂载一个不存在的映卷)或挂载失败时WimTool会自动启动到图形窗口界面,用户可以在窗口程序中分析挂载失败的原因,也可以对选定映像进行其它操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值