1. 程式人生 > >基於VLC播放器設計

基於VLC播放器設計

很久沒有更新部落格了,這段時間以來,一是沒有找到合適的主題來和大家分享自己的一些總結,另一方面,隨著在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庫封裝出自己的播放器,然後實現了自己想要的一個簡易播放器。如果有其他問題,可給我留言,歡迎提出批評建議。。。

相關推薦

基於VLC播放設計

很久沒有更新部落格了,這段時間以來,一是沒有找到合適的主題來和大家分享自己的一些總結,另一方面,隨著在CSDN看的大牛文章越多,越發感覺自己的分享的文章水平有限,誠惶誠恐,有點擔心誤人子弟。不過今天,受一大牛指點,大牛說不用擔心,部落格畢竟不像寫書一般嚴謹才能發出來,主要還

基於Qt、FFMpeg的音視訊播放設計二(封裝)

在上一篇中我們實現了視訊的解碼、格式轉換,但其基本是堆出來的程式碼,可複用性以及擴充套件性比較低,現在我們對它進行類的封裝。這裡我們把它分為四個小部分。 1、重構封裝FFMpeg類完成開啟和關閉視訊介面 2、重構讀取視訊幀介面 3、重構解碼介面 4、重構ToRGB介面

基於Qt、FFMpeg的音視訊播放設計四(視訊播放進度控制)

上面介紹瞭如何使用opengl繪製視訊和Qt的介面設計,也比較簡單,現在我們看下如何控制視訊播放及進度的控制,內容主要分為以下幾個部分 1、建立解碼執行緒控制播放速度 2、通過Qt開啟外部視訊 3、視訊總時間顯示和播放的當前時間顯示 4、進度條顯示播放進度、拖動進度條

遠端WEB控制MP3播放設計基於mini2440)

網上有很多 基於mini2440的MP3播放器設計的資料,多是按鍵控制,這裡博主做了些輕微改動,利用遠端WEB來控制MP3播放,具體怎麼實現,下面會給出,大家先看看效果: WEB介面: 後臺執行: 因為不是什麼課程設計報告,博主就不闡述的那麼詳細,這個設計主要有三部分組

如何在VLC播放中顯示毫秒

lua noop files before http name success close player 轉載自 HOW TO SHOW MILLISECONDS IN VLC by HOP HOP https://niumenata.wordpress.com/2017/

cross compile vlc 播放

iar nor most release mbed section 不兼容 .so contain 上一篇文章介紹了如何交叉編譯 FFmpeg ,繼續介紹 VLC播放器 交叉編譯 。 首先下載 vlc 源碼 我用的是 2.2.6 地址 : http://mirror

VLC播放

collect spa 收費 current use 綁定 路徑 argc etop 為了將多個視頻放在一個窗口,最開始想用的是windows media player ,6個視頻,把整個電腦卡得不動了(顯卡太弱,是多輸出口的,沒法換),於是又想把視頻壓縮成一個,網上的大部

Ubuntu安裝VLC播放

tar gin www 播放 wiki org ger sudo after Ubuntu安裝VLC官方介紹:http://www.videolan.org/vlc/download-ubuntu.html sudo apt-get update sudo apt-get

ie 嵌入 vlc 播放外掛播放rtsp直播視訊

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www

基於exoplayer播放的高斯模糊視訊濾鏡

最近專案需求,視訊濾鏡要用高斯模糊。奈何網上全是圖片高斯模糊,且模糊的強度不夠,效果並不是自己需要的。 於是,打算自己寫一個。 exoPlayer播放器自帶濾鏡,所以用這個播放器來做。 濾鏡的話,用到的是OpenGL來寫(不會OpenGL,東拼西湊的) 先看效果吧

基於exoplayer播放的高斯模糊視訊濾鏡,整合aar檔案,給伸手黨

接入步驟如下: 接入步驟 1.aar檔案拷貝至app下libs資料夾內 2.在app下的build.gradle中新增(最外層) repositories { flatDir { dirs 'libs' } } 並且在dependencies

越獄開發: vlc播放新增自定義播放語速(ios)

緣起 如下圖, 預設的全域性倍速從2到4間沒了, 想設個2.5都要每次聽的時候重新設定, 好麻煩. 1.安裝theos 安裝dpkg, ldid, theos brew install dpkg ldid sudo git clone --recur

網頁IE輕鬆呼叫VLC播放實現監控(元件+方法大全)

公司突發奇想,要把剛買回來的網路監控機用自己內部網站線上監控。 作為網站的開發員,我接下了這個任務。 網路上有很多資料參與,但是都不全都不盡人意,最後經過多次的不同關鍵字的查詢和測試,總算讓我成功了。 轉入正題: 一、程式碼 <!DOCTYPE html PUBLIC

VS2008下VLC播放,實現播放、暫停、停止、快進、截圖、進度條顯示、進度條控制功能

可以直接使用的原始碼:http://download.csdn.net/detail/dafenqie/9792806 1、首先建立一個基於對話方塊的應用程式; 2、建立完成後,把VLC的標頭檔案目錄vlc拷貝到工程目錄下,拷貝libvlc.dll、libvlccore.d

一個最簡單的VLC播放的實現—MFC

實現了一個最簡單的播放器功能,能夠進行視訊的播放和暫停。 搭建好了一個基本的“類”框架,只需要在“類”中編寫相應的功能函式就可以繼續開發其他功能。 1.環境配置: 新建一個MyPlayer專案,將VLC打包環境中的Debug、include、

RtspViewer可設定播放地址 基於vlc播放採集rtsp地址視訊演示2.0 測試成功

20170122修改可以 設定播放地址 測試地址:rtsp://111.9.177.194:9090/dss/monitor/param?cameraid=1000063%240&substream=1 測試結果如下       橫屏

Visual Studio 2010下開發VLC播放環境搭建

今天很高興能夠寫一篇文章是關於windos下開發的,我從沒在windos下開發過專案,這次一個專案需要在windos下開發,我只好安裝VS,說實話在windos下開發效率真的偏低,真的不太習慣,安裝軟體

vlc 播放播放進度條的時間不重新整理

有些視訊如(rmvb)視訊在使用vlc播放器播放時會出現進度條不能重新整理的問題, 通過Java層程式碼找到重新整理進度條的介面。是通過public native long getLength()(MediaPlayer Java檔案中);本地函式得到具體要更

MFC 基於VLC的視訊播放(三)---介面設計以及對話方塊接受檔案的拖拽

北京時間23點11分 2018年12月20日 前面已經完成了vlc的環境的搭建,下面便開始真正的程式設計。 前面的介面是這樣的: 理想的介面應該是這樣的: 所以新增按鈕、進度條和播放列表控制元件,並且修改好ID。 介面設計完成,執行,還是隻是一個空殼,因為沒加任

[嵌入式Linux專案實戰開發]基於QT4.7.4的音樂播放實現與設計【2018年給力專案】

[嵌入式Linux專案實戰開發]基於QT4.7.4的音樂播放器實現與設計【2018年給力專案】是【創科之龍】團隊aiku嵌入式視訊教程系列製作的現有的音樂播放器。 主要功能實現: 1.新建工程,基類選擇Qwidget。雙擊開啟介面檔案,在介面檔案中建立label顯示時間、若干個tool