0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

OpenAtom OpenHarmony 来源:OpenAtom OpenHarmony 作者:OpenAtom OpenHarmony 2022-06-30 15:22 次阅读

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

为了方便在命令行查看分支图,我们可以执行下面命令配置一个 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.png

各个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.png

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

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

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.png

为了帮助大家提升识别/写好代码的能力,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.png

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.png

HiStreamer的逻辑架构

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

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

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

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

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

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

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

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

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

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

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.png

HiStreamer单步跟踪调试运行

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

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

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

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

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

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

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.png

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

    文章

    3213

    浏览量

    42294
  • OpenHarmony
    +关注

    关注

    25

    文章

    3633

    浏览量

    16044

原文标题:30分钟成为Contributor|轻松入门,成为媒体子系统Contributor

文章出处:【微信号:gh_e4f28cfa3159,微信公众号:OpenAtom OpenHarmony】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Openharmony软件评估指南-米尔瑞芯微RK3568开发板

    Openharmony软件评估指南用于介绍在米尔的开发板上运行Openharmony系统下的核心资源与外设资源的测试步骤与评估方法。本文可作为前期评估指南使用,也可以作为通用系统开发的
    发表于 09-06 20:06

    鸿蒙开发接口媒体:【@ohos.multimedia.media (媒体服务)】

    媒体子系统为开发者提供一套简单且易于理解的接口,使得开发者能够方便接入系统并使用系统媒体资源。
    的头像 发表于 06-06 11:03 690次阅读
    鸿蒙开发接口<b class='flag-5'>媒体</b>:【@ohos.multimedia.media (<b class='flag-5'>媒体</b>服务)】

    鸿蒙OpenHarmony开发:【编译构建指导】

    OpenHarmony编译子系统是以GN和Ninja构建为基座,对构建和配置粒度进行部件化抽象、对内建模块进行功能增强、对业务模块进行功能扩展的系统,该系统提供以下基本功能
    的头像 发表于 05-13 09:31 1520次阅读
    鸿蒙<b class='flag-5'>OpenHarmony</b>开发:【编译构建指导】

    如何在OpenHarmony设置静态IP?

    介绍本文适用于所有RK3566/RK3568/RK3588平台产品在OpenHarmony系统上设置静态IP。本文以PurplePiOH开发板为例,在OpenHarmony系统上进行设
    的头像 发表于 05-12 08:32 581次阅读
    如何在<b class='flag-5'>OpenHarmony</b>设置静态IP?

    鸿蒙OpenHarmony开发板:【子系统配置规则】

    通过build仓下的subsystem_config.json可以查看所有子系统的配置规则。
    的头像 发表于 05-08 22:07 238次阅读
    鸿蒙<b class='flag-5'>OpenHarmony</b>开发板:【<b class='flag-5'>子系统</b>配置规则】

    鸿蒙OpenHarmony【标准系统编写“Hello World”程序】 (基于RK3568开发板)

    源码],创建RK3568开发板的源码工程。 示例目录 拉取openharmony项目代码,在代码根目录创建sample子系统文件夹,在子系统目录下创建hello部件文件夹,hello文件夹中创建
    的头像 发表于 04-24 17:32 672次阅读
    鸿蒙<b class='flag-5'>OpenHarmony</b>【标准<b class='flag-5'>系统</b>编写“Hello World”程序】 (基于RK3568开发板)

    鸿蒙OpenHarmony【快速入门概述】

    OpenHarmony是一款面向全场景的开源分布式操作系统,采用组件化设计,支持在128KiB到xGiB RAM资源的设备上运行系统组件,设备开发者可基于目标硬件能力自由选择系统组件进
    的头像 发表于 04-19 15:14 396次阅读
    鸿蒙<b class='flag-5'>OpenHarmony</b>【快速<b class='flag-5'>入门</b>概述】

    深开鸿正式升级成为OpenHarmony项目群A类捐赠人

    近日,深开鸿作为OpenHarmony核心共建单位、OpenHarmony生态委员会委员单位、OpenHarmony代码Top 10贡献单位,通过了开放原子开源基金会OpenHarmony
    的头像 发表于 04-18 09:40 564次阅读
    深开鸿正式升级<b class='flag-5'>成为</b><b class='flag-5'>OpenHarmony</b>项目群A类捐赠人

    OpenHarmony内核编程实战

    编程入门[Hello,OpenHarmony]在正式开始之前,对于刚接触OpenHarmony的伙伴们,面对大篇幅的源码可能无从下手,不知道怎么去编码写程序,下面用一个简单的例子带伙伴们入门
    的头像 发表于 03-27 08:31 690次阅读
    <b class='flag-5'>OpenHarmony</b>内核编程实战

    鸿蒙OpenHarmony技术:【设备互信认证】

    OpenHarmony中,设备互信认证模块作为安全子系统的子模块,负责设备间可信关系的建立、维护、使用、撤销等全生命周期的管理,实现可信设备间的互信认证和安全会话密钥协商,是搭载OpenHarmony的设备进行可信互联的基础平
    的头像 发表于 03-25 17:04 620次阅读
    鸿蒙<b class='flag-5'>OpenHarmony</b>技术:【设备互信认证】

    鸿蒙开发图形图像:【图形子系统

    图形子系统主要包括UI组件、布局、动画、字体、输入事件、窗口管理、渲染绘制等模块,构建基于轻量OS应用框架满足硬件资源较小的物联网设备或者构建基于标准OS的应用框架满足富设备的OpenHarmony系统应用开发。
    的头像 发表于 03-23 16:50 582次阅读
    鸿蒙开发图形图像:【图形<b class='flag-5'>子系统</b>】

    鸿蒙开发学习:【驱动子系统

    OpenHarmony驱动子系统采用C面向对象编程模型构建,通过平台解耦、内核解耦,兼容不同内核,提供了归一化的驱动平台底座,旨在为开发者提供更精准、更高效的开发环境,力求做到一次开发,多系统部署。
    的头像 发表于 03-17 22:05 525次阅读
    鸿蒙开发学习:【驱动<b class='flag-5'>子系统</b>】

    【工作准备】OpenHarmony鸿蒙操作系统开发——基础必备软件

    前言 在下根据多年 OpenHarmony 内核及多个子系统的开发经验,将用到的必备工具软件列出一张清单,供新同学参考。如何精进?请自行搜索专业手册进行学习,我是碰到什么问题、需要什么小功能然后去查
    的头像 发表于 02-23 15:51 1627次阅读
    【工作准备】<b class='flag-5'>OpenHarmony</b>鸿蒙操作<b class='flag-5'>系统</b>开发——基础必备软件

    Purple Pi 带你7天入门OpenHarmony

    大家好!我是一名刚入门OpenHarmony的小白,很高兴能够和大家一起学习OpenHarmony,在本系列文章里,我将分享使用PurplePiOH从零开始学习开源鸿蒙的整个流程,并提供每一步需要
    的头像 发表于 02-19 13:20 424次阅读
    Purple Pi 带你7天<b class='flag-5'>入门</b><b class='flag-5'>OpenHarmony</b>

    轻松入门开发ARM程序分享

    电子发烧友网站提供《轻松入门开发ARM程序分享.pdf》资料免费下载
    发表于 11-17 11:39 0次下载
    <b class='flag-5'>轻松</b><b class='flag-5'>入门</b>开发ARM程序分享