




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
vlc播放器架構(gòu)2014播放器簡述vlc播放器架構(gòu)2014播放器簡述1包含內(nèi)容播放器的基本原理介紹sk_media播放器介紹vlc播放器基本架構(gòu)介紹包含內(nèi)容播放器的基本原理介紹2一般情況下,播放一個(gè)音視頻分為4個(gè)步驟:1).
acess訪問2).demux解復(fù)用3).decode解碼4).output輸出一.播放器的基本原理介紹一般情況下,播放一個(gè)音視頻分為4個(gè)步驟:一.播放器的基本原理3可以理解為接收、獲取、得到數(shù)據(jù)資源,包括解析訪問源(url)、使用http協(xié)議(ftp、rtsp協(xié)議......)建立連接、獲取數(shù)據(jù)等。acess:訪問可以理解為接收、獲取、得到數(shù)據(jù)資源,包括解析訪問源(url)4demux:解復(fù)用就是把通常合在一起的音頻和視頻分離(還有可能的字幕),通過分析數(shù)據(jù)包頭來判斷是什么數(shù)據(jù)文件,需要用什么解碼格式。demux:解復(fù)用就是把通常合在一起的音頻和視頻分離(還有5為什么需要demux其實(shí)之所以需要demux,是因?yàn)橐粢曨l在制作的時(shí)候?qū)嶋H上都是獨(dú)立編碼的,得到的是分開的數(shù)據(jù),為了傳輸方便必須要用某種方式合起來,這就有了各種封裝格式,也就有了demux。為什么需要demux其實(shí)之所以需要demux,是因?yàn)橐粢曨l在6decode解碼包括音頻和視頻的解碼,或者軟件解碼和硬件解碼。decode解碼包括音頻和視頻的解碼,或者軟件解碼和硬件解7output輸出分為音頻和視頻的輸出(aout和vout)output輸出分為音頻和視頻的輸出(aout和vout)8access部分負(fù)責(zé)從網(wǎng)絡(luò)接收組播流,放到播放器的內(nèi)存緩沖區(qū)中,access模塊關(guān)注IP協(xié)議,如是否IPv6、組播地址、組播協(xié)議、端口等信息;如果檢測出來是RTP協(xié)議(RTP協(xié)議在UDP頭部簡單得加上了固定12個(gè)字節(jié)的信息),還要分析RTP頭部信息。(對(duì)于VLC播放器,這部分可以參看VLC源碼/modules/access/udp.c)。例如:播放一個(gè)UDP組播的MPEGTS流access部分負(fù)責(zé)從網(wǎng)絡(luò)接收組播流,放到播放9而demux部分首先要解析TS流的信息。TS格式是MPEG2協(xié)議的一部分,一般,TS通常是固定188字節(jié)的一個(gè)packet,一個(gè)TS流可以包含多個(gè)program(節(jié)目),一個(gè)program又可以包含多個(gè)視頻、音頻、和文字信息的ES流;每個(gè)ES流會(huì)有不同的PID標(biāo)示。而又為了可以分析這些ES流,TS有一些固定的PID用來間隔發(fā)送program和es流信息的表格:PAT和PMT表。對(duì)于VLC播放器,使用庫libdvbpsi來解析和編碼TS流.(調(diào)用代碼可以參見VLC源碼/modules/demux/ts.c。)而demux部分首先要解析TS流的信息。TS格式是MPEG210demux分解出來的音頻和視頻流分別送往音頻解碼器和視頻解碼器。因?yàn)樵嫉囊粢曨l都是占用大量空間,而且冗余度較高的數(shù)據(jù),通常在制作的時(shí)候就會(huì)進(jìn)行某種壓縮。這就是我們熟知的音視頻編碼格式,包括MPEG1(VCD)、MPEG2(DVD)、MPEG4、H.264、rmvb等等。音視頻解碼器的作用就是把這些壓縮了的數(shù)據(jù)還原成原始的音視頻數(shù)據(jù)。(VLC解碼MPEG2使用了一個(gè)獨(dú)立的庫libmpeg2,調(diào)用它的源文件是codec/libmpeg2.c。VLC關(guān)于編解碼的模塊都放在/modules/codec目錄下,其中包括著名的龐大的ffmpeg。)vlc播放器架構(gòu)匯總課件11output模塊,視頻解碼器輸出的是一張一張的類似位圖格式的圖像,但是要讓人從屏幕看得到,還需要一個(gè)視頻輸出的模塊。音頻也是一樣,需要將pcm等數(shù)據(jù)轉(zhuǎn)化為聲音output模塊,視頻解碼器輸出的是一張一張的類似位圖格式的12二.sk_media播放器介紹sk_media播放器使用開源軟件vlc_2.1.0(后面介紹)。sk_media播放器的解碼部分,mp3(mpga)格式用軟件解碼,其它格式使用硬件解碼,以便加快解碼速度。sk_media播放器以插件的形式提供接口(sk_media.h)給瀏覽器和應(yīng)用,以達(dá)到平臺(tái)無關(guān)性。sk_media.h是公司提供的統(tǒng)一的播放器對(duì)外接口。二.sk_media播放器介紹sk_media播放器使用開源13
1.sk_media播放器使用流程圖及部分接口
1.sk_media播放器使用流程圖及部分接口
14
152.簡單的sk_media播放器demostaticintmain_media_test(){ intret; sk_media_tskplayer_service_data; char*url=NULL; intres;
sk_media_init(NULL); ret=sk_media_create_player(&skplayer_service_data,NULL); url="93/HEAAC_128K_3sec.mp4"; sk_media_player_set_file(skplayer_service_data,0,2,url,url);
ret=sk_media_player_start(skplayer_service_data,0,1,0);
Sleep(10);sk_media_player_stop(skplayer_service_data);sk_media_destroy_player(skplayer_service_data,NULL);sk_media_term(NULL);}2.簡單的sk_media播放器demostaticint16三.vlc播放器基本架構(gòu)介紹vlc(VideoLanClient)設(shè)計(jì)框架結(jié)構(gòu)。vlc是一個(gè)完整的多媒體框架
(如DirectShow或GStreamer的),最大特點(diǎn)是可以根據(jù)需要?jiǎng)討B(tài)加載許多插件模塊,支持大量的音視頻傳輸、封裝和編碼格式??蚣芎诵木褪怯贸绦?qū)⒏髂K連接起來,對(duì)輸入媒體數(shù)據(jù)經(jīng)過各模塊處理后輸出。三.vlc播放器基本架構(gòu)介紹vlc(VideoLanCl171.VLC源代碼結(jié)構(gòu)1.VLC源代碼結(jié)構(gòu)18
19
2.module功能模塊目錄樹VLC建立在很多獨(dú)立的功能模塊上面的,象很多媒體播放器系統(tǒng)框架一樣,每個(gè)模塊實(shí)現(xiàn)一個(gè)新的功能2.module功能模塊目錄樹20
21
22
233.src模塊目錄介紹LibVLC是VLC的重要部分。它是一個(gè)提供接口的庫,比如給VLC提供功能接口:流的接入,音頻和視頻輸出,插件管理,線程系統(tǒng)。LibVLC源碼位于src/及其子目錄:Interface/:包含與用戶交互的代碼如按鍵和設(shè)備彈出。Playlist/:管理播放列表的交互,如停止、播放、暫停、下一個(gè),或者隨機(jī)播放。Input/:打開一個(gè)輸入組件,讀包,解析它們并且將被還原的基本流傳遞給解碼器。3.src模塊目錄介紹LibVLC是VLC的重要部分。它是一24Video_output/:初始化video顯示器,從解碼器得到所有的圖片和子圖片(如subtitles)。隨意將它們轉(zhuǎn)換為其它格式(如:YUV到RGB)并且播放。Audio_output/:初始化音頻mixer(混合器)。如:發(fā)現(xiàn)正確的播放頻率,然后重新制作從解碼器接收過來的音頻幀。Stream_output/:類似Audio_output。Misc/:被libvlc其它部分使用的雜項(xiàng),如線程系統(tǒng),消息隊(duì)列,CPU探測,對(duì)象查詢系統(tǒng),或者特定平臺(tái)代碼。關(guān)于block_t結(jié)構(gòu)的一些功能也在其中(block.c),包括隊(duì)列的存放、刪除等。(如果做本地緩存可以考慮在block.c里處理)Video_output/:初始化video顯示器,從解碼器254.vlc常用名詞
容器
比較常見的容器格式包括AVI(.avi)、MPEG(.mpg,.mpeg)、QuickTime(.mov)、RealMedia(.rm)、MP4(.mp4)、Matroska(.mkv)、OggMedia(.ogg)等4.vlc常用名詞容器26視頻格式常見的有:MPEG-1/2/4,divx,h.263,H.264/MPEG-4AVC,wmv,mov,視頻格式常見的有:MPEG-1/2/4,divx,h.26327音頻格式MPEG1/2/3,AAC(MPEG4part3),AC3-A/52(DolbyDigital),WMA,FLAC,RealAudio2 ,AMR(3GPP)音頻格式MPEG1/2/3,AAC(MPEG4par28視頻輸出DirectX、X11、XVideo、SDL、FrameBuffer、ASCII視頻輸出DirectX、X11、XVideo、SDL、Fra29UDP/RTPUnicast(單播),UDP/RTPMulticast(組播),TCP/RTPUnicast,DCCP/RTPUnicast,HTTP/FTP,MPEGencoder,Videoacquisition(視頻采集)DVB,F(xiàn)ile訪問輸入訪問輸入30控制界面Gtk、QT4、Web、Telnet、Commandline、Lgui控制界面Gtk、QT4、Web、Telnet、Command31字幕文件內(nèi)字幕,外掛字幕字幕文件內(nèi)字幕,外掛字幕325.數(shù)據(jù)處理流程框架VLC由一個(gè)運(yùn)行核(libvlc)和很多功能模塊組成,很多功能都由模塊提供.在目前vlc設(shè)計(jì)框架的基礎(chǔ)上,將vlc中使用的demux模塊,decoder模塊,out模塊,置換成目前硬件平臺(tái)支持的硬件demux,decoder,out模塊,從而使用硬件解碼。demux,decoder探測部分使用開源的ffmpeg中的庫文件。5.數(shù)據(jù)處理流程框架VLC由一個(gè)運(yùn)行核(libvlc)和很多33vlc播放器的數(shù)據(jù)處理流程框圖
vlc播放器的數(shù)據(jù)處理流程框圖34播放列表playlist對(duì)gui頁面提供統(tǒng)一接口,使用vlc統(tǒng)一接口。播放列表playlist35Access網(wǎng)絡(luò)或本地文件下載,移植vlc支持的網(wǎng)絡(luò)下載協(xié)議。--http、tcp/udp、RTSP/RTPAccess網(wǎng)絡(luò)或本地文件下載,移植vlc支持的網(wǎng)絡(luò)下載協(xié)36demux先按照給出的文件流類型,選擇容器解析和demux解析。若無文件流類型,則使用探測的方式嘗試。解析容器,使用軟件ffmpeg提供的或其他插件提供等。對(duì)于音視頻加擾的流,使用軟件demux解碼器可能會(huì)產(chǎn)生ca解擾問題,考慮使用硬件demux,不在討論范圍內(nèi)。軟件解碼依賴ffmpeg提供庫或其他開放的源代碼解碼器。針對(duì)ts流的格式的文件,vlc使用軟件libdvbpsi開源庫。如果使用硬件demux,對(duì)于decoder模塊,hdi需要提供獨(dú)立操作的接口。demux先按照給出的文件流類型,選擇容器解析和demux解37decoder根據(jù)判斷硬件支持情況,選擇使用軟硬件解碼器,視頻都使用硬件解碼器,有些獨(dú)立的音頻播放可以使用軟件解碼器(mpegaudiolayer1/2/3(mpga))。對(duì)于加擾的視頻需另外增加處理。軟件解碼依賴ffmpeg提供庫或其他開放的源代碼解碼器。如果使用軟件decoder,對(duì)于out輸出模塊,hdi需要提供獨(dú)立的音視頻接口。decoder根據(jù)判斷硬件支持情況,選擇使用軟硬件解碼器,視38output音視頻模塊,提供獨(dú)立的可操作接口output音視頻模塊,提供獨(dú)立的可操作接口39subtitle外掛字幕軟件解析后,直接發(fā)送至輸出接口。subtitle外掛字幕軟件解析后,直接發(fā)送至輸出接口。406.vlc調(diào)用內(nèi)部接口運(yùn)行過程6.vlc調(diào)用內(nèi)部接口運(yùn)行過程41附:直接調(diào)用vlc上api播放音視頻demostaticvoidtest_media_local(constchar**argv,intargc){libvlc_media_t*md1,*md2,*md3,*md4;
libvlc_instance_t*vlc;libvlc_media_t*md;libvlc_media_player_t*mp;
constchar*file0=test_default_sample0;//filevlc=libvlc_new(argc,argv);md=libvlc_media_new_path(vlc,file0);mp=libvlc_media_player_new_from_media(md);libvlc_media_player_play(mp);sleep(100);}附:直接調(diào)用vlc上api播放音視頻demostaticv421.首先程序調(diào)用libvlc_new(lib\core.c)接口,實(shí)現(xiàn)創(chuàng)建一個(gè)VLC運(yùn)行實(shí)例libvlc_instance_t,該實(shí)例在程序運(yùn)行過程中唯一。2.在libvlc_new接口中,調(diào)用了libvlc_InternalInit函數(shù)實(shí)現(xiàn)具體的初始化工作.3.libvlc_InternalInit(\src\libvlc.c)函數(shù)中,首先通過system_Init函數(shù)完成傳入?yún)?shù)對(duì)系統(tǒng)的相關(guān)初始化,接著通過module_InitBank(\src\modules\bank.c)函數(shù)初始化module_bank結(jié)構(gòu)體,并創(chuàng)建了main模塊,然后通過module_InitStatic載入靜態(tài)模塊,通過module_LoadPlugins(\src\modules\bank.c)函數(shù)載入動(dòng)態(tài)模塊.4.調(diào)用libvlc_media_new_path接口,載入播放節(jié)目單.5.在獲取流時(shí),通過調(diào)用stream_UrlNew(src\input\stream.c)函數(shù)完成對(duì)access、demux和path的解析。最后調(diào)用stream_AccessNew(\src\input\stream.c)函數(shù),創(chuàng)建stream_t結(jié)構(gòu)體對(duì)象,并初始化對(duì)象中所有函數(shù)指針;1.首先程序調(diào)用libvlc_new(lib\core.c)436.再調(diào)用stream_Seek(\include\vlc_stream.h)內(nèi)聯(lián)函數(shù),設(shè)置起始位置7.調(diào)用stream_Size(\include\vlc_stream.h)獲得大??;8.調(diào)用stream_Read(\include\vlc_stream.h),讀取到緩沖區(qū);9.libvlc_media_player_play播放通過input_Create創(chuàng)建線程運(yùn)行空間,input_Start中創(chuàng)建線程Run(\src\input\input.c)10.Run線程是整個(gè)VLC作為流媒體服務(wù)器的核心。其主要分為如下幾個(gè)步驟:Init、MainLoop和End。其中MainLoop是一個(gè)無限循環(huán),是完成流媒體的整個(gè)發(fā)布過程:a.首先調(diào)用Init(\src\input\input.c)函數(shù),初始化相關(guān)統(tǒng)計(jì)參數(shù);b.其次再調(diào)用input_EsOutNew(\src\input\es_out.c)函數(shù),初始化es_out_t結(jié)構(gòu)體對(duì)象和es_out_sys_t結(jié)構(gòu)體對(duì)象,并設(shè)置相關(guān)函數(shù)指針;c.再調(diào)用InputSourceInit(\src\input\input.c)函數(shù),初始化input_thread_t對(duì)象中的input_source_t對(duì)象,主要有access_t、stream_t、demux_t三個(gè)結(jié)構(gòu)體對(duì)象;6.再調(diào)用stream_Seek(\include\vlc_44d.再調(diào)用MainLoop(\src\input\input.c)函數(shù),完成讀取、解復(fù)用、解碼、復(fù)用和傳輸;e.MainLoop函數(shù)為無限循環(huán),直到input_thread_t對(duì)象存在b_die、b_error、b_eof時(shí)為止。在該函數(shù)中,存在如下行代碼:i_ret=p_input->input.p_demux->pf_demux(p_input->input.p_demux);它就是流媒體服務(wù)器運(yùn)行的起點(diǎn),所有的后續(xù)操作都會(huì)在該函數(shù)中繼續(xù)衍生。f.pf_demux調(diào)用的是(\modules\demux\ps)中的Demux函數(shù),在該函數(shù)中主要完成如下操作:1).PS流中數(shù)據(jù)包重新同步2).再調(diào)用ps_pkt_read(\modules\demux\ps.c)函數(shù),最終調(diào)用stream_Block函數(shù),這個(gè)函數(shù)內(nèi)部會(huì)根據(jù)實(shí)際情況,調(diào)用stream_t模塊中的pf_read或pf_block函數(shù),函數(shù)結(jié)果會(huì)返回一個(gè)讀取的buffer;3).根據(jù)數(shù)據(jù)包的i_code的值,做不同的處理,對(duì)于音視頻數(shù)據(jù)流,調(diào)用es_out_Send(\include\vlc_es_out.h)函數(shù)處理;d.再調(diào)用MainLoop(\src\input\input454.)es_out_Send一個(gè)抽象層函數(shù),其通過函數(shù)指針,實(shí)際調(diào)用的是EsOutSend(\src\input\es_out.c)函數(shù);5.)EsOutSend函數(shù)最終會(huì)調(diào)用input_DecoderDecode(\src\input\decoder.c)函數(shù);6.)input_DecoderDecode函數(shù)會(huì)將數(shù)據(jù)發(fā)送到音視頻隊(duì)列fifo;7.)DecoderProcess里分別處理音視頻的解碼,硬件解碼也可以在這里將數(shù)據(jù)注入到硬件(hdi)接口中。pf_demux函數(shù)為流媒體所有操作的起點(diǎn),通過該處衍生了很多其他模塊的處理4.)es_out_Send一個(gè)抽象層函數(shù),其通過函數(shù)指針,46VLC運(yùn)行過程在PC上運(yùn)行時(shí),vlc(exe)先被動(dòng)態(tài)加載,然后主線程就變成了接口線程并且在src/interface/interface.c中開始。它執(zhí)行下列步驟:1.cpu探測?2.消息接口初始化;3.命令行選項(xiàng)解析組件4.創(chuàng)建播放列表5.倉庫初始化6.加載所有內(nèi)置和動(dòng)態(tài)組件VLC運(yùn)行過程在PC上運(yùn)行時(shí),vlc(exe)先被動(dòng)態(tài)加載,477.打開接口8.安裝信號(hào)處理器:SIGHUP,SIGINT和SIGQUIT(捕獲一個(gè),忽略后來的并退出)。9.派生音頻輸出線程;10.派生視頻輸出線程;11.主循環(huán):事件管理;7.打開接口48
497.VLC組件結(jié)構(gòu)和加載組件位于modules\子目錄,在運(yùn)行時(shí)被加載。每一個(gè)組件提供不同的特征適應(yīng)特定的文件的環(huán)境。組件中的插件被位于src\misc\modules.c和include\modules*.h中的函數(shù)動(dòng)態(tài)加載和卸載。組件的API描述如下,共3種:(1)組件描述宏:聲明組件具有哪種優(yōu)先級(jí)的能力(接口,demux2等等),還有GUI組件的實(shí)現(xiàn)參數(shù),特定組件的配置變量,快捷方式,子組件等等;(2)Open(vlc_objeet_t*p_object):(3)Close(vlc_objeet_t*p_object):eg:vlc_module_begin()set_shortname("Matroska")set_description(N_("Matroskastreamdemuxer"))set_capability("demux",50)set_callbacks(Open,Close)set_category(CAT_INPUT)set_subcategory(SUBCAT_INPUT_DEMUX)vlc_module_end()7.VLC組件結(jié)構(gòu)和加載組件位于modules\子目錄,在運(yùn)50說明:1.vlc注冊模塊用的是一套標(biāo)準(zhǔn)模板,組件名“Matroska",_("")可以用來創(chuàng)建需要翻譯的字符串,類型"demux"。
set_capability的50參數(shù)表示該插件的優(yōu)先級(jí),越大越可能被使用,如果是0的話就不會(huì)自動(dòng)使用,只能手動(dòng)強(qiáng)制使用。如果VLC需要裝載某一類型的功能模塊(如解碼器),VLC將裝載所有的具有該能力的模塊,按照匹配分?jǐn)?shù)降序排列,然后調(diào)用Open()函數(shù),如果返回VLC_SUCCESS,結(jié)束。
set_callbacks(Open,Close),這個(gè)很關(guān)鍵,其實(shí)是告訴vlc開始播放的時(shí)候調(diào)用Open,結(jié)束播放的時(shí)候調(diào)用Close。2.消息映射宏vlc_module_begin();…..vlc_module_end();3.配置分類包括:CAT_INTERFACECAT_AUDIOCAT_VIDEOCAT_INPUTCAT_SOUTCAT_ADVANCEDCAT_PLAYLIST說明:51同時(shí),也可以使用某一個(gè)子類進(jìn)行配置。所有的配置分類和子類的定義,參考include/vlc_config_cat.hinclude/vlc_configuration.h(2)staticintOpen(vlc_object_t*);VLC運(yùn)行核嘗試打開模塊的時(shí)候,將調(diào)用該函數(shù),進(jìn)行模塊裝載。在Open函數(shù)里面,設(shè)置各種結(jié)構(gòu),設(shè)備或I/O??梢哉4蜷_的函數(shù)將返回VLC_SUCCESS。否則,將認(rèn)為裝載失敗。Open函數(shù)里面還進(jìn)行私有數(shù)據(jù)的分配(如有),對(duì)私有結(jié)構(gòu)進(jìn)行設(shè)置。如果打開失敗,需要用戶自己清理結(jié)構(gòu)里面的資源。被VLC調(diào)用初始化這個(gè)組件,它被組件描述宏賦值給了結(jié)構(gòu)體module_t中的pf_activate函數(shù)指針,被Module_Need調(diào)用;Open里面主要的工作就是設(shè)置另外幾個(gè)回調(diào)函數(shù)以及綁定上面定義的私有數(shù)據(jù)結(jié)構(gòu),設(shè)置回調(diào)函數(shù)(如control)、綁定私有數(shù)據(jù)等:p_demux->pf_demux=Demux;p_demux->pf_control=Control;同時(shí),也可以使用某一個(gè)子類進(jìn)行配置。所有的配置分類和子類的定52(3)staticintClose(vlc_object_t*)
VLC運(yùn)行核嘗試關(guān)閉或卸載模塊的時(shí)候,調(diào)用Close函數(shù)。
在關(guān)閉函數(shù)里面,將清理一些數(shù)據(jù)結(jié)構(gòu),I/O或設(shè)備。同時(shí),關(guān)閉函數(shù)也釋放一些私有數(shù)據(jù)。
Close比較簡單,主要工作是釋放自己的私有數(shù)據(jù)被VLC調(diào)用負(fù)初始化這個(gè)組件,保證消耗Open分配的所有資源。它被組件描述宏賦值給了結(jié)構(gòu)體module_t中的pf_deactivate函數(shù)指針,被Module_Unneed調(diào)用。(4)用LibVLC寫的組件能夠直接被編譯進(jìn)VLC,因?yàn)橛械腛S不支持動(dòng)態(tài)加載代碼。被靜態(tài)編譯進(jìn)VLC的組件叫做內(nèi)置組件。(3)staticintClose(vlc_obj53(5)模塊類型根據(jù)模塊的能力的類別不同,需要實(shí)現(xiàn)的函數(shù)或方法也不一樣,用戶可以在相應(yīng)的模塊分類里面找到更多的信息。下面是一些主要的模塊類別清單:Access/獲取Demux/解復(fù)Access_Demux/獲取并解復(fù)Decoder/解碼Interface/用戶界面Videofilter/視頻濾波Audiofilter/音頻濾波Audiooutput/語音輸出(5)模塊類型548.vlc組建倉庫功能函數(shù)在啟動(dòng)的時(shí)候,VLC創(chuàng)建一個(gè)包含所有插件接口(.so和內(nèi)置插件)的倉庫,每一個(gè)插件都會(huì)被檢查其實(shí)現(xiàn)的功能(見vlc_modules.h)管理這些插件的API如下:Module_InitBank:創(chuàng)建組件倉庫,然后調(diào)用module_LoadMain將主程序信息導(dǎo)入組件銀行。Module_LoadMain:將主程序信息導(dǎo)入組件倉庫。Module_LoadBulltins:加載所有內(nèi)置組件。Module_Loadplugins:加載所有動(dòng)態(tài)組件。8.vlc組建倉庫功能函數(shù)在啟動(dòng)的時(shí)候,VLC創(chuàng)建一個(gè)包含所55Module_EndBank:清空組件倉庫。Module_ReSetBank:通過卸載所有無用的動(dòng)態(tài)(插件)組件,重置組件倉庫。Module_EndBank:卸載所有動(dòng)態(tài)(插件)組件,清空模倉庫。Module_Need:得到能力最符合要求的組件。Module_Unneed:減少一個(gè)組件的引用計(jì)數(shù),必須被Module_Need的同一個(gè)線程調(diào)用。Module_EndBank:清空組件倉庫。569.數(shù)據(jù)訪問模塊(access)access數(shù)據(jù)訪問的輸入和輸出函數(shù)實(shí)現(xiàn)VLC大部分的基本IO功能。這些通常是一些協(xié)議如(http,ftp,...)或一些設(shè)備訪問如網(wǎng)絡(luò)攝像頭,圖像采集卡。set_capability("access",60)
set_category(CAT_INPUT)set_subcategory(SUBCAT_INPUT_ACCESS)結(jié)構(gòu)定義:ssize_t(*pf_read)(access_t*,uint8_t*,size_t);block_t*(*pf_block)(access_t*);int(*pf_seek)(access_t*,uint64_t);int(*pf_control)(access_t*,inti_query,va_listargs);9.數(shù)據(jù)訪問模塊(access)access數(shù)據(jù)訪問的輸入和57如果采用的協(xié)議返回未知大小的數(shù)據(jù)塊,Block類型比較合適。如果能夠控制給采用的協(xié)議的數(shù)據(jù)大小,Read類型比較合適.實(shí)現(xiàn)的函數(shù)除了實(shí)現(xiàn)Open()和Close()函數(shù)以外,還需要實(shí)現(xiàn)幾個(gè)主要的數(shù)據(jù)訪問類模塊的函數(shù)。在include/vlc_access.h定義了下面幾個(gè)函數(shù):Seek,pf_seek指針指向的函數(shù)。Control,pf_control指針指向的函數(shù)。如果采用的協(xié)議返回未知大小的數(shù)據(jù)塊,Block類型比較合適。58Seek原型:int(*pf_seek)(access_t*,uint64_t);數(shù)據(jù)位置定位函數(shù)可以根據(jù)請求隨時(shí)調(diào)用。該函數(shù)的參數(shù)為模塊指針和請求的位置。注意:如果制定的協(xié)議或設(shè)備不支持?jǐn)?shù)據(jù)位置定位功能,該可以為空。如果函數(shù)正常工作,需要將p_access->info.b_eof設(shè)置為false.返回值:如果函數(shù)運(yùn)行成功,返回VLC_SUCCESS,否則,返回VLC_EGENERIC.Seek59Control原型:int(*pf_control)(access_t*,inti_query,va_listargs);控制函數(shù)非常簡單,運(yùn)行核將使用下面的參數(shù)對(duì)模塊進(jìn)行查詢:指向模塊結(jié)構(gòu)的指針。i_query參數(shù)可以有幾種類型,args,根據(jù)i_query的類型,通過列表輸入一些子參數(shù)。返回值:如果運(yùn)行成功,返回VLC_SUCCESS.否則,返回VLC_EGENERIC.控制查詢類型下面的標(biāo)記必須設(shè)置為true.ACCESS_CAN_SEEK,ACCESS_CAN_FASTSEEK,ACCESS_CAN_PAUSE,ACCESS_CAN_CONTROL_PACE,ACCESS_GET_PTS_DELAYControl60Read
原型:ssize_t(*pf_read)(access_t*,uint8_t*,size_t);返回值:
如果還沒有數(shù)據(jù),返回-1;如果數(shù)據(jù)已經(jīng)讀取完畢,返回0;否則,返回實(shí)際讀取到的數(shù)據(jù)大小。Block原型:block_t*(*pf_block)(access_t*);
返回原始大小的數(shù)據(jù)塊,如果沒有數(shù)據(jù)或到數(shù)據(jù)末尾,將返回NULL。沒有數(shù)據(jù)和已經(jīng)到達(dá)數(shù)據(jù)末尾的區(qū)別是,在到達(dá)數(shù)據(jù)末尾的時(shí)候,p_access->info.b_eof應(yīng)該為true.Read61VLC線程分析VLC線程分析62vlc線程管理VLC是一個(gè)密集的多線程應(yīng)用。由于解碼器必須預(yù)先清空,播放工序也必須預(yù)先做好流程(比如說解碼器和輸出必須被分開使用,否則無法保證在要求的時(shí)間里播放文件),因此VLC不采用單線程方法。目前不支持單線程的客戶端,多線程的解碼器通常就意味著更多的開銷(各線程共享內(nèi)存的問題等),進(jìn)程間的通信也會(huì)比較復(fù)雜。vlc線程管理VLC是一個(gè)密集的多線程應(yīng)用。由于解碼器必須預(yù)63VLC的線程結(jié)構(gòu)基于pthreads線程模型。為了可移植的目的,沒有直接使用pthreads函數(shù),而是做了一系列類似的包裹函數(shù):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的線程結(jié)構(gòu)基于pthreads線程模型。為了可移植的目64vlc_cond_signal,vlc_cond_broadcast,vlc_cond_wait,vlc_cond_destroy和類似結(jié)構(gòu):vlc_thread_t,vlc_mutex_t,andvlc_cond_t。vlc_con
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 買羊購銷合同范本
- 味多美工作合同范例
- 升降平臺(tái)加工合同范本
- 廚房雜件采購合同范本
- 咨政課題申報(bào)書范文
- 吊扇購銷合同范例
- 凈菜供貨合同范例
- 北京買房還是租房合同范例
- 品牌對(duì)接推廣合同范本
- 中電投合同范本
- 安徽2025年安徽醫(yī)科大學(xué)第一附屬醫(yī)院臨床醫(yī)技護(hù)理管理崗位招聘156人筆試歷年參考題庫附帶答案詳解
- 旅游景區(qū)股份合作開發(fā)協(xié)議書范本
- 2025年湖南有色金屬職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫匯編
- 2025年湖南信息職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫參考答案
- 學(xué)情分析方案及學(xué)情分析報(bào)告范文
- 《CRISPR-Cas9及基因技術(shù)》課件
- 《急性冠狀動(dòng)脈綜合征》課件
- 【博觀研究院】2025年跨境進(jìn)口保健品市場分析報(bào)告
- 游戲直播平臺(tái)推廣合作協(xié)議
- 《高科技服裝與面料》課件
- 《馬克思生平故事》課件
評(píng)論
0/150
提交評(píng)論