如何優(yōu)雅地參與開源貢獻(xiàn),向頂級開源項(xiàng)目提交 PR(Pull Request),跟著大咖 30 分鐘成為 OpenAtom OpenHarmony(以下簡稱“OpenHarmony”) Contributor。戰(zhàn)“碼”先鋒直播間第四期,邀請華為終端BG軟件架構(gòu)設(shè)計(jì)部主任工程師 Jelly 為大家分享《輕松入門,成為媒體開發(fā)者》。分享主要介紹了:軟件工程師必備技能(Git,識別好的代碼),HiStreamer 媒體引擎介紹和如何參與開源項(xiàng)目并得到能力提升。
參與戰(zhàn)“碼”先鋒,PR 征集令!你可以在Gitee 的 OpenHarmony 代碼倉提交 PR 參與活動(dòng),和全球開發(fā)者同臺競技,比拼技藝,為 OpenHarmony 貢獻(xiàn)力量。
軟件工程師必備技能-Git
必備技能之Git的基本概念
Git 是開發(fā)人員的必備工具,熟練地使用 Git 能夠讓自己在開發(fā)工作中更加得心應(yīng)手,特別是在參與開源項(xiàng)目中,Git 作為提交 PR 的常備工具,操作流程和代碼命令需要熟練于心。為此,Jelly 老師在分享中為大家梳理了 Git 工作中的幾個(gè)關(guān)鍵概念,抓住關(guān)鍵就能更容易理解 Git 的命令。 首先要理解工作目錄、本地倉庫、遠(yuǎn)端倉庫的概念。工作目錄(下圖藍(lán)色框內(nèi)),就是我們 clone 代碼之后本地的代碼;本地倉庫(下圖紅色框內(nèi)),是 .git 目錄的內(nèi)容,它包含了所有的代碼倉歷史記錄;遠(yuǎn)端倉庫,是 clone 代碼時(shí)使用的服務(wù)器端的地址,比如git@gitee.com:openharmony/multimedia_histreamer.git。遠(yuǎn)端倉庫和本地倉庫的內(nèi)容一般是一樣的。 其次需要理解 Git 歷史記錄相關(guān)概念。Git 作為版本管理工具,主要的任務(wù)是記錄歷史。歷史由一個(gè)個(gè) commit 構(gòu)成,每一次在 Git 上運(yùn)行 Git commit 命令,就會(huì)產(chǎn)生一個(gè) commit。開發(fā)過程中,經(jīng)常需要多個(gè)分支并行開發(fā)。Git 提供了超輕量級的分支管理機(jī)制,分支名就是指向分支最后一個(gè) commit 的指針,可以向該分支繼續(xù)提交 commit。為了方便溝通,還會(huì)給 commit 起別名,這就是 tag,它用來標(biāo)記一個(gè)確定的 commit 點(diǎn)。如果要獲取指定 commit 的代碼,可以輸入命令 git checkout commit_id 來完成,commit_id 也可以替換成分支名或者 tag。
為了方便在命令行查看分支圖,我們可以執(zhí)行下面命令配置一個(gè) git 命令別名 lg:
git config--global alias.lg "log--graph--pretty=format:'%Cred%h%Creset-%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'--abbrev-commit --date=relative"
在本地命令行輸入 git lg,就能查看當(dāng)前倉庫的歷史分支圖。git lg 跟普通的 git log 命令類似,也可以在后面加若干個(gè) commit_id/ 分支名 /tag,把該位置顯示到分支圖中。分支圖左側(cè)的每一個(gè)星號都對應(yīng)著一個(gè) commit,星號后面是 commit_id,然后可能還有黃色的部分是分支名和 tag 名稱,再往右是 commit message、時(shí)間和作者信息。
各個(gè)Git操作的含義
基本概念有助于我們理解,而接下來的介紹:各個(gè) Git 操作的含義則更為直觀地展示了 Git 操作的原理。Git 命令主要是將數(shù)據(jù)在多個(gè)區(qū)域中傳遞:Work space(工作目錄),Index(緩存區(qū)),本地倉庫和遠(yuǎn)程倉庫。比如 git add 是將工作目錄修改的代碼傳遞到緩存區(qū),執(zhí)行 commit 命令是將緩存的代碼提交到本地倉庫,開發(fā)者也可以用 git commit -a 將上述兩個(gè)命令合并成一個(gè)命令。commit 提交到本地倉庫,再用 git push 就可以提交到遠(yuǎn)程倉庫。用 git fetch 可以將遠(yuǎn)程倉庫的 commit 取到本地倉庫中,再用 git rebase 或者 git merge 可以將本地倉庫的代碼體現(xiàn)到工作目錄,也可以用 git pull 將上述兩個(gè)步驟合并。
常見的操作場景使用的命令如下:
●更新本地代碼(使之與服務(wù)器一致)
git fetch
git status
git rebase origin/master (注意:origin 是 remote 名字, master 是遠(yuǎn)程分支名,根據(jù)自己需要修改)
●提交代碼為本地 commit
git add -u
git commit -s -m "your message"
●本地 commit 上傳到服務(wù)器(origin一般要用自己的fork倉)
git push origin HEAD:master(注意:origin是remote名字,master是遠(yuǎn)程分支名,根據(jù)自己需要修改)
●創(chuàng)建 PR,更新 PR
源分支變化,PR 會(huì)自動(dòng)更新
●其他比較重要的知識
git blame path 查看文件每一行代碼的修改歷史
git reset / git checkout
git remote -v 使用多個(gè) remote
必備技能之識別好的代碼
好的代碼函數(shù)/模塊劃分清晰、分支判斷少、松耦合、易于閱讀和理解、依賴規(guī)則確定、學(xué)習(xí)成本低,差的代碼則相反。好代碼(也稱為整潔代碼)主要體現(xiàn)在:職責(zé)單一、干凈、無重復(fù),能夠直觀體現(xiàn)業(yè)務(wù)、通過了所有測試的優(yōu)雅的代碼。寫整潔代碼的主要方法是消除重復(fù),提高表現(xiàn)力。整潔編碼有四個(gè)原則:可以工作、容易被理解、沒有重復(fù)的邏輯和代碼、沒有多余的代碼。
下圖中對比了一個(gè)函數(shù)修改前后的代碼,修改前:函數(shù)較長,共 60 行。細(xì)節(jié)較多,不在同一個(gè)抽象層次上編碼;分支判斷較多,容易成為 BUG 的溫床,較難維護(hù)。修改后,函數(shù)只有 30 行,在同一個(gè)抽象層次上編碼,分支判斷較少,這樣會(huì)更容易理解和維護(hù)。
為了幫助大家提升識別/寫好代碼的能力,Jelly 老師還向大家介紹了需要關(guān)注的幾個(gè)知識點(diǎn):代碼壞味道、通過重構(gòu)改善既有代碼的設(shè)計(jì)、演進(jìn)式設(shè)計(jì)、設(shè)計(jì)模式、面向?qū)ο笤O(shè)計(jì)原則等;以及相關(guān)書籍推薦:《代碼整潔之道》、《重構(gòu)-改善既有代碼的設(shè)計(jì)》、《Head First 設(shè)計(jì)模式》、《敏捷軟件開發(fā):原則、模式與實(shí)踐》。
HiStreamer媒體引擎介紹
HiStreamer媒體引擎介紹
第三部分 Jelly 老師為我們介紹了 HiStreamer 媒體引擎。首先,從 OpenHarmony 媒體子系統(tǒng)軟件架構(gòu)開始,系統(tǒng)架構(gòu)主要分為四層。最上層是應(yīng)用層,包括音樂、視頻等應(yīng)用。第二層是應(yīng)用接口層,為應(yīng)用開發(fā)提供接口。最下面一層是 HDI 層,提供訪問硬件的抽象接口。HDI和接口層之間是服務(wù)層,主要有 MediaService、AudioService、CameraService 等服務(wù)。其中 MediaService 負(fù)責(zé)音視頻文件讀取、流媒體下載、解封裝、解碼等工作。在 MediaService中,有兩個(gè)媒體引擎,HiStreamer 就是其中之一。HiStreamer 可以在 mini/small/standard 設(shè)備上運(yùn)行,支持插件擴(kuò)展。
HiStreamer媒體引擎業(yè)務(wù)功能
媒體引擎主要負(fù)責(zé)媒體數(shù)據(jù)讀取、流媒體下載、封裝/解封裝、編解碼、輸出等。Jelly 老師以播放本地 MP3 文件為例,為大家詳細(xì)解讀 HiStreamer 媒體引擎的工作流程。 講解流程前先了解 MP3 的文件結(jié)構(gòu)。它由一個(gè) ID3 Metadata 容器頭和 ES Data(編碼后的音頻數(shù)據(jù))構(gòu)成。ES Data 由若干 MP3 Frame 數(shù)據(jù)幀組成,每個(gè) MP3 Frame 又由 MP3 Header 和 MP3 Data 構(gòu)成。
音頻文件在播放的過程中,首先要讀取 MP3 文件,解析 ID3 Metadata 容器頭,然后將 ES Data 解碼成 PCM,最后播放 PCM。這四個(gè)過程抽象成四個(gè)節(jié)點(diǎn):輸入節(jié)點(diǎn)、解封裝節(jié)點(diǎn)、解碼節(jié)點(diǎn)、輸出節(jié)點(diǎn)。上一個(gè)節(jié)點(diǎn)的輸出,是下一個(gè)節(jié)點(diǎn)的輸入。輸入節(jié)點(diǎn)讀取進(jìn)來的是文件數(shù)據(jù)流,經(jīng)過解封裝節(jié)點(diǎn),解析出 ID3 容器頭中的參數(shù),取出 ES Data 傳到下一個(gè)節(jié)點(diǎn):解碼節(jié)點(diǎn)。解碼節(jié)點(diǎn)再解碼 ES Data 得到 PCM 數(shù)據(jù)流,最后傳到輸出節(jié)點(diǎn)進(jìn)行播放。
HiStreamer的邏輯架構(gòu)
它分為媒體引擎和插件兩部分。其中插件又分為平臺插件和廠商插件。媒體引擎和平臺插件,是可以跨平臺運(yùn)行的。HiStreamer 媒體引擎又分為三層:●最上面是業(yè)務(wù)封裝層,為各種業(yè)務(wù)場景封裝易于使用的接口,比如播放器、錄音機(jī)等。●中間是 Pipeline 框架層,負(fù)責(zé)業(yè)務(wù)流程管理。Pipeline 由若干節(jié)點(diǎn)構(gòu)成,音頻播放的四個(gè)節(jié)點(diǎn)在 Pipeline 框架層被組裝起來。具體的業(yè)務(wù)處理在節(jié)點(diǎn)中完成,這些節(jié)點(diǎn)支持以插件的形式擴(kuò)展新的業(yè)務(wù)處理能力:比如輸入節(jié)點(diǎn)可以擴(kuò)展支持文件輸入、流媒體輸入,解封裝節(jié)點(diǎn)可以擴(kuò)展支持 MP3、MP4、AAC 等格式的解封裝,解碼節(jié)點(diǎn)可以擴(kuò)展支持 MP3、AAC 等格式的解碼,輸出插件,可以擴(kuò)展支持不同平臺/產(chǎn)品的輸出。
●引擎還有一個(gè)插件管理層,負(fù)責(zé)插件的加載、卸載等工作。
為了提高開發(fā)效率,HiStreamer 媒體引擎還配備了一個(gè)工具庫,提供 OS 適配和日志調(diào)測等功能。
如何參與開源項(xiàng)目并得到能力提升
以HiStreamer媒體引擎項(xiàng)目為例介紹參與方式
參與開源項(xiàng)目,首先要找到適合自己的方向,可以結(jié)合自己的興趣方向選擇開源項(xiàng)目。比如希望做JS應(yīng)用開發(fā),則建議參與 OpenHarmony 應(yīng)用相關(guān)項(xiàng)目;如果想從事 C/C++ 開發(fā),建議參與 OpenHarmony 框架/服務(wù)等項(xiàng)目,比如:多媒體服務(wù),HiStreamer 媒體引擎等;驅(qū)動(dòng)開發(fā)也可以參與 OpenHarmony 驅(qū)動(dòng)相關(guān)項(xiàng)目。 如果想提升軟件開發(fā)技能,可以選擇氛圍較好的社區(qū),這樣能夠更容易在社區(qū)內(nèi)結(jié)識活躍的開發(fā)者和 committer,并獲得幫助。另外,挑選一個(gè)易于學(xué)習(xí)上手的項(xiàng)目比較重要,比如:代碼質(zhì)量高,入門簡單,學(xué)習(xí)曲線平緩的項(xiàng)目,這樣對開發(fā)者來說學(xué)習(xí)的路徑相對輕松。這里Jelly老師推薦了一個(gè)開源項(xiàng)目 HiStreamer 媒體引擎,在 PC 機(jī)上就可以編譯運(yùn)行,比較容易上手。大家可以在 HiStreamer 項(xiàng)目中選擇適合自己的任務(wù)參與,比如,文檔補(bǔ)充,測試用例補(bǔ)充,還可以參與問題解決,或者實(shí)現(xiàn)新的插件。
HiStreamer 媒體引擎項(xiàng)目還有自動(dòng)化測試用例,這樣有 3 個(gè)好處:①修改代碼后,執(zhí)行用例就可以比較完整地進(jìn)行測試,比手動(dòng)測試覆蓋更全,執(zhí)行更輕松;②測試用例表明了軟件的使用方法,可以作為了解軟件功能的入口。③大家還可以通過補(bǔ)充測試用例的方式參與進(jìn)來。
在參與項(xiàng)目過程中,大家可以獲得軟件設(shè)計(jì)、開發(fā)、測試相關(guān)技能的提升,這些技能普遍適用于所有軟件項(xiàng)目。同時(shí),大家還可以通過項(xiàng)目了解媒體格式相關(guān)知識。
HiStreamer開發(fā)環(huán)境與編譯運(yùn)行
編譯代碼的第一步是搭建運(yùn)行環(huán)境。為 HiStreamer 媒體引擎搭建一個(gè)環(huán)境并運(yùn)行起來非常簡單,一般有軟件編譯背景的開發(fā)者都能辦到。一般有2種方式運(yùn)行 HiStreamer:使用 PC 或開發(fā)板。其中使用 PC 運(yùn)行的開發(fā)環(huán)境最為簡單,它對電腦系統(tǒng)沒有特殊的要求,基本上所有電腦都能做到。在開發(fā)板上運(yùn)行的環(huán)境復(fù)雜一些,需要在 Linux 系統(tǒng)下編譯,并且需要較大的硬盤空間,至少需要 60G 內(nèi)存,還需要有開發(fā)板。
Jelly 老師主要介紹如何在 PC 上運(yùn)行 HiStreamer 媒體引擎。首先需要安裝 CLion 和 MinGW 8.1.0 posix seh 版本。隨后啟動(dòng) CLion,F(xiàn)ile->Open,選擇 histreamer_dev 目錄,打開它即可編譯運(yùn)行。第一次打開會(huì)自動(dòng)下載 test_resource和histreamer。如果要運(yùn)行自動(dòng)化測試,還需要安裝 Python3。
PC編譯運(yùn)行步驟:
1.打開 CLion,點(diǎn)擊File->Open。
2.瀏覽到 histreamer_dev 目錄,打開它就能自動(dòng)開始配置。
3.如果沒有配置,可以點(diǎn)擊項(xiàng)目根目錄,右鍵,選擇 Reload CMake Project。
4.配置完成,右上角就可以選擇構(gòu)建目標(biāo) histreamer_player,點(diǎn)擊編譯運(yùn)行按鈕即可編譯運(yùn)行。
5.還可以選擇其它的構(gòu)建目標(biāo),比如 histreamer_st 編譯運(yùn)行測試用例。
histreamer_st 還支持通過參數(shù)指定運(yùn)行哪些 tag 的用例,比如:
●fast - 運(yùn)行所有快速運(yùn)行完的用例;
●video_play_fast - 運(yùn)行快速的 video 播放測試;
●audio_play_fast - 運(yùn)行快速的 audio 播放測試。
HiStreamer單步跟蹤調(diào)試運(yùn)行
在 PC 上運(yùn)行,有一個(gè)好處就是可以通過調(diào)試運(yùn)行的方式,單步跟蹤運(yùn)行流程。通過這種方式,可以比較快地了解軟件的工作流程。下圖中幾個(gè)主要的步驟如下: 1在代碼中的某個(gè)位置設(shè)置斷點(diǎn)。
2點(diǎn)擊屏幕右上方的 Debug 按鈕,CLion 會(huì)以調(diào)試的方式將代碼運(yùn)行起來。當(dāng)運(yùn)行到設(shè)置的斷點(diǎn)位置,就會(huì)停下來。
3可以單步運(yùn)行,比如第一個(gè)按鈕 step over,點(diǎn)擊它就會(huì)往下走一行,遇到函數(shù)也不會(huì)走進(jìn)函數(shù)里面;第二個(gè)按鈕是 step into,遇到函數(shù)時(shí),將跳入函數(shù)中執(zhí)行。單步跟蹤能夠清晰地看到代碼執(zhí)行情況,這對于學(xué)習(xí)代碼運(yùn)行流程非常有幫助。
4可以查看每個(gè)線程的運(yùn)行調(diào)用棧。雙擊函數(shù)調(diào)用的位置,就能看到對應(yīng)的代碼。
5可以看到當(dāng)前的變量的值,或者添加自己關(guān)注的變量。
HiStreamer自動(dòng)運(yùn)行所有測試
為了方便大家補(bǔ)充用例,Jelly 老師也簡單介紹了自動(dòng)化測試用例的相關(guān)知識。在項(xiàng)目的根目錄下,有一個(gè)名為 local_test.bat 的腳本文件,雙擊它就可以運(yùn)行所有的自動(dòng)化測試。這里使用了 testngpp 這個(gè)測試框架來管理用例,具體使用方法參見這個(gè)鏈接:https://gitee.com/sinojelly/testngpp2。
測試用例被放在測試裝置(FIXTURE)中,一個(gè)測試裝置,可以有多個(gè)用例。用例可以是 TEST 定義的普通測試用例,也可以是 PTEST 定義的參數(shù)化測試用例。PTEST 后面有用例執(zhí)行時(shí)需要傳入的參數(shù),這里是 url,后面是用例的名字,要描述清楚這個(gè)用例的測試場景。下面是用例的內(nèi)容,這里是創(chuàng)建播放器播放一個(gè) url。PTEST 的參數(shù)由 DATA_PROVIDER 提供,DATA_PROVIDER 里可以有多個(gè) DATA_GROUP,針對每個(gè) DATA_GROUP 都會(huì)調(diào)用一次 PTEST,從而測試不同路徑的 url 的播放。這樣把測試用例和測試數(shù)據(jù)進(jìn)行了解耦,補(bǔ)充新的測試數(shù)據(jù)就可以覆蓋更多資源,不用修改用例。
歡迎感興趣的開發(fā)者朋友們一起跟著媒體子系統(tǒng) HiStreamer Committer 輕松入門,成為 OpenHarmony Contributor,同時(shí)學(xué)習(xí)并實(shí)踐實(shí)用的軟件開發(fā)技能,為大家今后在軟件研發(fā)領(lǐng)域的發(fā)展夯實(shí)基礎(chǔ)。
參與戰(zhàn)“碼”先鋒,PR 征集令!在 Gitee 的 OpenHarmony 代碼倉提交 PR 參與活動(dòng),和全球的開發(fā)者一起共建 OpenHarmony 的繁榮生態(tài)!
文章中涉及的鏈接匯總:
HiStreamer媒體引擎介紹:
https://www.bilibili.com/video/BV1v5411m72k
Git下載地址:
https://gitforwindows.org
HiStreamer輔助倉histreamer_dev:
https://gitee.com/histreamer/histreamer_dev
HiStreamer環(huán)境安裝:
https://gitee.com/histreamer/histreamer_dev/blob/master/README_zh.md
Python3下載地址:
https://www.python.org/downloads/
HiStreamer測試場景和結(jié)果匯總:
https://gitee.com/histreamer/multimedia_histreamer/wikis/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/%E6%B5%8B%E8%AF%95%E5%9C%BA%E6%99%AF%E5%92%8C%E7%BB%93%E6%9E%9C%E6%B1%87%E6%80%BB
HiStreamer插件開發(fā)指南:
https://gitee.com/openharmony/multimedia_histreamer/wikis/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97
CLion下載:
https://www.jetbrains.com/clion/download/other.html
MinGW 8.1.0 posix seh 版本下載:
國外:
https://nchc.dl.sourceforge.net/project/mingw-w64/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/8.1.0/threads-posix/seh/x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z
國內(nèi):
https://pan.baidu.com/s/1A5aVLZgM71HiiOkx8207eg?pwd=a7pt
testngpp測試框架:
https://gitee.com/sinojelly/testngpp2
-
開源
+關(guān)注
關(guān)注
3文章
3218瀏覽量
42329 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3641瀏覽量
16066
原文標(biāo)題:30分鐘成為Contributor|輕松入門,成為媒體子系統(tǒng)Contributor
文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論