学习指南:如何快速上手媒体生态一致体验开发

过去开发者们在使用多媒体能力时,往往会遇到这样的问题,比如:为什么我开发的相机不如系统相机的效果好?为什么我的应用和其他的音乐一起发声了,我要怎么处理?以及我应该怎么做才能在系统的播控中心里可以看到呢?对于开发者的这些疑问,HarmonyOS 通过提供简单易用体验一致的生态接口,使得开发者可以轻松解决上述问题。下面会按照不同模块逐个进行介绍。

一、相机

1.1 问题背景

相机应用在早期的版本开发时,会发现三方相机和系统相机拍照的效果会有较明显的不一致。如下图对比,可以看到,在色彩/饱和度/纹理细节等方面有一些明显的差异。

三方相机:

系统相机:

1.2 问题原因

那么这一问题是怎么产生的呢?主要有两个原因:

1、系统相机采用了私有通路,从而获取了更好的效果

2、预览流拍照效果差

1.3 问题解决

针对以上问题,系统提出了如下的解决思路:

1、统一接口,统一流程,统一效果:通过统一开发接口和流程,从而使得三方相机和系统相机获取一致的体验

2、分离预览、拍照、录像,明确流定义,让正确的流做正确的事

3、相机管道流水线模型

1.4 代码示例

1、相机基本控制流程如下:

2、示例参考:

使用 PreviewOutput 实现相机预览:

// 1. 创建预览视图XComponent,获取SurfaceIdsurfaceId = xComponent.getXComponentSurfaceId();// 2. 创建预览数据流输出PreviewOutputpreviewOutput = createPreviewOutput(profile, surfaceId);// 3. 添加预览数据流输出到相机会话session.addOutput(previewOutput);

使用 PhotoOutput 实现相机拍照:

// 1. 创建图片接收器ImageReceiver,获取SurfaceIdsurfaceId = imageReceiver.getReceivingSurfaceId();// 2. 创建拍照数据流输出PhotoOutputphotoOutput = createPhotoOutput(profile, surfaceId);// 3. 添加拍照数据流输出到相机会话session.addOutput(photoOutput);

使用 VideoOutput 实现相机录像:

// 1. 创建视频编码器AVRecorder,获取SurfaceIdsurfaceId = avRecorder.getInputSurface();// 2. 创建录像数据流输出VideoOutputvideoOutput = createVideoOutput(profile, surfaceId);// 3. 添加录像数据流输出到相机会话session.addOutput(videoOutput);

更多详细的代码参考:

https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/media/camera-overview.md

二、音视频焦点

2.1 问题背景

音视频应用开发中遇到的很常见的一个场景,就是并发播放,而并发播放的一般解决思路是各个应用对焦点的申请和处理。

传统的焦点管理方法,依赖应用遵守约定好的策略,如果有的应用不遵守,比如不响应或者滥用焦点,就可能会出现不发声或者乱发声的现象,影响了用户的体验。

2.2 解决思路

针对以上的问题,鸿蒙系统改进了焦点管理的设计,提供了统一的焦点处理策略,来规范应用对于焦点的使用,以达成统一的发声体验。

系统中的焦点管理模块会存储一个焦点策略表,定义了不同的场景下,哪些应用可以获取焦点进行播放,哪些应用会失去焦点而停止播放,等等其他策略。

2.3 代码示例

可以通过接口的使用来看一下实际处理策略。

首先,在 A 应用创建并使用 AudioRenderer 播放的时候,系统会自动为其申请焦点,这个是系统的行为。

A 应用播放后,系统的焦点策略会进行判断,如果 A 应用可以抢到焦点,那就会使得失去焦点的应用暂停播放;同时被暂停的应用也会在 INTERRUPT_FORCE 的回调事件中,得到暂停的状态,应用在收到这个事件后,就需要存储并更新应用内的状态。

当 A 应用停止播放,之前被暂停的应用也会收到一个恢复播放的事件,这个事件会在 INTERRUPT_SHARE 中,应用可以进行恢复播放的操作,或者忽略,这个非强制行为。

