第二个题目是我的播放器,可以播放音频和视频。其实略懂计算机多媒体技术的人都清楚,音频和视频的差异具体是体现在文件格式上的。不同的音频mp3,midi,wav等其实是不同的编码或者格式,同理不同的视频avi,rm(rmvb),mov等其实也是不同的编码格式,这些格式中,大多数都是不公开源代码的,但是公开标准或者API接口。但编程调用依然很繁琐,我们也没有精力和能力去研究这些。
.Net本身不带多媒体库,但是具有与COM交互的强大能力。恰好,微软DirectShow技术能满足上述要求,而且可以跟.NET达到完美的结合。
DirectShow交互程序集是集成在DirectX中的,多数计算机都会有DirectX,微软也提供下载。废话少说,开始做吧。
第一,在项目中引用Interop.QuartzTypeLib.dll。这是DirectX的COM交互程序集,其实是个托管调用。其中的类库和方法介绍最好还是看DirectX的SDK。这里不班门弄斧了。
第二,播放打开的文件
public void RenderMedia(string mediaFileName)
        {
            clearUp();
            try
            {
                objMedia = new FilgraphManager();
                objMedia.RenderFile(mediaFileName);
                volMedia = objMedia as IBasicAudio;
                posMedia = objMedia as IMediaPosition;
                ctlMedia = objMedia as IMediaControl;
                eexMedia = objMedia as IMediaEventEx;
                eexMedia.SetNotifyWindow((int)this.Handle, WM_GRAPHNOTIFY, 0);
                mediaStatus = 1;
                mediaDuration = posMedia.Duration;
                volMedia.Volume = mediaVolum;
                Play();
            }
            catch
            {
                MessageBox.Show("加载文件失败!");
                clearUp();
            }
        }
其中ClearUp用于释放资源
private void clearUp()
        {
            if (ctlMedia != null)
                ctlMedia.Stop();
mediaStatus = 1;
mediaDuration = 0;
            mediaCurPos = 0;
if (eexMedia != null)
                eexMedia.SetNotifyWindow(0, 0, 0);
if (ctlMedia != null) ctlMedia = null;
            if (volMedia != null) volMedia = null;
            if (posMedia != null) posMedia = null;
            if (eexMedia != null) eexMedia = null;
            if (objMedia != null) objMedia = null;
        }
基本功能调用代码比较简单
/// <summary>
        /// 播放
        /// </summary>
        public void Play()
        {
            ctlMedia.Run();
            mediaStatus = 3;
        }
        /// <summary>
        /// 暂停
        /// </summary>
        public void Pause()
        {
            ctlMedia.Pause();
            mediaStatus = 2;
        }
        /// <summary>
        /// 停止
        /// </summary>
        public void Stop()
        {
            ctlMedia.Stop();
            posMedia.CurrentPosition = 0;
            mediaStatus = 1;
        }
        /// <summary>
        /// 搜索
        /// </summary>
        /// <param name="posTar">秒</param>
        public void Seek(int posTar)
        {
            posMedia.CurrentPosition = posTar;
        }
有一点必须注意,播放过程中的窗体消息处理,需要重写WndProc方法。

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_GRAPHNOTIFY)
            {
                int lEventCode;
                int lParam1, lParam2;
while (true)
                {
                    try
                    {
                        eexMedia.GetEvent(out lEventCode, out lParam1, out lParam2, 0);
eexMedia.FreeEventParams(lEventCode, lParam1, lParam2);
if (lEventCode == EC_COMPLETE)
                        {
                            ctlMedia.Stop();
                            posMedia.CurrentPosition = 0;
                            mediaStatus = 1;
                        }
                    }
                    catch (Exception)
                    {
                        break;
                    }
                }
            }
base.WndProc(ref m);
        }
主要代码就这些了。播放器的界面制作纯属个人爱好,这里不说了,很希望能有做windows应用程序界面高手能指点一番。
这里的程序有个缺点是播放窗口是新弹出的DirectShow窗口,一时还没有搞懂是怎么回事。
顺便说一下,DirectShow可不止能读取媒体文件,还能编辑或者创建,wonderful!
后来借鉴有人使用了MediaPlayer控件做的播放器,也蛮有趣的,制作简单了很多,但是受MediaPlayer限制太多,仅作为后备方法吧。
另外媒体播放当然不止DirectShow这一种方式,希望多提宝贵建议。现在我正在用它播放《东成西就》,RMVB格式。

本文转自 王杰瑞 51CTO博客,原文链接:http://blog.51cto.com/wangjierui/55940,如需转载请自行联系原作者

