Delphi 一次播放16个视频剪辑,互动表演(如滚石乐队)

Delphi 一次播放16个视频剪辑,互动表演(如滚石乐队),delphi,video,directshow,dspack,Delphi,Video,Directshow,Dspack,最近,我看到了一个非常好的主意,放一个视频剪辑。这是关于“像一块滚石”,我们可以在这里看到: 如您所见,您可以与它交互,使用上/下键更改频道 我下载了所有16个单独的子链接 现在,我们面临的挑战是制作一个程序,一个单独的玩家也要做同样的事情,还要做更多的事情 我试图在另一个论坛上获得一些帮助,但现在我被困在编程阶段 请看这里: 编辑: [链接已删除] 这是Videohelp论坛,主题与此问题相同] 我编写了一个小程序来加载视频并以马赛克的形式显示它们。这是实现“更改频道”功能的第一步。 我在D

最近,我看到了一个非常好的主意,放一个视频剪辑。这是关于“像一块滚石”,我们可以在这里看到:

如您所见,您可以与它交互,使用上/下键更改频道

我下载了所有16个单独的子链接

现在,我们面临的挑战是制作一个程序,一个单独的玩家也要做同样的事情,还要做更多的事情

我试图在另一个论坛上获得一些帮助,但现在我被困在编程阶段

请看这里:

编辑: [链接已删除] 这是Videohelp论坛,主题与此问题相同]

我编写了一个小程序来加载视频并以马赛克的形式显示它们。这是实现“更改频道”功能的第一步。 我在Delphi7中使用DSPack组件,它使用DirectShow和Direct9库

这里,我得到的是:

如图所示,加载了12个视频

我计划关闭所有其他视频的visible属性,当一次看一个视频时,当实现“更改频道”功能时,以减轻系统的负担。但在马赛克布局中,这是不可能的

解决此步骤时,我将使用热键实现“更改频道”功能

问题是我对VideoWindow和FilterGraph的可见和活动属性感到困惑,因此我没有相应地使用它们

以下是迄今为止的代码:

