vlc內部運行機制以及架構分析

VLC架構剖析1. VideoLan簡介1.1 videolan組成Videolan有以下兩部分組成:VLC:一個最主要的部分,它可以播放各種類型的媒體文件和流

vlc架構剖析

1. VideoLan簡介

1.1 videolan組成

Videolan有以下兩部分組成:

VLC:一個最主要的部分,它可以播放各種類型的媒體文件和流媒體文件,并且可以創造媒體
流并保存成各種格式的媒體文件,這些文件的質量要比沒保存前的件好。videolan作為客戶
端可以播放本地文件,httP://,rtsp://。

VLS:是一種流服務器,專門用來解決流的各種問題,它也具有一些VLC的特征。videolan作
為服務器可以輸出httP,rtP,rtsp的流。

1.2 VLC優點

VLC是一種跨平臺的媒體播放器和流媒體服務器,最初為videolan的客戶端,它是一種
非常簡便的多媒體播放器,它可以用來播放各種各樣的音視頻的格式文件(MPEG-1、MPEG-
2、MPEG- 4、DivX、WMV、mp3、OGG、Vorbis、AC3、AAC等等)流媒體協議,最具特色的
功能是可以邊下載邊觀看Divx媒體文件,并可以播放不完全的AVI文件。并且支持界面的
更改。VLC支持多種的操作系統,linux(rh9,Debian,Mandrake,Gentoo),BSD,windows,
Mac OS X,Be OS,Solaris等等。支持帶菜單的VCD,SVCD,和DVD,數字衛星頻道、數字
地球電視頻道(digital terrestrial television channels),在這些操作系統下通過寬帶IPv4、IPv6
網絡播放線上影片。此軟件開發項目是由法國學生所發起的,參與者來自于世界各地,設計
了多平臺的支持,可以用于播放網絡流媒體及本機多媒體文件,特別是它能直接播放未下載
完整的多媒體文件。

下圖表示出了VideoLan的解決方案:


VideoLan Client是VideoLan項目(一個完整的MPEG-2客戶/服務器解決方案)的一個組成
部分。不過VideoLan Client也可以作為一個獨立的程序來播放來自硬盤或者DVDROM的
MPEG數據流。它目前支持GTK+、GNOME、KDE和QT,并且可以使用X11、Xvideo、SDL
或者DirectX作為視頻輸出。對于聲音,VideoLan Client支持OSS、ALSA和ESD。要訪問DVD,
VideoLan Client使用的是Libdvdcss庫。它是一個簡單的專為DVD訪問設計的庫。它可以像
訪問塊設備一樣訪問DVD,而不用考慮解密問題。

2. VLC整體架構分析

2.1 LibVLC

LibVLC是VLC的核心部分。它是一個提供接口的庫,比如給VLC提供些功能接口:流的
接入,音頻和視頻輸出,插件管理,線程系統。所有的LibVLC源碼位于src\及其子目錄:

Interface/:包含與用戶交互的代碼如按鍵和設備彈出。

Playlist/:管理播放列表的交互,如停止,播放,下一個,或者隨機播放。

Input/:打開一個輸入組件,讀包,解析它們并且將被還原的基本流傳遞給解器。

Video_output/:初始化video顯示器,從解碼器得到所有的圖片和子圖片(如subtitles)。隨意
將它們轉換為其它格式(如:YUV到RGB)并且播放。

Audio_output/:初始化音頻mixer(混合器)。如:發現正確的播放頻率,然后重新制作從解碼器
接收過來的音頻幀。

Stream_output/:類似Audio_output。

Misc/:被libvlc其它部分使用的雜項,如線程系統,消息隊列,CPU探測,對象查詢系統,
或者特定平臺代碼。


2.2 VLC

VLC是一個純粹圍繞著LibVLC寫成的程序。它是非常小的,但是功能很齊全的媒體播放
器,歸功于LibVLC的動態組件支持。

2.3 組件

?組件位于modules\子目錄,在運行時被加載。每一個組件提供不同的特征適應特定的
文件的環境。另外,大量的不斷編寫的可移植功能位于audio_output\,vidco_output\和
interface\組件,以支持新的平臺(如:BeoS Mae OS X)。

組件中的插件被位于src\misc\modules.c和include\modules*.h中的函數動態加載和卸
載。寫組件的API描述如下,共3種:

