gstreamer教程及在DM3730上的应用
感謝原文作者:goalie高義http://blog.csdn.net/goalietech/article/details/24887955
1 Gstreamer基本概念
GStreamer 是一個開源的多媒體用的框架,采用了基于插件(plugin)和管道(pipeline)的體系結(jié)構(gòu),框架中的所有的功能模塊都被實現(xiàn)成可以插拔的組件, 并且在需要的時候能夠很方便地安裝到任意一個管道上,由于所有插件都通過管道機(jī)制進(jìn)行統(tǒng)一的數(shù)據(jù)交換,因此很容易利用已有的各種插件“組裝”出一個功能完善的多媒體應(yīng)用程序。
2Gstreamer基本組成
Gstreamer組成有四個基本單位,它們分別為元件(element)、襯墊(Pads)、箱柜(Bins)、管道(pipelines)。
A:元件(element):元件是Gstreamer中最重要的概念,它是組成整個gstreamer應(yīng)用程序的基本單位,可以將多個相關(guān)功能的元件鏈接到一起組成一個管道,這樣就可以實現(xiàn)一個簡單的多媒體軟件了。常見的元件有音頻編解碼、視頻編解碼、文件讀取、網(wǎng)絡(luò)傳輸?shù)取?/p>
B:襯墊(Pads):用于元件之間的鏈接,可以理解為元件的插座或端口,襯墊分為兩種類型:src為輸出,sink為輸入。一個元件可以既有src又有sink襯墊,也可以多個src或sink襯墊。例如:音頻編碼元件的輸入或輸出端、音頻播放元件的輸入端都屬于襯墊。
C: 箱柜(Bins)、管道(pipelines):箱柜是一個可以裝載元件的容器,將多個元件鏈接起來放入箱柜中實現(xiàn)一個高級功能的單元。例如:將音頻解碼元件和音頻輸出元件鏈接起來可以組成一個音頻解碼播放模塊裝載到箱柜中。管道是最高等級的箱柜,是由多個元件或箱柜組成的一個完整的功能單元。例如:一個音視頻文件的播放通道。
如下圖所示,一個簡單的ogg格式的播放器用gstreamer的方式去實現(xiàn),就是將各相關(guān)功能的元件通過襯墊連接到一起組成一個管道,這樣就可以實現(xiàn)一個基本的ogg播放器了。
簡單的ogg播放器Gstreamer實現(xiàn)
3 Gstreamer應(yīng)用及實現(xiàn)功能
Gstreamer功能框架圖
GStreamer核心庫函數(shù)是一個處理插件、數(shù)據(jù)流和媒體操作的框架,gstremer的插件機(jī)制是其核心,所有的元件的都是以插件的形式綁定在管道中用來實現(xiàn)媒體處理的功能的。Gstreamer目前包含的插件已經(jīng)超過了250個,包含音視頻的各種方式輸入輸出、編解碼、存儲、網(wǎng)絡(luò)傳輸、傳輸協(xié)議、音視頻編輯、格式轉(zhuǎn)換等方面的插件。
4 ?基于gstreamer框架的軟件及功能
l????????Rhythmbox是一個綜合的音樂管理軟件,屬于建筑于網(wǎng)絡(luò)之上的播放器。可以直接下載歌曲,支持網(wǎng)絡(luò)電臺和播客。
Rhythmbox
l????????Sound juicer是一種在Linux及其它Unix-Like等操作系統(tǒng)平臺上可將CD音軌轉(zhuǎn)檔的軟件,能透過GStreamer的插件來進(jìn)行各種音效編碼。可轉(zhuǎn)換包括mp3、Ogg、FLAC、及PCM等不同格式。
Sound juicer
l????????Monkey?Bubble?是一個很有趣又很酷的GNOME下的一個游戲軟件,它通過GStreamer播放音樂產(chǎn)生驚悚的或甜美的音響效果。??
Monkey?Bubble
l????????AviSynth是一個功能強(qiáng)大的視頻文件后期處理工具,提供了許多編輯和處理視頻文件的方法。能夠提供各種方式來合并和濾鏡處理影像文件。最獨(dú)特的就是AviSynth并不是一個孤立的影像處理程序,而是在影像文件和應(yīng)用程序之間擔(dān)任“中間人”的角色。
AviSynth
l????????Thoggen?是一個高效的?DVD?備份軟件,它基于GStreamer,擁有一個漂亮的?GTK+?界面,功能強(qiáng)大且容易使用。
l????????GNOME?Media?是用GStreamer?來進(jìn)行聲音控制、音頻錄制和CD播放。?
?
5 DM3730平臺及環(huán)境搭建
DM3730是TI公司生產(chǎn)一款A(yù)RM+DSP雙核的處理器,該處理器集成了高達(dá) 1GHz的ARM Cortex?-A8內(nèi)核及高達(dá)800MHz的具有高級數(shù)字信號處理的DSP核,并提供了豐富的外設(shè)接口。主要應(yīng)用于便攜式數(shù)據(jù)終端、導(dǎo)航、自動化資訊娛樂、醫(yī)療設(shè)備、工業(yè)控制等產(chǎn)品中。
搭建DVSDK開發(fā)環(huán)境
DVSDK(DaVinci Software Development Kit)是TI公司為了方便用戶開發(fā)和測試而提供的一系列的工具包。開發(fā)者可以利用DVSDK提供的工具測試DM3730的軟硬件性能,能夠評估ARM Linux的開發(fā)環(huán)境并且體驗到硬件多媒體編解碼的性能。
1、首先下載一個DM3730對應(yīng)的DVSDK安裝包,我們這里下載的是DVSDK4.03的版本。
2、DVSDK安裝推薦使用Ubuntu 10.04的版本,然后安裝DVSDK到ubuntu系統(tǒng)。
3、修改根目錄下的Rules.make文件,主要是修改對應(yīng)的平臺、內(nèi)核、編譯工具鏈等選項。
4、執(zhí)行根目錄下的setup.sh腳本,主要是安裝tftp工具,創(chuàng)建文件系統(tǒng)目錄、配置串口和uboot環(huán)境參數(shù)。
5、執(zhí)行make clean、make all和 make install進(jìn)行完全編譯。make help 可參看make幫助信息。
6、編譯成功后就會生成目標(biāo)文件系統(tǒng)targetfs,在targetfs/usr/share/ti文件夾里面會有調(diào)試軟硬的各種工具。
CMEM和DSPLink
?????? DM3730為ARM+DSP雙核機(jī)制的CPU,所以ARM和DSP之間的通信就顯得尤為重要。CMEM和DSPLink對于DM3730來說是倆個非常重要的驅(qū)動,它們的主要功能就是為了實現(xiàn)ARM和DSP之間的通信和數(shù)據(jù)交換。
CMEM:主要用于分配大片連續(xù)共享內(nèi)存和數(shù)據(jù)交互。
DSPLink:雙核通信的基礎(chǔ)軟件,為開發(fā)人員提供通用的API,用于ARM 與DSP之間通信。
內(nèi)存分配
?????? 由于ARM和DSP共享內(nèi)存,為了避免內(nèi)存使用混亂,需要重新分配內(nèi)存的使用范圍,下圖是DM3730的內(nèi)存分配情況:
DM3730內(nèi)存分配
從上圖可以看到Linux的內(nèi)存被分配成了2個部分0x80000000-0x83700000,0x88000000-0xA0000000。所以uboot的啟動參數(shù)bootargs應(yīng)該傳遞給linux內(nèi)核內(nèi)存的分配情況(mem=55M@0x80000000 mem=384M@0x88000000)。
系統(tǒng)啟動后需要安裝cmemk.ko和dsplinkk.ko。
[plain]?view plaincopy
6 移植Gstreamer
DVSDK中的文件系統(tǒng)已經(jīng)做好了對gstreamer的支持,當(dāng)你編譯完dvsdk后,make install會將文件系統(tǒng)生成到Rules.make文件中EXEC_DIR變量所對應(yīng)的目錄里。然后你會在文件系統(tǒng)的usr/lib/gstreamer-0.10/看到gstreamer的庫文件。該版本的gstreamer使用過程中可能會出現(xiàn)庫的版本名稱不對或則丟失軟連接等問題,這些問題需要大家重命名或則手動創(chuàng)建軟連接即可解決。
?
7 ? media-ctl移植
media-ctl是一個通過調(diào)用linux系統(tǒng)的MediaController API來實現(xiàn)對多媒體設(shè)備(DM3730默認(rèn)為/dev/media0)進(jìn)行控制的指令,是一個開源的工具。它可以枚舉出系統(tǒng)各多媒體設(shè)備實體及實體的襯墊(pads),并可以將不同實體的襯墊連接到一起組成一個通道,從而控制視頻在前端采集時的流向。
由上圖可以看到,視頻采集過來的原始數(shù)據(jù)最終到達(dá)DM3730的ARM核,也就是可以被我們的程序得到是有很多條路徑可以選擇的。
Sensor->CCDC->Memory- (C)
Sensor->CCDC->Preview->Memory- (1), (4)
Sensor->CCDC->Preview->Resizer->Memory- (1), (2), (3)
此處參考網(wǎng)頁《CM-T3730: Linux: Camera》
通過media-ctl –help可以看到該工具的使用方法,media-ctl –p可以列出各實體的參數(shù)和襯墊及連接狀態(tài)。如下所示:
[plain]?view plaincopy
從上面列表從可以看到entity17對應(yīng)ov5640也就是視頻輸入源,輸出可以選擇OMAP3 ISP CCDC,我們要建立一個ov5640--> ISP CCDC-->memory的通道實現(xiàn)視頻采集功能,通過幫助我知道應(yīng)該使用media-ctl –l來實現(xiàn)通道連接功能。
可以直接使用entity和pad的數(shù)字來進(jìn)行連接,這樣上述通道可以表示為:
[plain]?view plaincopy
“:”前面的數(shù)字代表entity的值,后面的數(shù)字為該entity的pad值,“[]”里面的數(shù)字代表狀態(tài)0為不激活,1為激活。
但是還是建議使用名稱來進(jìn)行連接,這樣更加直觀一些,如下:
[plain]?view plaincopy
除此之外還要對各pad的分辨率進(jìn)行配置,使用media-ctl -v --set-format指令,這里ov5640默認(rèn)使用640x480的分辨率,設(shè)置如下:
[plain]?view plaincopy
這樣可以看到ISP CCDC的輸出節(jié)點(diǎn)為/dev/video2,以后程序就可以使用該節(jié)點(diǎn)獲取視頻數(shù)據(jù)和控制了。
如果你使用的TVP5150這樣AD芯片,其實實現(xiàn)方式也是相同的,只是名字和分辨率換換而已,如下所示:
[plain]?view plaincopy
另外。Media-ctl有好多版本,費(fèi)很大勁才找到適合DM3730使用的,但還是有一個小bug,現(xiàn)在將我修改后使用的media-ctl源碼上傳上來了,需要的話可以去下載。當(dāng)然如果通過MediaController API自己編程實現(xiàn)上述功能也是可以的。
調(diào)試過程中發(fā)現(xiàn)一個問題,文件系統(tǒng)存放在SD啟動時會生成/dev/media0設(shè)備,但是燒寫到NandFlash之后/dev/media0沒有了。后來發(fā)現(xiàn)原來是mdev的問題,于是將mdev替換為udev后,問題就解決了,時間太長了具體原因忘記了,知道的朋友幫忙留一下言吧。
?Media-ctl.tar.gz
8 ?DM3730音視頻gstreamer處理流程
DVSDK軟件包中提供了gstreamer的代碼并集成了針對于DM3730芯片的插件TI GStreamer Plugin,如下圖所示:
DM3730軟件系統(tǒng)框架圖
上圖綠色部分為TI基于gstreamer框架實現(xiàn)的插件,里面包含了基于DM3730的DSP音視頻編解碼算法、視頻顯示、DMA控制等插件。
我們想做一個類似于IPcamera的測試功能,通過采集音視頻并編碼打包,然后通過網(wǎng)絡(luò)傳輸出去,通過客戶端可以接收到數(shù)據(jù)并分別解包后顯示出來。具體實現(xiàn)方式將用到gstreamer內(nèi)部提供的元件和TI提供的視頻編碼的插件。
DM3730音視頻處理的具體功能框圖如下圖所示:
?元件功能介紹:
l????????v4l2src:從video4linux2設(shè)備(ov5640、tvp5150)中讀取視頻幀。支持rgb、yuv、jpeg、dv、mpegts等常見視頻格式。
l????????alsasrc:通過ALSA接口聲卡設(shè)備中讀取音頻數(shù)據(jù),支持8、16、24、32位的音頻數(shù)據(jù)。
l????????ffmpegcolorspace:將視頻數(shù)據(jù)從一種顏色空間轉(zhuǎn)換成另一種。
l????????audioconvert:音頻格式轉(zhuǎn)換。
l????????TIVidenc1:TI提供的視頻編碼器插件。
l????????alawenc:A率音頻編碼器。
l????????mpegtsmux:混合多媒體到MPEG2-TS傳輸流(一種傳輸和存儲包含音效、圖像與通信協(xié)議各種數(shù)據(jù)的標(biāo)準(zhǔn)格式,用于數(shù)字電視廣播系統(tǒng)),主要實現(xiàn)音視頻的同步處理。
l????????rtpmp2tpay:將有效的負(fù)載編碼MPEG2-TS傳輸流打包成RTP協(xié)議包,適合實時流媒體傳輸。
l????????udpsink:通過以太網(wǎng)傳輸udp的數(shù)據(jù)。
?
gst-launch是gstreamer提供的快速建立多媒體處理管道的軟件,它可以通過指令來驗證整個軟件的實現(xiàn)的可能性。上述的功能我們可以通過該工具很方便的實現(xiàn)出來,具體指令如下所示:
[python]?view plaincopy
如果正常的話通過客戶端軟件就可以直接看到帶有伴音的圖像了,而且應(yīng)該是音視頻同步的圖像。當(dāng)然客戶端也可以通過gst-launch來進(jìn)行實現(xiàn),可以在電腦上安裝好gstreamer的環(huán)境,現(xiàn)在windows和linux均有支持,我沒有去研究如何用gst-launch來進(jìn)行解碼顯示,因為有更方便的工具可以實現(xiàn)這個功能,那就是VLC播放器,打開VLC選擇“文件”-->“打開網(wǎng)絡(luò)串流”在UDP/RTP輸入正確的端口號,點(diǎn)擊確定就可以正常播放網(wǎng)絡(luò)傳輸?shù)囊粢曨l了。
當(dāng)然你如果僅僅想傳輸視頻也是可以的,通過如下指令即可實現(xiàn)視頻單獨(dú)傳輸:
[python]?view plaincopy
客戶端解碼可以通過gst-launch實現(xiàn),指令如下(windows下的指令,linux下未測試):
[python]?view plaincopy
或則也可以通過VLC進(jìn)行播放,需要先編寫一個.sdp的文件,如下:
[plain]?view plaincopy
將上面內(nèi)容保存為rtph264.sdp文件,然后通過VLC打開即可接收并播放網(wǎng)絡(luò)傳輸?shù)囊曨l流。
上面的參數(shù)大家可以自行研究,這里就不贅述了。
上面的指令通過應(yīng)用程序也是很方便實現(xiàn)的,前提是你掌握了gstreamer的編程方法。
這里上傳一個非常有用的gstreamerAPI手冊,CHM格式的,是本人自己制作的,還是很實用的,而且查找函數(shù)和使用方法非常的方便,大家可以選擇下載。
GStreamer 1.0 Core Reference Manual
[html]?view plaincopy總結(jié)
以上是生活随笔為你收集整理的gstreamer教程及在DM3730上的应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学业水平测试计算机flash,(信息技术
- 下一篇: ios中位置权限_iOS 13中的位置权