原文网址:http://blog.csdn.net/openzpc/article/details/48442751

最近在开发一个视频播放软件,主要要求就是循环播放多个视频文件,并且要求两个视频文件切换时,不能有黑屏现象发生。

无论是使用Winform的Mediaplayer控件还是WPF的MediaElement控件,在一个视频播放完毕切换到另一个视频时,都会有一个短暂的黑屏情况,于是我就把目光放在了DirectShow上面。下面说一下如何使用DirectShow进行视频播放。

1.quartz.dll和Tlbimp.exe

使用DirectShow,需要用到C:\Windows\System32文件夹下的quartz.dll文件,但此文件并不能直接在Visual Studio中使用,需要通过Tlbimp.exe(类型库导入程序),将quartz.dll转化为互操作程序集。这里只需要执行以下命令

  1. tlbimp c:\windows\system32\quartz.dll /out:QuartzTypeLib.dll

这个命令并不是直接在cmd中执行,而是在Vs的开发工具中。

执行结果如下

2.相关代码

首先创建FilgraphManager等相关的实例

  1. private const int WM_APP = 0x8000;
  2. private const int WM_GRAPHNOTIFY = WM_APP + 1;
  3. FilgraphManager _filGraphManager = null;
  4. private IBasicVideo _basicVideo = null;
  5. IVideoWindow _videoWindow = null;
  6. IMediaEvent _mediaEvent = null;
  7. IMediaEventEx _mediaEventEx = null;
  8. IMediaPosition _mediaPosition = null;
  9. IMediaControl _mediaControl = null;

加载视频文件

  1. private void LoadVideo(string fileName)
  2. {
  3. _filGraphManager = new FilgraphManager();
  4. _filGraphManager.RenderFile(fileName);
  5. _basicVideo = _filGraphManager as IBasicVideo;
  6. try
  7. {
  8. _videoWindow = _filGraphManager as IVideoWindow;
  9. _videoWindow.Owner = (int) PlVideo.Handle;
  10. _videoWindow.WindowStyle = 0x40000000;
  11. _videoWindow.SetWindowPosition(PlVideo.ClientRectangle.Left, PlVideo.ClientRectangle.Top,
  12. PlVideo.ClientRectangle.Width, PlVideo.ClientRectangle.Height);
  13. }
  14. catch (Exception)
  15. {
  16. throw;
  17. }
  18. _mediaEvent = _filGraphManager as IMediaEvent;
  19. _mediaEventEx = _filGraphManager as IMediaEventEx;
  20. _mediaEventEx.SetNotifyWindow((int) this.Handle, WM_GRAPHNOTIFY, 0);
  21. _mediaPosition = _filGraphManager as IMediaPosition;
  22. _mediaControl = _filGraphManager as IMediaControl;
  23. }

视频播放只需要调用FilgraphManager实例中的Run方法即可

3.类和接口的说明

FilgraphManager 用于建立和控制graph的对象

RenderFile方法用于加载指定文件,Run,Stop,Pause方法对filters进行控制

IBasicVideo 接口  设置video的属性,如宽高,比特率等内容,通过owner属性设置video在哪个控件上显示

IMediaEvent 接口  获取事件通知的接口  IMediaEventEx是前者的扩展

IMediaPosition 接口  用于获取stream中的位置 get_CurrentPosition方法可以获取当前位置,当需要进度条显示视频播放位置时,可以使用此方法

IMediaControl 接口  这个根据名称就可以知道用途