(l)組件描述宏:聲明組件具有哪種優先級的能力(接口,demux2等等),還有GUI組件的
實現參數,特定組件的配置變量,快捷方式,子組件等等;

(2)Open(vlc_objeet_t*p_object):被VLC調用初始化這個組件,它被組件描述宏賦值給了
結構體module_t中的pf_activate函數指針,被Module_Need調用;

(3)Close(vlc_objeet_t*p_object):被VLC調用負初始化這個組件,保證消耗Open分配的所
有資源。它被組件描述宏賦值給了結構體module_t中的pf_deactivate函數指針,被
Module_Unneed調用。

用LibVLC寫的組件能夠直接被編譯進VLC,因為有的OS不支持動態加載代碼。被靜態
編譯進VLC的組件叫做內置組件。

2.4 線程分析

(l)線程管理:

VLC是一個密集的多線程應用。由于解碼器必須預先清空和播放工序必須預先做好流程
(比如說解碼器和輸出必須被分開使用,否則無法保證在要求的時間里播放文件),因此VLC
不采用單線程方法。目前不支持單線程的客戶端,多線程的解碼器通常就意味著更多的開銷
(各線程共享內存的問題等),進程間的通信也會比較復雜。

VLC的線程結構基于pthreads線程模型。為了可移植的目的,沒有直接使用pthreads
函數,而是做了一系列類似的包裹函數:vlc_thread_create,vlc_thread_exit,vlc_thread_join,
vlc_mutex_init,vlc_mutex_lock,vlc_mutex_unlock,vlc_mutex_destroy,vlc_cond_init,
vlc_cond_signal,vlc_cond_broadcast,vlc_cond_wait,vlc_cond_destroy和類似結
構:vlc_thread_t,vlc_mutex_t,and vlc_cond_t。

(2)線程同步:

VLC的另一個關鍵特征就是解碼和播放是異步的:解碼由一個解碼器線程工作,播放由音
頻輸出線程或者視頻輸出線程工作。這個設計的主要目的是不會阻塞任何解碼器線程,能夠
及時播放正確的音頻幀或者視頻幀。這樣實現也導致產生了在接口,輸入,解碼器和輸出之
間的一個復雜的通訊結構。

雖然當前接口并不允許,但是讓若干個輸入和視頻輸出線程在同一時刻讀取多個文件是
可行的(這是VLC未來改進的主要方向)。現在的客戶端就是用這種思想實現的,這就意味著
如果沒有用到全局鎖的話那么一個不能重入的庫是不能被使用的(尤其是liba52庫)。

VLC輸出的流里包含時間戳,被傳遞給解碼器,所有有時間戳標記的流也均被記錄,這


樣輸出層可以正確及時的播放這些流。時間mtime_t是一個有符號的64-bit整形變量,單位
是百萬分之一秒,是從1970年7月1日以來的絕對時間。

當前時間能夠被mdate()函數恢復。一個線程可以被阻塞到mwait(mtime_t date)等到一
個確定的時間才被執行。也可以用msleep(mtime_t delay)休眠一段時間。如果有重要的事情
要處理的話,那么應該在正常時間到來之前被喚醒(如色度變換)。例如在
modules\codec\mpeg_vldeo\synchro.c中,通常的解碼時間被記錄,保證圖像被即時解碼。

3. VLC接口技術分析

3.1 VLC運行過程

通過對相關資料和自己的分析,VLC的運行過程如下:

ELF(Linux下可執行文件的格式)先被動態加載,然后主線程就變成了接口線程并且在
src/interface/interface.c中開始。它執行下列步驟:

1.cpu探測:什么型號?所有能力(MMX,MMXEXT,3DNow,AltiVec等等)

2.消息接口初始化;

3.命令行選項解析組件

4.創建播放列表

5.倉庫初始化

6.加載所有內置和動態組件

7.打開接口

8.安裝信號處理器:SIGHUP,SIGINT和SIGQUIT(捕獲一個,忽略后來的并退出)。

9.派生音頻輸出線程;

10.派生視頻輸出線程;

11.主循環:事件管理;

下圖表示了這些步驟的執行過程:

VLC的運行過程圖

地址?http://www.yanfaw.com/technology/201105/10/197.html
3.2 消息接口