我的媒体播放器——多媒体编程相关推荐

  1. vb毕业设计——基于vb+VB.NET的媒体播放器设计与实现(毕业论文+程序源码)——媒体播放器

    基于vb+VB.NET的媒体播放器设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于vb+VB.NET的媒体播放器设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦. 文章目录: 基于 ...

  2. upnp 播放器 android,基于Android系统的UPNP媒体播放器的研究与实现

    摘要: 近几年来,"数字家庭网络"的发展备受人们的关注,如何通过有线或无线的方式将多个网络设备及家庭设备互联互通,最终实现设备之间自动发现.智能互联.相互控制.资源共享等操作,是目 ...

  3. VLC媒体播放器Web插件详细说明

    原文地址:https://wiki.videolan.org/Documentation:WebPlugin/ 简介:使用视频构建网页 该VLC媒体播放器 webplugins是原生浏览器插件,类似于 ...

  4. 基于QT平台的手持媒体播放器项目实战视频教程下载

    分享一套关于在QT平台的手持媒体播放器项目实战的视频教程,Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架. 它既可以开发GUI程式,也可用于开发非GUI程式,比如控制台工 ...

  5. java制作媒体播放器_用Java构造自己的媒体播放器

    一.概述 首先我们来看看构造这个媒体播放器要达到什么样的目标,确定了目标也就确定了代码量和程序的复杂程度.本文的媒体播放器要达到如下目标: 媒体播放器是一个菜单驱动的简单AWT应用. 媒体播放器包含一 ...

  6. java实战——简单的媒体播放器

    这个是用jmf来做的,但是由于jmf对视频资源支持的问题所以能用的类型没有那么多,它支持的格式有下面这些. · D indicates the format can be decoded and pr ...

  7. 设计模式综合-媒体播放器的实现

    1. 媒体播放器的实现 (1)案例背景: Windows Media Player 和 RealPlayer 是两种常用的媒体播放器,它们的 API 结构和调用方法存在差别,现在你的应用程序需要支持这 ...

  8. QT_媒体播放器播放Mp3QMediaPlayer

    QT_媒体播放器播放Mp3QMediaPlayer QMediaPlaylist Qt对音视频的播放和控制.相机拍摄.收音机等多媒体应用提供了强大的支持.Qt5使用了全新的Qt Multimedia模 ...

  9. VLC媒体播放器系统结构

    http://blog.csdn.net/buffi/article/details/7174421 VLC媒体播放器系统结构 VLC是免费和 开源跨平台多媒体播放器,一个可以播放大部分多媒体格式如D ...

最新文章

  1. Ruby on rails
  2. 【DBMS 数据库管理系统】数据仓库 数据组织 ( 数据组织级别 | 元数据 | 粒度 | 分割 | 数据组织形式 )
  3. “365算法每日学计划”:01打卡
  4. 2018蓝桥杯模拟赛·青出于蓝而胜于蓝 DFS序+树状数组
  5. python 发送邮件的两种方式【终极篇】
  6. python变量和常量_python变量与常量内容:
  7. 数据库系统工程师考c语言吗,2019年数据库系统工程师考点:DBMS的基本功能
  8. SpringBoot学习笔记(8):事物处理
  9. nginx请求如何映射url
  10. Delphi之TStrings和TStringLists类[转]
  11. dbcc checkdb 200g 要多久_东丽区无人驾驶学多久,放心省心_石家庄北方汽修学校
  12. 在Abaqus中怎么施加初始应力
  13. 计算机组成原理第五版第四章课后答案,计算机组成原理第四章课后习题及答案_唐朔飞(完整版).docx...
  14. python中if in是什么意思_python中的in是什么意思
  15. 做绿色数据中心基础设施建维服务认证有哪些好处?
  16. 5V输入升压14.4V四串磷酸铁锂电池充电芯片板 ,12.8V-32号电路板
  17. 基于PythonGUI的原神圣遗物游戏装备管理与角色数值模拟系统
  18. Dev-C++如何单步调试程序--8min学会自己找程序错误
  19. Conditional Positional Encodings for Vision Transformers(论文阅读笔记)
  20. ipad2越狱完成!

热门文章

  1. 【luogu】P1772物流运输(最短路+DP)
  2. @media实现网页自适应中的几个关键分辨率
  3. JavaScript错误和异常
  4. Windows7查看无线网络密码
  5. caffe学习日记--lesson3:win8系统,VS2013下的caffe工程编译探究
  6. HTML中的图像和链接
  7. WordPress学习笔记(二)插件安装
  8. python处理音频的库_Python中音频处理库pydub的使用教程
  9. 黑群晖 linux 修改参数,黑群晖 DS918+ 修改引导参数隐藏引导盘和数据盘
  10. linux中求当前时间gettime,linux – 你如何在shell中获得clock_gettime(2)时钟?