• 1
  • 2
  • 3
  • 4

首页 / 行业

轻松入门OpenHarmony成为媒体子系统Contributor

2022-06-30 15:22:00

如何优雅地参与开源贡献,向顶级开源项目提交 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。

69db8a08-f6e3-11ec-ba43-dac502259ad0.webp

为了方便在命令行查看分支图,我们可以执行下面命令配置一个 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、时间和作者信息。

6a0f7264-f6e3-11ec-ba43-dac502259ad0.webp

各个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 将上述两个步骤合并。

6a368bb0-f6e3-11ec-ba43-dac502259ad0.webp

常见的操作场景使用的命令如下:

●更新本地代码(使之与服务器一致)

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 行,在同一个抽象层次上编码,分支判断较少,这样会更容易理解和维护。

6a5b5a12-f6e3-11ec-ba43-dac502259ad0.webp

为了帮助大家提升识别/写好代码的能力,Jelly 老师还向大家介绍了需要关注的几个知识点:代码坏味道、通过重构改善既有代码的设计、演进式设计、设计模式、面向对象设计原则等;以及相关书籍推荐:《代码整洁之道》、《重构-改善既有代码的设计》、《Head First 设计模式》、《敏捷软件开发:原则、模式与实践》。

HiStreamer媒体引擎介绍

HiStreamer媒体引擎介绍

第三部分 Jelly 老师为我们介绍了 HiStreamer 媒体引擎。首先,从 OpenHarmony 媒体子系统软件架构开始,系统架构主要分为四层。最上层是应用层,包括音乐、视频等应用。第二层是应用接口层,为应用开发提供接口。最下面一层是 HDI 层,提供访问硬件的抽象接口。HDI和接口层之间是服务层,主要有 MediaService、AudioService、CameraService 等服务。其中 MediaService 负责音视频文件读取、流媒体下载、解封装、解码等工作。在 MediaService中,有两个媒体引擎,HiStreamer 就是其中之一。HiStreamer 可以在 mini/small/standard 设备上运行,支持插件扩展。

6a84fbd8-f6e3-11ec-ba43-dac502259ad0.webp

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 数据流,最后传到输出节点进行播放。

6aaf040a-f6e3-11ec-ba43-dac502259ad0.webp

HiStreamer的逻辑架构

它分为媒体引擎和插件两部分。其中插件又分为平台插件和厂商插件。媒体引擎和平台插件,是可以跨平台运行的。HiStreamer 媒体引擎又分为三层:●最上面是业务封装层,为各种业务场景封装易于使用的接口,比如播放器、录音机等。●中间是 Pipeline 框架层,负责业务流程管理。Pipeline 由若干节点构成,音频播放的四个节点在 Pipeline 框架层被组装起来。具体的业务处理在节点中完成,这些节点支持以插件的形式扩展新的业务处理能力:比如输入节点可以扩展支持文件输入、流媒体输入,解封装节点可以扩展支持 MP3、MP4、AAC 等格式的解封装,解码节点可以扩展支持 MP3、AAC 等格式的解码,输出插件,可以扩展支持不同平台/产品的输出。

●引擎还有一个插件管理层,负责插件的加载、卸载等工作。

为了提高开发效率,HiStreamer 媒体引擎还配备了一个工具库,提供 OS 适配和日志调测等功能。

6ad56a14-f6e3-11ec-ba43-dac502259ad0.webp

如何参与开源项目并得到能力提升

以HiStreamer媒体引擎项目为例介绍参与方式

参与开源项目,首先要找到适合自己的方向,可以结合自己的兴趣方向选择开源项目。比如希望做JS应用开发,则建议参与 OpenHarmony 应用相关项目;如果想从事 C/C++ 开发,建议参与 OpenHarmony 框架/服务等项目,比如:多媒体服务,HiStreamer 媒体引擎等;驱动开发也可以参与 OpenHarmony 驱动相关项目。 如果想提升软件开发技能,可以选择氛围较好的社区,这样能够更容易在社区内结识活跃的开发者和 committer,并获得帮助。另外,挑选一个易于学习上手的项目比较重要,比如:代码质量高,入门简单,学习曲线平缓的项目,这样对开发者来说学习的路径相对轻松。这里Jelly老师推荐了一个开源项目 HiStreamer 媒体引擎,在 PC 机上就可以编译运行,比较容易上手。大家可以在 HiStreamer 项目中选择适合自己的任务参与,比如,文档补充,测试用例补充,还可以参与问题解决,或者实现新的插件。

HiStreamer 媒体引擎项目还有自动化测试用例,这样有 3 个好处:①修改代码后,执行用例就可以比较完整地进行测试,比手动测试覆盖更全,执行更轻松;②测试用例表明了软件的使用方法,可以作为了解软件功能的入口。③大家还可以通过补充测试用例的方式参与进来。

在参与项目过程中,大家可以获得软件设计、开发、测试相关技能的提升,这些技能普遍适用于所有软件项目。同时,大家还可以通过项目了解媒体格式相关知识。

6afc8734-f6e3-11ec-ba43-dac502259ad0.webp

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 播放测试。

6b2023b0-f6e3-11ec-ba43-dac502259ad0.webp

HiStreamer单步跟踪调试运行

在 PC 上运行,有一个好处就是可以通过调试运行的方式,单步跟踪运行流程。通过这种方式,可以比较快地了解软件的工作流程。下图中几个主要的步骤如下: 1在代码中的某个位置设置断点。

2点击屏幕右上方的 Debug 按钮,CLion 会以调试的方式将代码运行起来。当运行到设置的断点位置,就会停下来。

3可以单步运行,比如第一个按钮 step over,点击它就会往下走一行,遇到函数也不会走进函数里面;第二个按钮是 step into,遇到函数时,将跳入函数中执行。单步跟踪能够清晰地看到代码执行情况,这对于学习代码运行流程非常有帮助。

4可以查看每个线程的运行调用栈。双击函数调用的位置,就能看到对应的代码。

5可以看到当前的变量的值,或者添加自己关注的变量。

6b4fec12-f6e3-11ec-ba43-dac502259ad0.webp

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 的播放。这样把测试用例和测试数据进行了解耦,补充新的测试数据就可以覆盖更多资源,不用修改用例。

6b65da40-f6e3-11ec-ba43-dac502259ad0.webp

欢迎感兴趣的开发者朋友们一起跟着媒体子系统 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

开源媒体子系统提交

  • 1
  • 2
  • 3
  • 4

最新内容

手机

相关内容

  • 1
  • 2
  • 3

猜你喜欢