// 1.AudioRenderer进行播放时,系统会申请焦点audioRenderer.start((err) => {});// 2.注册音频打断事件的回调audioRenderer.on('audioInterrupt', (event) => {  if (event.forceType === audio.InterruptForceType.INTERRUPT_FORCE) {      // 3.强制打断类型:音频相关处理已由系统执行,应用需更新自身状态  } else if (event.forceType === audio.InterruptForceType.INTERRUPT_SHARE) {      // 4.共享打断类型:应用可自主选择执行相关操作或忽略打断事件  }});

更多详细的代码参考:

https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/media/audio-playback-concurrency.md

三、低时延播放

3.1 问题背景

游戏、K 歌、乐器等应用,对于音频的输出时延要求很高,常规的播放通路一般只能达到 60ms 左右甚至更高的时延,无法满足这些应用的使用诉求。

3.2 解决思路

鸿蒙系统提供了低时延通路的设计。如下图所示,在系统中的普通通路之外,新增了一条垂直打通硬件的低时延通路,通过 bypass 框架层直接在 DSP 进行混音,可以达成最低 20ms 的音频输出时延。

同时,为了简化应用的接入,通过在接口中提供不同的参数配置,使开发者可以用一套接口同时支持低时延和普通通路两种播放模式。

3.3 代码示例

可以通过 OH_AudioStreamXXX 接口来进行低时延通路的创建,通过传入不同参数可以设置低时延模式,亦可以设置普通模式,从而使用一套接口来适配不同场景。

同时,低时延模式一般采用来 pull 模式来获取数据,这里提供了一个 callback,需要应用创建并填入。

// 1.创建音频流构造器,设置参数OH_AudioStreamBuilder_Create(&builder, AUDIOSTREAM_TYPE_RENDERER);OH_AudioStreamBuilder_SetSamplingRate(builder, rate); // 其他参数设置…// 2.设置低延时模式和数据回调OH_AudioStreamBuilder_SetLatencyMode(builder, AUDIOSTREAM_LATENCY_MODE_FAST) ;OH_AudioStreamBuilder_SetRendererCallback(builder, callback, nullptr);// 3.构造播放的音频流并使用OH_AudioStreamBuilder_GenerateRenderer(builder, &audioRenderer);OH_AudioRenderer_Start(audioRenderer);•OH_AudioRenderer_Release(audioRenderer);

更多详细的代码参考:

https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/media/using-ohaudio-for-playback.md

四、播控能力

4.1 系统能力通过前面所说的焦点管理策略,系统解决了音视频应用并发播放的问题;对于播放中的应用的控制,系统也提供了规范支持。

系统提供了 C/S 模式的播控管理的框架,应用作为客户端,接入 AVSession 的会话端,设置必要的信息;系统的播控中心获取与之对应的会话控制器,获取信息进行展示,以及对应用发送控制命令。

通过标准接口的接入,规范了应用的播放行为;同时通过统一的播控中心的入口,使得用户对于播放的控制做到一键直达。

4.2 代码示例

import AVSessionManager from '@ohos.multimedia.avsession';// 开始创建并激活媒体会话// 创建sessionlet context: Context = getContext(this);async function createSession() {  let type: AVSessionManager.AVSessionType = 'audio';  let session = await AVSessionManager.createAVSession(context, 'SESSION_NAME', type);  await session.activate();}async function setSessionInfo() {  // 播放器逻辑··· 引发媒体信息与播放状态的变更  // 设置必要的媒体信息  let metadata: AVSessionManager.AVMetadata = {    assetId: '0',    title: 'TITLE',    artist: 'ARTIST'  };  session.setAVMetadata(metadata).then(() => {  }).catch((err: BusinessError) => {  });  // 简单设置一个播放状态 - 暂停 未收藏  let playbackState: AVSessionManager.AVPlaybackState = {    state:AVSessionManager.PlaybackState.PLAYBACK_STATE_PAUSE,    isFavorite:false  };  session.setAVPlaybackState(playbackState, (err) => {  });}async function setListenerForMesFromController() {  // 一般在监听器中会对播放器做相应逻辑处理  // 不要忘记处理完后需要通过set接口同步播放相关信息,参考上面的用例  session.on('play', () => {    // do some tasks ···  });  session.on('pause', () => {    // do some tasks ···  });}