C#使用DirectShow播放视频文件 [转]的更多相关文章

  1. Android 播放视频文件

    package com.example.myvideo2; import java.io.File; import android.app.Activity; import android.net.U ...

  2. .net利用本地播放器播放视频文件代码

    前台点击按钮,执行js事件,跳转到后台代码: function funShowVideo(index) {            var iTop = (window.screen.availHeig ...

  3. ffmpeg和opencv 播放视频文件和显示器

    ffmpeg它是基于最新版本,在官网下载http://ffmpeg.zeranoe.com/builds/.编译时VS2010配置相关头文件及库的路径就可以.opencv的搭建參考上一个博客. 首先简 ...

  4. 用vlc SDK创建一个播放视频文件和RTSP流视频的Demo

    #include <stdio.h> #include <tchar.h> #include <time.h> #include <windows.h> ...

  5. java调用本地播放器播放视频文件。调用本地播放器不能播放指定文件的说明。

    public class OpenExe extends HttpServlet { //打开本地播放器并播放视频 public static void openExe(String file) { ...

  6. 网站上flv,MP4等格式的视频文件播放不出来的解决办法

    在做一个网站时,发现视频文件,比如flv,MP4格式在本地可以正常的播放,但是传到了开发机器上,就不行了.播放器的文件地址是对的,就是一直没有反应. 经过长时间的实验,发现问题在与iis的设置问题.i ...

  7. [Swift通天遁地]八、媒体与动画-(2)实现视频文件的播放和画中画

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  8. android: 播放视频

    播放视频文件其实并不比播放音频文件复杂,主要是使用 VideoView 类来实现的.这个 类将视频的显示和控制集于一身,使得我们仅仅借助它就可以完成一个简易的视频播放器. VideoView 的用法和 ...

  9. 如何扫描出Android系统媒体库中视频文件

    Android系统启动时会去扫描系统文件,并将系统支持的视频文件(mp4,3gp,wmv)扫描到媒体库(MediaStore)中,下面代码演示如何获得这些文件的信息: publicstatic Lis ...

随机推荐

  1. ie6 css 返回顶部图标固定在浏览器右下角

    比较常用记录一下. #e_float{ _position:absolute; _bottom:auto; _right:50%; _margin-right:-536px; _top:express ...

  2. javascript 原生得到document.Element的方法

    今天这里写这个博客的主要目的是记录一下javascript原生的选择dom的集中方法. 1.document.getElementById.这个方法接收1个参数,就是DOM元素的id(区分大小写),这 ...

  3. UESTC 1330 柱爷与远古法阵【高斯消元】

    题目链接[http://acm.uestc.edu.cn/#/problem/show/1330] 题意:有一个长度为L(L <= 300)的长廊,有一人站在最左边,他要到最右边去,他每次可以走 ...

  4. BZOJ4530 BJOI 2014 大融合

    对LCT子树大小进行维护. size表示实子树大小,sz表示虚子树大小. 具体操作是体现在link和splay中,可以看代码. 注意每次做完都要update. By:大奕哥 #include<b ...

  5. AGC026D Histogram Coloring

    link 题意: 给定n列的方块,第i列高度$h_i$.现在要把它染成红蓝两色,要求满足:对于任意一个$2\times 2$的区域,恰有2个蓝色,2个红色.问方案数. $n\leq 100,h_i\l ...

  6. hdu 4790 Just Random

    思路:对于a<=x<=b,c<=y<=d,满足条件的结果为ans=f(b,d)-f(b,c-1)-f(a-1,d)+f(a-1,c-1). 而函数f(a,b)是计算0<= ...

  7. Boost汉字匹配 -- 宽字符

      原文链接:http://blog.csdn.net/sptoor/article/details/4930069 思路:汉字匹配,把字符都转换成宽字符,然后再匹配. 需要用到以下和宽字符有关的类: ...

  8. asp.net mvc4 简单使用Autofac依赖注入小结

    1,首先使用 NuGet下载适当的Autofac版本 文件一,Autofac.3.5.2 文件二,Autofac.Mvc4.3.1.0 1,接口类 public interface IReposito ...

  9. easyui 属性集合

    easyUI属性汇总 属性分为CSS片段和JS片段. CSS类定义:1.div easyui-window 生成一个window窗口样式. 属性如下: 1)modal:是否生成模态窗口.true[是] ...

  10. GitHub官方Markdown语法教程

    说明:Markdown随着编译器不一样,语法也都不一样,但这份GitHub提供的官方教程,基本学会这份就够了. https://guides.github.com/features/mastering ...