以前看過VLC的代碼,學習過VLC相關的知識,現將其記下來以作備忘
注:本記錄是以VLC2.0作爲參考,如有出入,請先覈對版本號
一、簡介
VLC多媒體播放器(最初命名爲VideoLAN客戶端)是VideoLAN計劃的多媒體播放器。它支持衆多音頻與視頻解碼器及文件格式,並支持DVD影音光盤,VCD影音光盤及各類流式協議。它也能作爲unicast或 multicast的流式服務器在IPv4或 IPv6的高速網絡連接下使用。它融合了FFmpeg項目的解碼器與libdvdcss程序庫,使其有播放多媒
體文件及加密DVD影碟的功能。
二、特性
簡單、快速、強大的媒體播放器。
可播放任何介質:文件、光盤、攝像頭、設備及流媒體。
可播放大多數格式,而無需安裝編解碼器包,其內已經包含MPEG-2, DivX, H.264, MKV, WebM, WMV, MP3… 等諸多library。
可在所有平臺運行: Windows, Linux, Mac OS X, Unix…
完全免費,無間諜軟件,無廣告,無跟蹤用戶的行爲。
可對媒體進行轉換與串流。
詳細Features見:
http://www.videolan.org/vlc/features.html
三、架構
3.1 整體框架
libVLCcore: libvlc的核心,抽象出了一個libvlc_instance_t 對象。modules的裝載/
卸載機制。還有一套多媒體相關的操作接口。如:input, multiplexing,
demultiplexing, audio output, video output.Modules: modules提供了具體的功能。根據編譯配置module數量200-400之間。
根據功能可分類爲:輸入輸出(文件、網絡、cd)、編解碼(mp3,h254)、
模塊化的GUI(基於qt、mac)External libraries: 開源軟件都秉承着不要重複造輪子的思想。所以vlc本身也依賴了大
量外部開源庫,如知名的ffmpeg、qt、live555等。VLC main: player的main。初始化libVLC並加載用戶界面,注意vlc的用戶界面也是
以module的形式存在。基於libvlc我們就能自己開發自己的播放器了。
3.2 分層框架結構
3.3 modules 按照功能大致分類
3.4 源代碼目錄結構
3.5 模塊關係
這裏主要是關於模塊的關係,控制接口以及線程再整個框架中的分佈情況(即哪些地方使用到了線程)
上圖標有紅色圓圈的模塊就表示其中有使用到線程
3.6 抽象結構
以下,是我按照對VLC的理解抽象出的VLC的結構圖
上圖中,每一個虛線框起來的,都可以認定爲是一個較大的模組(由多個模塊組成)
四、運行流程
ELF (Linux下可執行文件的格式) 先被動態加載,然後主線程就變成了接口線程並且在src/interface/interface.c中開始。它執行下列步驟:
- cpu探測:什麼型號?所有能力(MMX,MMXEXT,3DNow,AltiVec等等)
- 消息接口初始化;
- 命令行選項解析組件
- 創建播放列表
- 倉庫初始化
- 加載所有內置和動態組件
- 打開接口
- 安裝信號處理器:SIGHUP,SIGINT和SIGQUIT(捕獲一個,忽略後來的並退出)。
- 派生音頻輸出線程;
- 派生視頻輸出線程;
- 主循環:事件管理;
下圖爲具體的流程圖