更多详细的代码参考:

https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/media/avsession-overview.md

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/158263.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

talbay---贝叶斯网络分析工具产品介绍

一 简介 talbay是拥有独立知识产权的国产软件,主要功能是贝叶斯网络建模、决策网络建模、概率计算、决策支持、敏感性分析、网络模型验证、机器学习等。talbay以用户为中心,简单易用, 计算准确高效,分析全面多样,在应用成熟理论及…

2023年“华为杯”第二十届中国研究生数学建模成绩数据分析(末尾有吃席群)

目录 0引言1、数据大盘1.1 官方数据1.2 分赛题统计数据1.2.1 A-F 获奖数1.2.2 A-F 获奖率 2、分学校统计获奖情况(数模之星没有统计)3、 数模之星4、吃席群5、写在最后的话 0引言 2023年华为杯成绩于2023年9月22-26日顺利举行,来自国际和全国…

23111706[含文档+PPT+源码等]计算机毕业设计SSM框架网上书城全套微信支付电商购物

文章目录 **软件开发环境及开发工具:****项目功能介绍:****论文截图:****实现:****代码片段:** 编程技术交流、源码分享、模板分享、网课教程 🐧裙:776871563 软件开发环境及开发工具&#xff…

MyBatis解析全局配置文件

MyBatis解析全局配置文件 MyBaits基础应用: 文档:MyBatis 链接:http://note.youdao.com/noteshare?id5d41fd41d970f1af9185ea2ec0647b64 传统JDBC和Mybatis相比的弊病 传统JDBC ​ Connection conn null; PreparedStatement pstmt …

面向面试学习,全网最齐全的软件测试面试题(含答案)

做测试的,我整理的真的很用心了,能找的新鲜面经都找了。 一面 1. 自我介绍 2. 面向对象的三种特性 集成用到了哪些特性 多态的具体使用场景 设计模式中的多态体现(手撕) 封装:将属性私有化;封装的意义&a…

Vue路由 replace属性 控制浏览记录不能前进或后退

默认是push模式 表示页面一直增加&#xff0c;用户可以操作返回上一个页面 replace 模式 <router-link replace :to"{path:/user,query:{ id:123,age:666 }} ">跳转用户</router-link><!--replace true表示浏览器不能后退浏览记录-->

视觉BEV基本原理和方案解析

BEV(Bird’s-Eye-View)是一种鸟瞰视图的传感器数据表示方法&#xff0c;它的相关技术在自动驾驶领域已经成了“标配”&#xff0c;纷纷在新能源汽车、芯片设计等行业相继量产落地。BEV同样在高德多个业务场景使用&#xff0c;例如&#xff1a;高精地图地面要素识别、车道线拓扑…

Attention Transformer

来源老师课件&#xff0c;方便以后复习。 课参考链接&#xff1a; http://jalammar.github.io/illustrated-transformer/ 之前的知识链接&#xff1a; 【知识链接】WGAN Transformer Vit Swin-Transformer Swin-Unet Res-Vit TransUNet MAE Bra ADDA 打分函数&#xff1a; 多头…

【413.等差数列划分】

