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