RenderFile一个wmv电影后, 我想去掉视频输出的链路 ,只保留声音的, 应该如何做?

时间:2021-01-26 19:20:21
我的思路是先找到filter 'Video Renderer',再向前遍历, 找到有两个输出pin的后,删除这个有两个输出pin的filter的后一个filter, 从而让视频链路断开, 请问我的实现方法对吗? 有没有更好的方法
下面是我的代码, 用delphi实现的, 却始终出错, 请指点!


var
  prevFilter,currFilter,vRenderFilter: IBaseFilter;
  hr: HRESULT;
begin
    (FilterGraph1 as IGraphbuilder).FindFilterByName('Video Renderer',vRenderFilter);
    if vRenderFilter = nil then exit;

    currFilter := vRenderFilter;
    hr := GetNextFilter(currFilter,PINDIR_INPUT,prevFilter);

    while (prevFilter <> nil) do
    begin
      if getOutputPinCount(prevFilter) = 2 then//如果前一个filter有两个输出pin,就删除当前的,从而断开链路
      begin
        (FilterGraph1 as IGraphBuilder).RemoveFilter(currFilter);
        exit;
      end;
      currFilter := prevFilter;
      prevFilter := nil;

      hr := GetNextFilter(currFilter,PINDIR_INPUT,prevFilter);
    end;
end;

11 个解决方案

#1


报的错是在模块quartz.dll出现地址访问错误

#2


是想不显示video,而只听到声音?
按你说的方法,删掉render filter后要连一个新的例如asfwriter一类的filter

#3


wm asf writer我已经加进去了,  我的目的就是要把电影里的声音存下来,  但视频我不想要,  所以我要断开视频链路

#4


不把VIDEO RENDER  加进去就可以了

#5


要不用DES

#6


to 大刀: 我没想把video Renderer加进去, 我是用的智能连接, 自动加的
  用不着智能连接的

我只是想找出为什么出了刚才的错! 我只想把视频输出的链路删掉啊

#7


那就不要用智能连接了
自己指定就可以了

这个用DES最方便了

#8


不要用智能连接的方式,自己把filter一个一个加到你的graph里。
如果目的只是要保存声音的话,就在audio链路里用wavdest 和filewriter,而video那条路直接render出来就可以了。
你上面的错误可能是你没有给出完整的filter graph,因为总要有个终点

#9


谢谢各位的回复, 怎么说呢, 现在的链路是这个样子
wm asf reader -> wmAudio Decoder Dmo -> wm asf writer
              -> wmVideo Decoder Dmo -> Video Renderer 

我要删除第二行的视频链路,  因为我只要保存声音
当然了我可以自己添加filter, 如下:
wm asf reader -> wmAudio Decoder Dmo -> wm asf writer

但这样将不具备通用性,因为如果是个mpeg文件呢, avi文件呢?  我是不是要为每种格式都准备一套链路? 我不想这么做, 所以我决定用智能连接, 先让directshow自己建好链路,我再手工删除掉视频这一路的就行了

现在的问题是在我删除视频链路这一块出了问题,  我是video Renderer开始删除的,  向前遍历, 直到发现filter有两个输出pin , 不知道我这思路对不对,  反正我的代码有问题, 老报错,  请大家指点

#10


既然要只保存声音,那么干吗要从视频链路动手呢?应该截断音频的render才对呀,要不就用个tee filter,一边播放声音一边存成wav

#11


晕!

怎么不明白呢,  我打开的是个视频文件,  把音频保存下来当然要切断视频链路了

#1


报的错是在模块quartz.dll出现地址访问错误

#2


是想不显示video,而只听到声音?
按你说的方法,删掉render filter后要连一个新的例如asfwriter一类的filter

#3


wm asf writer我已经加进去了,  我的目的就是要把电影里的声音存下来,  但视频我不想要,  所以我要断开视频链路

#4


不把VIDEO RENDER  加进去就可以了

#5


要不用DES

#6


to 大刀: 我没想把video Renderer加进去, 我是用的智能连接, 自动加的
  用不着智能连接的

我只是想找出为什么出了刚才的错! 我只想把视频输出的链路删掉啊

#7


那就不要用智能连接了
自己指定就可以了

这个用DES最方便了

#8


不要用智能连接的方式,自己把filter一个一个加到你的graph里。
如果目的只是要保存声音的话,就在audio链路里用wavdest 和filewriter,而video那条路直接render出来就可以了。
你上面的错误可能是你没有给出完整的filter graph,因为总要有个终点

#9


谢谢各位的回复, 怎么说呢, 现在的链路是这个样子
wm asf reader -> wmAudio Decoder Dmo -> wm asf writer
              -> wmVideo Decoder Dmo -> Video Renderer 

我要删除第二行的视频链路,  因为我只要保存声音
当然了我可以自己添加filter, 如下:
wm asf reader -> wmAudio Decoder Dmo -> wm asf writer

但这样将不具备通用性,因为如果是个mpeg文件呢, avi文件呢?  我是不是要为每种格式都准备一套链路? 我不想这么做, 所以我决定用智能连接, 先让directshow自己建好链路,我再手工删除掉视频这一路的就行了

现在的问题是在我删除视频链路这一块出了问题,  我是video Renderer开始删除的,  向前遍历, 直到发现filter有两个输出pin , 不知道我这思路对不对,  反正我的代码有问题, 老报错,  请大家指点

#10


既然要只保存声音,那么干吗要从视频链路动手呢?应该截断音频的render才对呀,要不就用个tee filter,一边播放声音一边存成wav

#11


晕!

怎么不明白呢,  我打开的是个视频文件,  把音频保存下来当然要切断视频链路了