目录 一、题目描述二、算法原理三、代码实现 一、题目描述 二、算法原理 三、代码实现 class Solution { public:int numberOfArithmeticSlices(vector<int>& nums) {int nnums.size();if(n<3) return 0;vector<int> dp(n);dp[2]dp[1]dp[0]0;if(nums[2]-nu…

【目标检测】基于yolov5的铝型材表面缺陷检测(附代码和数据集,Ubuntu或者Linux系统均可运行)

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。(专栏订阅用户订阅专栏后免费提供数据集和源码一份,超级VIP用户不在服务范围之内) 路虽远,行则将至;事虽难,做…

Nacos在Windows本地安装并启动教程

Nacos在Windows本地安装并启动教程 Nacos注册中心和Eureka是两种常见的服务注册与发现组件&#xff0c;它们在以下方面存在一些区别&#xff1a; 开源项目&#xff1a;Nacos是阿里巴巴开源的项目&#xff0c;而Eureka是Netflix开源的项目。 功能特性&#xff1a;Nacos在服务注册…

实验二 Python运算符和内置函数的使用《Python程序设计》实验指导书

实验二 Python运算符和内置函数的使用 一、实验目的和要求 &#xff08;一&#xff09;熟练掌握运算符的使用。 &#xff08;二&#xff09;熟练掌握内置函数的使用。 二、实验内容 &#xff08;一&#xff09;输入三角形的3个边长a、b、c&#xff0c;求三角形的面积area…

YOLO目标检测——机油泄露检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;机械设备维护、工业生产监控、环保监管等数据集说明&#xff1a;机油泄露检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富标签说明&#xff1a;使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0c;含voc(xml)、co…

go语言 | 图解字节青训营抖音(一)

前言 本文大致介绍了本人及本人所在小组为第五届字节跳动青训营后端专场大项目需求 —— 「实现一个极简版抖音」的部分实现细节。 需求 本届后端青训营大项目要求实现一个极简版抖音的后端服务&#xff0c;该后端服务通过 HTTP 协议向已被设计好的前端 App 传递数据&#xf…

【漏洞复现】IP-guard WebServer 远程命令执行

漏洞描述 IP-guard是一款终端安全管理软件,旨在帮助企业保护终端设备安全、数据安全、管理网络使用和简化IT系统管理。互联网上披露IP-guard WebServer远程命令执行漏洞情报。攻击者可利用该漏洞执行任意命令,获取服务器控制权限。 免责声明 技术文章仅供参考,任何个人和…

Android平台 - APP备案

今年因 工业和信息化部 要求&#xff0c;Andorid各大厂商陆续发出通知&#xff0c;需要各应用公司及时进行app备案&#xff0c;如过期未进行备案则会被陆续下架&#xff01; 正好在统计Andorid各平台对于app备案时间节点要求&#xff0c;故此予以总结&#xff08;一切均已平台为…

亚马逊美国站CPC认证ASTM F963测试项目要求有哪些?

ASTM F963是美国材料和试验联合会&#xff08;ASTM&#xff09;制定的儿童玩具安全性的标准规范&#xff0c;专门针对儿童玩具产品的安全性进行了规定和要求。 ASTM F963标准的内容和要求包括&#xff1a; 1、物理机械性能&#xff1a;规定了玩具的物理机械性能要求&#xff0…

cocos3.4.2 2d射线检测 和 animation动画

2D的射线检测 ,注:目标必须有2d刚体和2d碰撞器 ,且项目设置内必须是这个物理系统 //起点位置let objs new Vec2(this.node.getWorldPosition().x, this.node.getWorldPosition().y);// 终点 let obje new Vec2(objs.x 100, objs.y);// 射线检测let results PhysicsSystem2…

Python入门简介及下载安装,超详细教学!

文章目录 一、Python简介&#xff1a;Python解释器的类型Python的运行机制1、查看 Python 版本2、第一个Python3.x程序3、Python 应用 二、Python安装&#xff08;windows&#xff09;1、下载2、安装步骤&#xff1a; 三、运行Python1、交互式解释器&#xff1a;扩展&#xff1…

(预热2024最新)Java毕业设计、课程设计参考题目(全网最新 共计800多个)

临近期末或是毕业季&#xff0c;计算及专业的童鞋们最头疼的要数为毕设、课设选题目&#xff0c;不能太老旧、也不能太新颖&#xff08;无参考案例&#xff09;&#xff0c;慕代码为大家整理了近两年设计选题&#xff0c;让你直接上手开始选&#xff0c;省去了冥思苦想。从过来…