procedure TFormPlayWin.FormActivate(Sender: TObject);
begin
  BigScreen := true;
  SmallScreen := false;
  VideoWindow01.Width := 1425;
  VideoWindow01.Height := 761;

  VideoWindow01.Visible := true;
  VideoWindow02.Visible := false;
  VideoWindow03.Visible := false;
  VideoWindow04.Visible := false;
  VideoWindow05.Visible := false;
  VideoWindow06.Visible := false;
  VideoWindow07.Visible := false;
  VideoWindow08.Visible := false;
  VideoWindow09.Visible := false;
  VideoWindow10.Visible := false;
  VideoWindow11.Visible := false;
  VideoWindow12.Visible := false;

    if not FilterGraph01.Active then FilterGraph01.Active := true;
    if not FilterGraph02.Active then FilterGraph02.Active := true;
    if not FilterGraph03.Active then FilterGraph03.Active := true;
    if not FilterGraph04.Active then FilterGraph04.Active := true;
{
    if not FilterGraph05.Active then FilterGraph05.Active := true;
    if not FilterGraph06.Active then FilterGraph06.Active := true;
    if not FilterGraph07.Active then FilterGraph07.Active := true;
    if not FilterGraph08.Active then FilterGraph08.Active := true;
    if not FilterGraph09.Active then FilterGraph09.Active := true;
    if not FilterGraph10.Active then FilterGraph10.Active := true;
    if not FilterGraph11.Active then FilterGraph11.Active := true;
    if not FilterGraph12.Active then FilterGraph12.Active := true;
}
    FilterGraph01.ClearGraph;
    FilterGraph02.ClearGraph;
    FilterGraph03.ClearGraph;
    FilterGraph04.ClearGraph;
{
    FilterGraph05.ClearGraph;
    FilterGraph06.ClearGraph;
    FilterGraph07.ClearGraph;
    FilterGraph08.ClearGraph;
    FilterGraph09.ClearGraph;
    FilterGraph10.ClearGraph;
    FilterGraph11.ClearGraph;
    FilterGraph12.ClearGraph;
}
    FilterGraph01.RenderFile('D:\Meus documentos\Downloads\Bob Dylan\Joined01.flv');
    FilterGraph02.RenderFile('D:\Meus documentos\Downloads\Bob Dylan\Joined02.flv');
    FilterGraph03.RenderFile('D:\Meus documentos\Downloads\Bob Dylan\Joined03.flv');
    FilterGraph04.RenderFile('D:\Meus documentos\Downloads\Bob Dylan\Joined04.flv');
{
    FilterGraph05.RenderFile('D:\Meus documentos\Downloads\Bob Dylan\Joined05.flv');
    FilterGraph06.RenderFile('D:\Meus documentos\Downloads\Bob Dylan\Joined06.flv');
    FilterGraph07.RenderFile('D:\Meus documentos\Downloads\Bob Dylan\Joined07.flv');
    FilterGraph08.RenderFile('D:\Meus documentos\Downloads\Bob Dylan\Joined08.flv');
    FilterGraph09.RenderFile('D:\Meus documentos\Downloads\Bob Dylan\Joined09.flv');
    FilterGraph10.RenderFile('D:\Meus documentos\Downloads\Bob Dylan\Joined10.flv');
    FilterGraph11.RenderFile('D:\Meus documentos\Downloads\Bob Dylan\Joined11.flv');
    FilterGraph12.RenderFile('D:\Meus documentos\Downloads\Bob Dylan\Joined12.flv');
}
    VideoWindow01.PopupMenu := PopupMenu;
    SoundLevel.Position := FilterGraph01.Volume;

    FilterGraph01.Play;
    FilterGraph02.Play;
    FilterGraph03.Play;
    FilterGraph04.Play;
{
    FilterGraph05.Play;
    FilterGraph06.Play;
    FilterGraph07.Play;
    FilterGraph08.Play;
    FilterGraph09.Play;
    FilterGraph10.Play;
    FilterGraph11.Play;
    FilterGraph12.Play;

      FilterGraph02.Active := false;
      FilterGraph03.Active := false;
      FilterGraph04.Active := false;
      FilterGraph05.Active := false;
      FilterGraph06.Active := false;
      FilterGraph07.Active := false;
      FilterGraph08.Active := false;
      FilterGraph09.Active := false;
      FilterGraph10.Active := false;
      FilterGraph11.Active := false;
      FilterGraph12.Active := false;

      VideoWindow02.Visible := false;
      VideoWindow03.Visible := false;
      VideoWindow04.Visible := false;
      VideoWindow05.Visible := false;
      VideoWindow06.Visible := false;
      VideoWindow07.Visible := false;
      VideoWindow08.Visible := false;
      VideoWindow09.Visible := false;
      VideoWindow10.Visible := false;
      VideoWindow11.Visible := false;
      VideoWindow12.Visible := false;
}
end;
在上面,我试图制作覆盖整个区域的第一个剪辑,并保持其他视频不可见。但是事情越来越糟了,因为我可以看到视窗2、3和4,而不是大视窗1

其想法是使用热键切换大屏幕和小屏幕,以及“切换频道”

为了保持处理和同步,我只想运行一个音轨。如何将其与DirectShow筛选器分离?我只需要播放一个音频。如果我只需要其中一首,运行所有音频曲目是个坏主意。我必须让其他的静音

尽管如此,我有两个问题:

1-如何使上述代码更好地同时处理太多的视频


2-如何将音频曲目从所有其他视频中静音,但第一个保持活动状态。

使用OOP似乎是一项很好的任务。但是,即使没有阵列,也可以轻松完成。。我来告诉你一个主意

说明/功能

同时12个小屏幕(一个带声音) 一个大屏幕,当你想(有可能改变为12再次选择新的渠道)

实施:

1) 加载12个视频并打开屏幕1的声音 2) 更改活动迷你屏幕(更改焦点和活动声音) 3) 带有选定电影的openBigScreen 4) 返回12分钟屏幕

组件:

变量 活动迷你屏幕:t屏幕

minScr01。。。minScr12(与您一样有12个屏幕) bigScr(带有ALLING ALLCIENT的额外屏幕,可见=false或第二种形式) 返回12按钮(bigScr.onDoubleClick或第二种形式的按钮)

你需要4种方法

onFormCreate()

加载所有视频并将其设置为活动状态(启动声音并使其与其他视频不同)

onMinScreenClick() 所有小屏幕共享相同的onMiniScreen1Click方法

ActiveMiniScreen := Tscreen(Sender)
Tscreen(Sender).SoundOn
Tscreen(Sender).BorderColor:= red
onMinDoubleScreenClick()

onBigScreenDoubleClick()(双击或onClick)或表单2中的按钮

BigScreen.visible:=false
BigScreen.soundOff
ActiveMiniScreen.soundOn

如果希望所有视频同步播放-因此在视频之间切换时,它们处于相同位置,请将所有视频加载到单个filtergraph中,并将其连接到单个渲染器,如支持最多16个流的VMR9。通过设置流的z顺序和关联音频渲染器的音量在视频之间切换

这里有一些代码可以帮助你。诀窍是使用捕获图将视频和音频渲染到特定的渲染器,这样可以使用单个视频和多个音频渲染器

注意:我没有提供错误处理,您需要清理分配的资源

  GraphBuilder: IGraphBuilder;
  CaptureGraph: ICaptureGraphBuilder2;
  VMR9: IBaseFilter;
  VMRFilterConfig9: IVMRFilterConfig9;
  VMRWindowlessControl9: IVMRWindowlessControl9;
  vw_position: TRect;
  VMRMixerControl9: IVMRMixerControl9;

  // create the fitler graph
  CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER, IID_IFilterGraph2, GraphBuilder);
  // create the capture graph
  CoCreateInstance(CLSID_CaptureGraphBuilder2, nil, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, CaptureGraph);
  CaptureGraph.SetFiltergraph(IGraphBuilder(GraphBuilder));
  // create add the video renderer filter
  CoCreateInstance(CLSID_VideoMixingRenderer9, nil, CLSCTX_INPROC, IID_IBaseFilter, VMR9);
  GraphBuilder.AddFilter(VMR9, 'Renderer');
  // assign renderer to a TPanel
  VMR9.QueryInterface(IID_IVMRFilterConfig9, VMRFilterConfig9);
  VMRFilterConfig9.SetRenderingMode(VMR9Mode_Windowless);
  VMR9.QueryInterface(IID_IVMRWindowlessControl9, VMRWindowlessControl9);
  vw_position.Left := 0;
  vw_position.Top  := 0;
  vw_position.Right  := Panel.width;
  vw_position.Bottom := Panel.height;
  VMRWindowlessControl9.SetVideoPosition(nil, @vw_position);
  VMRWindowlessControl9.SetVideoClippingWindow(Panel.handle);
  // get mixer control
  VMR9.QueryInterface(IID_IVMRMixerControl9, VMRMixerControl9);
  // to control z-order, alpha etc.. see
  // http://msdn.microsoft.com/en-us/library/windows/desktop/dd390457%28v=vs.85%29.aspx


  // encapsluate the following into a class so you can reuse for each video
  SourceFilter: IBaseFilter;
  AudioRenderer: IBaseFilter;
  // create and file source and render video
  GraphBuilder.AddSourceFilter(stringtoolestr(Filename), stringtoolestr(ExtractFileName(Filename)), FileSource);
  CaptureGraph.RenderStream(nil, nil, FileSource, nil, VMR9 as IBaseFilter);
  // create audio renderer and render audio
  CoCreateInstance(StringToGUID('{79376820-07D0-11CF-A24D-0020AFD79767}'), nil, CLSCTX_INPROC, IID_IBaseFilter, AudioRenderer);
  GraphBuilder.AddFilter(AudioRenderer, 'DirectSound Audio Renderer');
  CaptureGraph.RenderStream(nil, nil, FileSource, nil, AudioRenderer);

