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

    文章

    4031

    浏览量

    45568
  • OpenHarmony
    +关注

    关注

    31

    文章

    3926

    浏览量

    20720

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    爱普生SG2520CAA车规晶振在汽车电子系统中的应用

    在汽车电子系统中,稳定可靠的时钟信号是确保各个模块正常运行的关键。爱普生SG2520CAA车规晶振以其卓越的性能和可靠性,成为汽车电子系统应用的理想选择。 SG2520CAA拥有20种标准频率,能够
    的头像 发表于 09-05 16:53 584次阅读

    迅为RK3568开发板新增topeet子系统-在产品中新增子系统

    build/subsystem_config.json文件中增加名为topeet的子系统,在3.4节已经新建了topeet 文件夹存放子系统代码。添加 topeet 子系统进行一个登记,说明
    发表于 06-16 10:43

    迅为RK3568开发板驱动指南GPIO子系统GPIO子系统API函数的引入

    迅为RK3568开发板驱动指南GPIO子系统GPIO子系统API函数的引入
    的头像 发表于 05-29 14:05 833次阅读
    迅为RK3568开发板驱动指南GPIO<b class='flag-5'>子系统</b>GPIO<b class='flag-5'>子系统</b>API函数的引入

    RK3568驱动指南|第十二篇 GPIO子系统-第135章 GPIO子系统与pinctrl子系统相结合实验

    RK3568驱动指南|第十二篇 GPIO子系统-第135章 GPIO子系统与pinctrl子系统相结合实验
    的头像 发表于 05-23 13:47 746次阅读
    RK3568驱动指南|第十二篇 GPIO<b class='flag-5'>子系统</b>-第135章 GPIO<b class='flag-5'>子系统</b>与pinctrl<b class='flag-5'>子系统</b>相结合实验

    一文带你了解KaihongOS标准系统的技术架构、子系统系统应用、典型特性以及支持的设备类型

    、分布式数据管理、分布式任务调度、公共基础库、多模输入、图形、安全、AI等子系统组成。 基础软件服务子系统集:提供公共的、通用的软件服务,由事件通知、电话、多媒体、DFX(Design For X
    发表于 04-23 07:17

    飞凌嵌入式ElfBoard ELF 1板卡-input子系统之input子系统简介

    在Linux系统中,Input子系统是一个用于处理输入设备的软件框架。它提供了一种统一的接口和机制,使得各种输入设备(如键盘、鼠标、触摸屏、游戏手柄等)能够与Linux系统进行交互。Input
    发表于 04-15 10:27

    鸿蒙北向开发OpenHarmony5.0 DevEco Studio开发工具安装与配置

    本文介绍OpenHarmony5.0 DevEco Studio开发工具安装与配置,鸿蒙北向开发入门必备!由触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器,支持开源鸿蒙OpenHarmony3
    的头像 发表于 03-28 18:05 1336次阅读
    鸿蒙北向开发<b class='flag-5'>OpenHarmony</b>5.0 DevEco Studio开发工具安装与配置

    飞凌嵌入式ElfBoard ELF 1板卡-Pinctrl和GPIO子系统之Pinctrl子系统

    pinctrl(Pin Control)子系统是Linux内核中的一个模块化子系统,用于管理和控制硬件引脚(Pin)的配置和功能。它提供了一种统一的接口,使驱动程序可以对硬件引脚进行灵活的配置和控制
    发表于 03-22 09:23

    迅为RK3568开发板篇OpenHarmony实操HDF驱动控制LED-在产品中新增子系统

    在build/subsystem_config.json文件中增加名为topeet的子系统,在3.4节已经新建了topeet文件夹存放子系统代码。添加 topeet 子系统进行一个登记,说明
    发表于 02-08 10:47

    鸿蒙北向开发OpenHarmony4.1 DevEco Studio开发工具安装与配置

    OpenHarmony4.1 DevEco Studio开发工具安装与配置,鸿蒙北向开发入门必备!
    的头像 发表于 02-07 17:35 1340次阅读
    鸿蒙北向开发<b class='flag-5'>OpenHarmony</b>4.1 DevEco Studio开发工具安装与配置

    详解deepin 25 Preview的Distrobox子系统

    为解决根社区仓库部分软件包缺失,或版本不满足用户需求的问题,deepin 结合 Distrobox 方案,在商店上架了 Debian、Ubuntu、Arch Linux、 Fedora 子系统镜像
    的头像 发表于 01-24 09:15 2025次阅读
    详解deepin 25 Preview的Distrobox<b class='flag-5'>子系统</b>

    独家教程揭秘【一】:Purple Pi 带你7天入门OpenHarmony

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

    OpenHarmony源码编译后烧录镜像教程,RK3566鸿蒙开发板演示

    本文介绍瑞芯微主板/开发板编译OpenHarmony源码后烧录镜像的教程,触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器,树莓派卡片电脑设计,支持开源鸿蒙OpenHarmony3.2-5.0系统
    的头像 发表于 12-30 10:08 1513次阅读
    <b class='flag-5'>OpenHarmony</b>源码编译后烧录镜像教程,RK3566鸿蒙开发板演示

    OpenHarmony怎么修改DPI密度值?触觉智能RK3566鸿蒙开发板演示

    开源鸿蒙OpenHarmony系统下,修改DPI密度值的方法,触觉智能Purple Pi OH鸿蒙开发板演示,搭载了瑞芯微RK3566四核处理器,Laval鸿蒙社区推荐开发板,已适配全新开源鸿蒙OpenHarmony5.0 Re
    的头像 发表于 12-24 11:46 1082次阅读
    <b class='flag-5'>OpenHarmony</b>怎么修改DPI密度值?触觉智能RK3566鸿蒙开发板演示

    OpenHarmony默认30秒熄屏太麻烦?触觉智能鸿蒙开发板教你轻松取消

    OpenHarmony系统开机后 30 秒会自动息屏,教大家两招轻松取消自动息屏,触觉智能Purple Pi OH鸿蒙开发板演示,已适配全新OpenHarmony5.0 Release
    的头像 发表于 12-09 11:45 1304次阅读
    <b class='flag-5'>OpenHarmony</b>默认30秒熄屏太麻烦?触觉智能鸿蒙开发板教你<b class='flag-5'>轻松</b>取消