基于VLC播放器设计

来源:互联网 发布:陈奕迅 好唱 知乎 编辑:程序博客网 时间:2024/05/20 00:52

很久没有更新博客了,这段时间以来,一是没有找到合适的主题来和大家分享自己的一些总结,另一方面,随着在CSDN看的大牛文章越多,越发感觉自己的分享的文章水平有限,诚惶诚恐,有点担心误人子弟。不过今天,受一大牛指点,大牛说不用担心,博客毕竟不像写书一般严谨才能发出来,主要还是要多自己总结,因此才重新提笔开始续写。

今天主要讲一下自己前段时间的做的一个播放器,为什么要做这个播放器呢?主要是笔者发现现在市面上的大多数播放器只有播放的功能,而我自己则想做一个能边看电影边聊天的播放器,这样假设你和朋友想同时在线看一部电影,你们可以从服务器上接收到视频流同步进行观看,此外,你们还可以在观看的同时,对感兴趣或者精彩的部分及时进行点评、聊天等,这样更能拉近彼此之间的距离,让大家一起享受到观看视频的乐趣。

要做这么一个视频播放器,需要解决哪些问题呢?首先是视频流从媒体服务器上同步进行推送的功能,这个功能中涉及流媒体传输协议、流媒体同步机制、网络自适应传输等技术,这个部分的问题下次我再整理放上来;接下来就是实现聊天的功能,我这部分网上已经有很多的网络聊天方面的资料,由于涉及的聊天包括视频、文字和图片,这个功能我涉及的东西比较多,因此也下次整理放上来;最后则是要实现视频播放的功能,为了模拟这个功能,自己首先做了一个本地的视频播放软件,应用开源库VLC,封装后实现了对各类视频的简单播放。接下来开始详细讲解这个软件的开发过程。

1、采用MFC设计软件界面,这个过程对于有些MFC基础的人来说,应该基本上不是特别大的问题,如果确实基础还不够的话,建议参考孙鑫老师的《VC++深入详解》(修订版)一书,整本书稍厚,关于设计到本软件界面设计一块的可重点参考第6、7、8、9章。我自己做出的界面效果如下


从上图可以看出,我这里设计了“个人面板”、“视频聊天”、“影视播放”三大模块,个人面板模块无非就是对个人用户登录、密码隐藏、视频大小、码率大小、聊天记录存储位置等进行设置,在此不细说。接下来是视频聊天这个模块,这个模块的功能则是开启左下方目前暂时被一张摄像头取代位置处的视频,当没有开启这个功能时,该处是一个摄像头,当开启这一功能时,则显示的是双方的视频画面,如QQ视频聊天一样。最后影视播放模块,则是今天的重点,也就是将本地视频加载、播放、调节、关闭的过程。

2、为什么采用VLC?在做这个软件之前,自己在目前市面上的很多视频编解码开源库里面做了个调研,包括ffmpeg、ffmplay、VLC等,发现很多公司都用到了ffmpeg开源库,包括暴风、迅雷等,这个通过查看他们的安装目录下,都可以或多或少看到avutil,avcodec的影子,但是ffmpeg封装性不够好,很多接口函数的调用如果不是专业人士则不能直接使用,就算懂了各个接口的含义,也要担心有没有调用一些内存释放接口将相关内存释放掉,以免引起内存泄露(这是4月份左右做这个软件的想法,现在ffmpeg熟悉了也就不是问题了)。而VLC则可以解决这个问题,因为它封装较好,而且适合更多的视频格式,因此对于要做一个简单播放器的人来说,是非常不错的选择。

3、接下来就是怎么将VLC插件加入到我的工程中,并调用VLC实现视频的播放了。

首先,需要到安装VLC,可以到VLC官网上下载http://www.videolan.org/安装包,或者到http://download.videolan.org/pub/videolan/vlc/下载源码,在linux底下编译好库后使用,本人当时直接安装了VLC 2.1.3,安装后目录所示如下


然后,在你自己写的MFC工程下面,将VLC中sdk目录下的include和lib目录拷贝至工程目录,在创建的工程属性C/C++常规里设置包含的目录为../include,连接器/常规里设置附加库目录为../lib,将VLC解压后的plugins目录拷贝至工作的Debug目录。

接下来,自己重新根据需要的功能,封装一下VLC的播放类,如下所示

<span style="font-size:14px;">class CAVPlayer{public:    CAVPlayer(void);    ~CAVPlayer(void);    void Init();                            // 初始化    void Release();                         // 清理内存    bool Play(const std::string &strPath);  // 播放路径为strPath的文件    void Play ();                           // 播放    void Stop ();                           // 停止    void Pause();                           // 暂停    void Volume(int nVol);                  // 音量设置为nVol    void VolumeIncrease();                  // 音量增大    void VolumeReduce();                    // 音量减小int  GetVolume();// 获取当前音量    void SeekTo(int nPos);                  // 跳到指定位置nPos    void SeekForward();                     // 快进    void SeekBackward();                    // 快退    void SetHWND(HWND hwnd);    HWND GetHWND();    void SetCallback(pfnPosChanged pfn);    pfnPosChanged GetCallback();    BOOL    IsPlaying();        // 文件是否正在播放    int     GetPos();           // 获取文件当前播放的位置    __int64 GetTime();          // 获取时间__int64 GetVedioLength();   // 获取视频长度private:    libvlc_instance_t       *m_pVLC_Inst;    libvlc_media_player_t   *m_pVLC_Player;       HWND            m_hWnd;    pfnPosChanged   m_pfn;      // 文件位置改变时的回调函数};</span>
最后,实现以上的成员函数,如开始播放

<span style="font-size:14px;">bool CAVPlayer::Play(const std::string &strPath){    if (! m_pVLC_Inst)    {        Init();    }    if(strPath.empty() || ! m_pVLC_Inst)    {        return false;    }    Stop();    libvlc_media_t *m;    m = libvlc_media_new_path(m_pVLC_Inst, strPath.c_str());        m_pVLC_Player = libvlc_media_player_new_from_media(m);            libvlc_media_release(m);                                      libvlc_media_player_set_hwnd(m_pVLC_Player, m_hWnd);    libvlc_media_player_play(m_pVLC_Player);                        // 事件管理    libvlc_event_manager_t *vlc_evt_man = libvlc_media_player_event_manager(m_pVLC_Player);    libvlc_event_attach(vlc_evt_man, libvlc_MediaPlayerEndReached, ::OnVLC_EndReached, this);    libvlc_event_attach(vlc_evt_man, libvlc_MediaPlayerPositionChanged, ::OnVLC_PositionChanged, this);    return true;}</span>
停止播放

<span style="font-size:14px;">void CAVPlayer::Stop(){    if (m_pVLC_Player)    {        libvlc_media_player_stop (m_pVLC_Player);             libvlc_media_player_release (m_pVLC_Player);           m_pVLC_Player = NULL;    }}</span>
暂停

<span style="font-size:14px;">void CAVPlayer::Pause(){    libvlc_media_player_pause(m_pVLC_Player);}</span>
重新播放

<span style="font-size:14px;">void CAVPlayer::Play(){    libvlc_media_player_play(m_pVLC_Player);}</span>
以上实现的工程文档结构如下图



4、在MFC中主要按钮后添加相关的消息处理函数(MFC内容,本文略),根据以上主要流程设计好播放器后,运行软件,测试播放状态如下图



以上则主要是自己在4月份左右做的一个简易的播放器,主要的思路即应用VLC库封装出自己的播放器,然后实现了自己想要的一个简易播放器。如果有其他问题,可给我留言,欢迎提出批评建议。。。

0 0
原创粉丝点击