由于printf()函數不是線程安全的,因此在調用printf()函數時一個線程的執行將會受到
干擾,當這個線程被另一個函數所調用時就會其狀態被破壞而退出程序。所以VLC構造了自
己的線程安全的消息接口。

VLC的線程安全的消息接口有兩種實現方式:如果在config.h里定義了INTF_MSG_QUEUE
的話,每一個類似printf()的函數將會把排隊的消息放到鏈表里,這個鏈表將會在事件循環
中被線程接口用紅色標記的方式打印出來。如果INTF_MSG_QUEUE沒被定義的話,調用線
程將會獲得一個print lock(用來防止在同一時刻有兩個printf操作被執行)同時直接打印出消
息(默認操作)。

以下為VLC線程安全消息的API:

QueueMsg:添加一條消息到消息隊列,如果消息隊列滿了,先打印所有的消息;

FlushMsg:打印所有在消息隊列里的消息,特別的,消息隊列必須被提前加鎖,因為該
函數不檢查鎖。

PrintMsg:打印一條消息到stderr,可以打印彩色消息。

3.3 命令行選項

?VLC用GNU的getopt解析命令行選項。Getopt結構定義在src\extras\getopt.h里。所有
的配置也可以用環境變量改變:調用函數main_Put*Variable和main_Get*Variable。所
以,.\vlc--height=240和 .\vic_height=240./vlc(這種方式用于所有地方,包括插件)是一樣的。
但是為了線程安全的考慮,當第二個線程派生了,main_Put*Variable便不能被使用了。

未完,具體參考地址?http://www.yanfaw.com/technology/201105/10/197.html


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454481.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454481.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454481.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

visio中公式太小_visio繪圖中的數據計算

在繪流程圖時,我們有時候會想直接在流程圖上做計算,比如化工設計時精餾塔計算理論塔板數。在VISIO中,實現這個功能還是比較容易,舉一個最簡單的例子。如下圖所示,等號后面的數字可以根據前面的數字變化。實現過程如下&…

