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

news2024/11/26 23:45:45

过去开发者们在使用多媒体能力时,往往会遇到这样的问题,比如:为什么我开发的相机不如系统相机的效果好?为什么我的应用和其他的音乐一起发声了,我要怎么处理?以及我应该怎么做才能在系统的播控中心里可以看到呢?对于开发者的这些疑问,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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中文撰稿好用软件推荐TexPage(似于Overleaf)

由于本人用惯了overleaf所以找到了一个与他功相似的也同样是利用tex写文章。唯一的区别可能也就是overleaf只支持英文,而TexPage中英文都支持。关键是不花钱,好用好用好用,用起来! 平台网址:https://www.texpage.com/…

C/C++算法-----------------------双指针详解技巧及例题

双指针 基本介绍降低时间复杂度降低时间复杂度例题 验证回文串判断是否为环反转链表总结 基本介绍 双指针(two poinnters)实际上是一种算法编程里的一种思想,它更像是一种编程思想,提供看非常高的算法效率,一般来说双…

Android——gradle插件配置方式——dependencies和plugins

引言 我们知道Android studio 需要gradle插件进行构建和编译,随着AGP的升级,引入gradle插件也发生了变化。旧版本通过build.gradle文件中dependencies代码块引入,新版本通过plugins代码块引入 一、旧版本引入方式dependencies 二、新版本引入…

解决java在idea运行正常,但是打成jar包后中文乱码问题

目录 比如: 打包命令使用utf-8编码: 1.当在idea中编写的程序,运行一切正常.但是当被打成jar包时,执行的程序会中文乱码.产生问题的原因和解决方案是什么呢? 一.问题分析 分别使用idea和jar包形式打印出System中所有的jvm参数---代码如下: public static…

一文揭秘共享wifi二维码项目推广技巧!

随着无线网络的普及和移动互联网的快速发展,共享WiFi已成为人们生活中不可或缺的一部分。共享WiFi二维码项目作为一个独具创意的共享项目,将二维码推广与共享WiFi相结合,不仅可以提升品牌曝光度,还能为用户提供便捷的上网体验。那…

windows10通过L2TP VPN隧道连接到企业内网

L2TP协议通过为数据包创建一个虚拟通道,将数据从一个网络传输到另一个网络,而不用担心数据在途中被窃取或篡改。它创建一个点对点的隧道,通过封装PPP(Point-to-Point Protocol)数据包在其内部进行传输,极大…

JSON 格式的接口测试流程【Eolink Apikit】

在进行JSON格式的接口测试时,需要使用工具发送HTTP请求并获取响应。测试工具可以是单独的测试框架,如 Eolink Apikit。测试人员需要根据接口文档和测试用例编写测试脚本,然后运行测试并分析结果,以确保接口的质量和稳定性。 当我…

探索企业主要人员API在金融领域的应用

前言 随着金融科技的不断发展,企业主要人员API在金融领域的应用日益重要。本文将探讨这个话题,并介绍一些关键的应用案例。 企业主要人员API在金融领域的应用 企业人员信息API在金融行业有许多应用。其中一个应用是风险评估。金融机构可以使用API获取…

用requests库下载文件时的挂起问题:一步步诊断与解决方案

在使用 requests 库下载一个大小为125KB的文件时,用户遇到了一个问题,下载进程在代码的特定行挂起了。用户已经检查了操作系统的内存,发现大约有2GB的空闲内存可用。用户正在使用 requests 库的2、28、1版本,并寻求帮助来调试这个…

外汇天眼:什么是非农?非农数据对外汇市场的重要性!

非农数据在外汇市场中扮演着何等关键的角色? 美国非农数据,简称“非农”,具体指排除农业部门、个体户和非盈利机构雇员后的就业相关数据,是反映美国经济实际就业和整体经济状况的关键指标。该数据由美国劳工部劳动统计局每月发布…

Bumptop——3D桌面一键get

今天,博主给大家带来一款免费、炫酷的桌面真理工具——Bumptop。这是一款可使桌面变为极酷3D桌面的软件。采用极酷的3D技术,把图标立体化,同时拖拽动作也是别有动感,充满智慧,可以完全抛弃原先单调的2D和伪3D界面&…

猫罐头哪个牌子好?推荐5款猫罐头品牌排行榜!

选择猫罐头是一项非常重要的任务,绝对不能马虎对待。因为好的猫罐头不仅提供丰富的营养,充足的水分和良好的口感,还能被猫咪轻松吸收。然而,一旦选择错误,不仅无法达到这些效果,还可能产生相反的影响。 作为…

【Axure教程】滑动内容选择器

滑动内容选择器通常是一种用户界面组件,允许用户通过滑动手势在一组内容之间进行选择。这种组件可以在移动应用程序或网页中使用,以提供直观的图片选择体验。 那今天就教大家如何用中继器制作一个滑动内容选择器,我们会以滑动选择电影为案例…

大数据可视化是什么?

大数据可视化是将海量数据通过视觉方式呈现出来,以便于人们理解和分析数据的过程。它可以帮人们发现数据之间的关系、趋势和模式,并制定更明智的决策。大数据可视化通常通过图形、图表、地图和仪表盘等视觉元素来呈现数据。这些元素具有直观、易理解的特…

20套面向对象程序设计选题Java Swing(含教程) (三) 持续更新 建议收藏

20套面向对象程序设计选题Java Swing(含教程) (一) 20套面向对象程序设计选题Java Swing(含教程) (二) 9.交通罚单管理系统 点击查看项目演示及教程视频 源码下载 【功能描述】 ​系统有管理员、交警、驾驶员三个角色; 用户登录后可修改密码​; 管…

Jquery 通过class名称属性,匹配元素

UI自动化过程中,常常需要判断某个元素是否满足条件,再走不通的脚本逻辑;、本文介绍如何通过jquery判断菜单是否展开,来决定是否执行菜单展开脚本;Jquery通过class名称属性,匹配元素 我们先分析,…

MatrixOne 支持多样化生态工具

近日,云原生数据库 MatrixOne 支持多样化生态工具,包括:数据集成工具、BI 工具和数据计算引擎这三类生态工具。 云原生数据库使得传统数据库得以充分结合云服务的免运维、高弹性、高可扩展、高可用、高性价比优势,又顺应了云端应…

史上超全UI/UX设计素材网站大合集!足足26个!

作为一个设计师,无论是UI设计师还是UX设计师,我们通常每天都会花不少于2个小时的时间来寻找一些新的设计灵感,寻找设计新创意。而现在由于互联网的快速发展,我们可以很容易的就从互联网上获取到各种设计资源和设计灵感&#xff0c…

如何制作keil5的Device pack

概述: 作为一名嵌入式芯片相关行业人员,我们经常需要使用到Device pack, 比如STM32的pack如下图所示: 名词DFP: 设备家族包 DFP Pack组成: Boards (板级支持)Device (芯片设备级支持)Docum…

【代数学习题3】从零理解数域扩张与嵌入 —— 同构、商环、分裂域与同态映射

数域的结构——数域的扩张、嵌入 写在最前面从零开始的概念合集从零理解数域的扩张和同构概念基本概念同构的概念商环的概念 2 3 \sqrt[3]{2} 32 ​ 有三个 Q \mathbb{Q} Q-嵌入(同态映射) Q ( 2 3 ) \mathbb{Q}(\sqrt[3]{2}) Q(32 ​) 和 Q [ x ] / (…