1) 你应该避免使用指向第三方网站的外部链接,而是尽可能多地在问题中添加详细信息;2)你可以在问题中嵌入图片,而不是将图片上传到某个地方并链接到它;3)你是否在问两个问题?(覆盖其他人的视频问题,以及静音音轨问题)。尽量把你的问题缩小到具体的问题上,不要有任何不必要的背景/论坛链接。如果你从来没有听说过数组,我认为你在这里获得成功的机会很小。回到基本点。在尝试此操作之前,请先了解数组是什么。@David我刚才正是这么想的,或者是一个对象列表,其中每个对象都类似于单个视频feedPericles所需的所有对象,谢谢您的想法和建议。我想他们会解决我的问题。我稍后会尝试并发布结果。你能更好地解释或提供更多细节吗?如何使用像VMR9这样的渲染器?如何处理z顺序?如果您不关心同步视频,但希望能够在剪辑之间无缝切换,那么使用GMFBridge可能是更好的解决方案。
BigScreen.visible:=false
BigScreen.soundOff
ActiveMiniScreen.soundOn
  GraphBuilder: IGraphBuilder;
  CaptureGraph: ICaptureGraphBuilder2;
  VMR9: IBaseFilter;
  VMRFilterConfig9: IVMRFilterConfig9;
  VMRWindowlessControl9: IVMRWindowlessControl9;
  vw_position: TRect;
  VMRMixerControl9: IVMRMixerControl9;

  // create the fitler graph
  CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER, IID_IFilterGraph2, GraphBuilder);
  // create the capture graph
  CoCreateInstance(CLSID_CaptureGraphBuilder2, nil, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, CaptureGraph);
  CaptureGraph.SetFiltergraph(IGraphBuilder(GraphBuilder));
  // create add the video renderer filter
  CoCreateInstance(CLSID_VideoMixingRenderer9, nil, CLSCTX_INPROC, IID_IBaseFilter, VMR9);
  GraphBuilder.AddFilter(VMR9, 'Renderer');
  // assign renderer to a TPanel
  VMR9.QueryInterface(IID_IVMRFilterConfig9, VMRFilterConfig9);
  VMRFilterConfig9.SetRenderingMode(VMR9Mode_Windowless);
  VMR9.QueryInterface(IID_IVMRWindowlessControl9, VMRWindowlessControl9);
  vw_position.Left := 0;
  vw_position.Top  := 0;
  vw_position.Right  := Panel.width;
  vw_position.Bottom := Panel.height;
  VMRWindowlessControl9.SetVideoPosition(nil, @vw_position);
  VMRWindowlessControl9.SetVideoClippingWindow(Panel.handle);
  // get mixer control
  VMR9.QueryInterface(IID_IVMRMixerControl9, VMRMixerControl9);
  // to control z-order, alpha etc.. see
  // http://msdn.microsoft.com/en-us/library/windows/desktop/dd390457%28v=vs.85%29.aspx


  // encapsluate the following into a class so you can reuse for each video
  SourceFilter: IBaseFilter;
  AudioRenderer: IBaseFilter;
  // create and file source and render video
  GraphBuilder.AddSourceFilter(stringtoolestr(Filename), stringtoolestr(ExtractFileName(Filename)), FileSource);
  CaptureGraph.RenderStream(nil, nil, FileSource, nil, VMR9 as IBaseFilter);
  // create audio renderer and render audio
  CoCreateInstance(StringToGUID('{79376820-07D0-11CF-A24D-0020AFD79767}'), nil, CLSCTX_INPROC, IID_IBaseFilter, AudioRenderer);
  GraphBuilder.AddFilter(AudioRenderer, 'DirectSound Audio Renderer');
  CaptureGraph.RenderStream(nil, nil, FileSource, nil, AudioRenderer);