Django syncdb mysql error on localhost - (1045, Access denied for user 'ODBC'@'

環境:WINDOWS系統 將數據庫配置 DATABASES { default: { ENGINE: django.db.backends.mysql, HOST: localhost, PORT: 3306, NAME: yunwei, USERNAME: root, PASSWORD: mysql, } } 改為 DATABASES { default: { ENGINE: django.db.backends.mysql, HOST: localhos…

銀行招計算機專業算什么崗,銀行計算機專業崗位全方位分析

黑龍江銀行招聘信息陸續發布,中公教育專家為各位考生提供:銀行計算機專業崗位全方位分析!供大家參考,預祝大家取得好成績,更多黑龍江人民銀行招聘相關資料請關注黑龍江銀行招聘網。金融銀行部門一直是一個朝陽產業&…

【47.92%】【hdu 5763】Another Meaning

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1440 Accepted Submission(s): 690 Problem DescriptionAs is known to all, in many cases, a word has two meanings. Such as “hehe”, which not only mea…

root用戶登錄mysql后新建用戶提示1045錯誤

執行以下命令查看root權限 show grants for rootlocalhost; 如果沒有顯示with grant option,說明是root沒有擁有新建授權用戶的權限(為什么會這樣呢,因為我把userroot and hostlocalhost給刪掉了,然后重新授權all privileges給新建root用戶&a…

Flask werkzeug 源碼解析

Flask werkzeug流程大概:執行run_simple ,實際執行為先用make_server 創建一個 BaseServer 實例,然后執行 實例的serve_forever 方法, serve_forever 調用 run_simple 傳入的第三個參數,執行(self, environ, start_response) &am…

AVS 幀內預測模式的匯編優化

王瑞*基金項目:本課題得到國家自然科學基金資助項目基金(項目編號:60772101)的資助。作者簡介:王瑞(1986—), 男, 山東萊蕪人, 碩士, 主要從事視頻壓縮方面的研究. E-mai…

ltsc系統激活_WIN10_X64企業版LTSC 電腦公司裝機版 202008

文件: WIN10_X64_LTSC_ZJ202008.esd大小: 7431429353 字節(6.92G)MD5: A3A3B15ED47216E177C924D2E07E0799SHA1: 3A647265E0C8234225C633407093BAA07253FB34CRC32: 32E791E9(注意,下載文件有一定幾率損壞,如文件值不對請重新下載!)360安全云盤…

大學計算機應用基礎考試題庫,大學計算機應用基礎考試題庫

綜合模擬(四)一、選擇題。1、完整的計算機硬件系統一般包括外部設備和 C 。A、運算器的控制器 B、存儲器 C、主機 D、中央處理器2、計算機能夠自動工作,主要是因為采用了 D 。A、二進制數制 B、高速電子元件 C、存儲程序控制 D、程序設計語言3、下面哪能一組是系統軟…

Lombok 使用小結

Lombok 使用小結 Lombok 簡介Lombok 安裝Lombok 使用 API示例示例源碼引用和引申Lombok 簡介 Lombok 是一種 Java 實用工具,可用來幫助開發人員消除 Java 的冗長,尤其是對于簡單的 Java 對象(POJO)。它通過注釋實現這一目的。通過…

html表單input file,input標簽type=file的文件上傳

一,通過表單提交的方式該提交方式只是提交普通表單;對于file組所選中的文件內容是不上傳的,因此需要設置:enctype屬性enctype"multipart/form-data"如果想上傳多文件,可添加multiple二,通過Ajax異…

AVS游程解碼、反掃描、反量化和反變換優化設計

中圖分類號:TN919.81   文獻標識碼:A   文章編號:1009-2552 (2007) 02-0054-04AVS游程解碼、反掃描、反量化和反變換優化設計趙 策, 劉佩林(上海交通大學電子工程系, 上海200240)摘 要: 提出了一種適用于AVS的游程解碼、反掃描、反量化和反變換硬件結構優化設計方案。根據…

Django REST framework介紹

現在前后端分離的架構設計越來越流行,業界甚至出現了API優先的趨勢。 顯然API開發已經成為后端程序員的必備技能了,那作為Python程序員特別是把Django作為自己主要的開發框架的程序員,Django REST framework(DRF)這個…

zabbix 安裝_安裝zabbix

準備一個純凈環境10.0.0.99首先修改yum源,修改為zabbix清華源,清華源玉zabbix官方源都是同步的,下載速度更快!zabbix官方Download Zabbix?www.zabbix.com點擊下載,下面有zabbix的歷史版本以及官方安裝文檔可以查看到不…

拓展歐幾里得 [Noi2002]Savage

對于一個野人,他(她?)所在的位置,(C[i]x*p[i])%ans,是的,暴力枚舉每一個ans,用拓展歐幾里得求出每兩個wildpeople(wildrage?)相遇的年份,如果小于最小的壽限…

CCNP-19 IS-IS試驗2(BSCI)

CCNP-19 IS-IS試驗2 實驗拓撲:試驗要求:R1 R2 R3全部采用集成的ISIS路由協議,R1 R2在區域49.0001內,R3在區域49.0002內,R1與R2之間的鏈路類型為L1,R2與R3之間的鏈路類型為L2。 試驗目的:掌握基…

正道的光用計算機,正道的光作文500字

當那熟悉的轟天巨雷般的呼嚕聲響起,我就知道,這又是睡不著的一天。同樣在宿舍;同樣是小翟;同樣的時間;同樣在我昏昏欲睡的時候,那個熟悉的呼嚕聲,它又來了。它將我從即將到來的美夢中驚醒了&…

AVS高清立體視頻編碼器

一、成果項目背景 電視技術在經歷了從黑白到彩色、從模擬到數字的技術變革之后正在醞釀另一場技術革命,從單純觀看二維場景的平面電視跨越到展現三維場景的立體電視。立體電視,又稱三維電視(3DTV),提供了更為豐富的視覺信息和更具臨場感的觀…

RESTful介紹

RESTful介紹 REST與技術無關,代表的是一種軟件架構風格,REST是Representational State Transfer的簡稱,中文翻譯為“表征狀態轉移”或“表現層狀態轉化”。阮一峰 理解RESTful架構 RESTful API設計指南 阮一峰 RESTful設計指南 API與用戶…

dijkstra算法代碼_數據科學家需要知道的5種圖算法(附代碼)

在本文中,我將討論一些你應該知道的最重要的圖算法,以及如何使用Python實現它們。作者:AI公園導讀因為圖分析是數據科學家的未來。作為數據科學家,我們對pandas、SQL或任何其他關系數據庫非常熟悉。我們習慣于將用戶的屬性以列的形…