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

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

3天内不再提示

【技术视界】学习指南:如何快速上手媒体生态一致体验开发

HarmonyOS开发者 来源:未知 2023-11-16 21:15 次阅读
# 技术视界# 【技术视界】栏目为开发者提供华为研发专家对于HarmonyOS关键技术的专业解读,从不同角度、不同方面帮助开发者更好更快地掌握HarmonyOS相关开发知识。本期文章为大家带来的是华为媒体技术工程师的分享,希望为您的开发之路带来启发~

作者:chengcheng,华为媒体技术工程师

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

相机

1.1问题背景

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

三方相机:

wKgaomVhpIaAY1wQAANLaF0w8u0434.png

系统相机:

wKgZomVhpKOAZjLfAAI4-Was4Fk585.png

1.2问题原因

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

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

wKgaomVWFwKAY8ZLAAC5SdN7a_M734.png

2、预览流拍照效果差

wKgaomVWFwKALiDYAACYO7MdFQc478.png

1.3问题解决

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

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

wKgaomVWFwOAB75lAAEI_0QE8SM360.png

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

wKgaomVWFwOAe975AAFU7-WV1vI111.png

3、相机管道流水线模型

wKgaomVWFwOAAqT7AAD6H9VGGPc052.png

1.4代码示例

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

wKgaomVWFwOAGdnpAACw7mwQejs802.png

2、示例参考:

使用PreviewOutput实现相机预览:

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

(左右滑动查看更多)

使用PhotoOutput实现相机拍照:

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

(左右滑动查看更多)

使用VideoOutput实现相机录像:

//1.创建视频编码器AVRecorder,获取SurfaceId
surfaceId=avRecorder.getInputSurface();
//2.创建录像数据流输出VideoOutput
videoOutput=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 解决思路

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

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

wKgaomVWFwOAWpGiAADRPWs0QLc305.png

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的音频输出时延。

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

wKgaomVWFwOALUhOAAEOGBo7olg541.png

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的会话端,设置必要的信息;系统的播控中心获取与之对应的会话控制器,获取信息进行展示,以及对应用发送控制命令。

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

wKgaomVWFwSAZpjcAAEL-L5GYnM102.png

4.2 代码示例

import AVSessionManager from '@ohos.multimedia.avsession';
// 开始创建并激活媒体会话
// 创建session
let 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

更多推荐


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • HarmonyOS
    +关注

    关注

    79

    文章

    1943

    浏览量

    29544

原文标题:【技术视界】学习指南:如何快速上手媒体生态一致体验开发

文章出处:【微信号:HarmonyOS_Dev,微信公众号:HarmonyOS开发者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    铜线键合焊接一致性:如何突破技术瓶颈?

    在微电子封装领域,铜线键合技术以其低成本、高效率和良好的电气性能等优势,逐渐成为芯片与基板连接的主流方式。然而,铜线键合过程中的焊接一致性问题是制约其进步发展和应用的关键难题。焊接一致
    的头像 发表于 07-04 10:12 906次阅读
    铜线键合焊接<b class='flag-5'>一致</b>性:如何突破<b class='flag-5'>技术</b>瓶颈?

    芯片封装工程师必备知识和学习指南

    芯片封装工程师是现代电子行业中不可或缺的专业人才,他们的工作涉及将设计好的芯片封装到细小的封装体中,以确保芯片能够在各种环境下稳定、可靠地工作。本文将详细介绍芯片封装工程师必备的专业知识,以及成为优秀芯片封装工程师的学习指南
    的头像 发表于 04-26 10:50 638次阅读
    芯片封装工程师必备知识和<b class='flag-5'>学习指南</b>

    Ubuntu系统快速上手

    Ubuntu系统快速上手概述和操作说明
    的头像 发表于 04-12 16:25 308次阅读
    Ubuntu系统<b class='flag-5'>快速</b><b class='flag-5'>上手</b>

    深入理解数据备份的关键原则:应用一致性与崩溃一致性的区别

    深入理解数据备份的关键原则:应用一致性与崩溃一致性的区别 在数字化时代,数据备份成为了企业信息安全的核心环节。但在备份过程中,两个关键概念——应用一致性和崩溃一致性,常常被误解或混淆。
    的头像 发表于 03-11 11:29 424次阅读
    深入理解数据备份的关键原则:应用<b class='flag-5'>一致</b>性与崩溃<b class='flag-5'>一致</b>性的区别

    openai sora如何使用?Sora 使用指南快速上手

    OpenAI Sora 使用指南快速上手 欢迎使用OpenAI Sora,款强大的人工智能视频生成工具。无论您是视频制作新手还是专业人士,本指南
    的头像 发表于 02-20 11:19 3644次阅读

    充放电不一致影响超级电容器性能的原因及解决方案

    充放电不一致影响超级电容器性能的原因及解决方案  充放电不一致是指超级电容器在充电和放电过程中无法保持一致的电压和电流特征。这种不一致会严重影响超级电容器的性能,包括能量密度、功率密度
    的头像 发表于 02-03 15:02 803次阅读

    使用 Taro 开发鸿蒙原生应用 —— 快速上手,鸿蒙应用开发指南

    为鸿蒙原生应用。 在 《使用 Taro 开发鸿蒙原生应用》 系列文章中,我们已经介绍了 鸿蒙的基本概念 和 Taro 适配鸿蒙的原理。本文作为该系列的第三篇,将正式为开发者提供份完整的鸿蒙应用
    的头像 发表于 02-02 16:09 553次阅读
    使用 Taro <b class='flag-5'>开发</b>鸿蒙原生应用 —— <b class='flag-5'>快速</b><b class='flag-5'>上手</b>,鸿蒙应用<b class='flag-5'>开发指南</b>

    DDR一致性测试的操作步骤

    DDR一致性测试的操作步骤  DDR(双数据率)一致性测试是对DDR内存模块进行测试以确保其性能和可靠性。在进行DDR一致性测试时,需要遵循系列的操作步骤,以保证测试的准确性和完整性
    的头像 发表于 02-01 16:24 684次阅读

    锁相环的输入输出相位一致吗?

    锁相环是保证相位一致,还是相位差一致?锁相环的输入输出相位一致吗? 锁相环(PLL)是种回路控制系统,用于保持输出信号的相位与参考信号的相位之间的恒定关系。简单来说,锁相环的目的是保
    的头像 发表于 01-31 15:45 494次阅读

    HC6800-ES V2.0单片机开发学习指南

    电子发烧友网站提供《HC6800-ES V2.0单片机开发学习指南.doc》资料免费下载
    发表于 01-07 09:48 6次下载

    HarmonyOS NEXT让开发快速上手媒体生态一致体验开发

    系统相机的效果好?”,“为什么我的应用和其他的音乐起发声了,我要怎么处理” 以及“我应该怎么做才能在系统的播控中心里可以看到?”等问题。对于开发者的这些疑问,HarmonyOS NEXT通过提供简单易用体验一致
    的头像 发表于 11-22 16:20 429次阅读
    HarmonyOS NEXT让<b class='flag-5'>开发</b>者<b class='flag-5'>快速</b><b class='flag-5'>上手</b><b class='flag-5'>媒体</b><b class='flag-5'>生态</b><b class='flag-5'>一致</b>体验<b class='flag-5'>开发</b>

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

    呢?对于开发者的这些疑问,HarmonyOS通过提供简单易用体验一致生态接口,使得开发者可以轻松解决上述问题。下面会按照不同模块逐个进行介绍。
    发表于 11-17 11:09

    什么是锂离子电池不一致性?如何提高锂离子电池的一致性?

    什么是锂离子电池不一致性?锂离子电池不稳定的原因?如何提高锂离子电池的一致性? 锂离子电池不一致性是指同批次或不同批次的锂离子电池在性能上出现不
    的头像 发表于 11-10 14:49 1041次阅读

    什么是电芯的不一致性?电芯不一致会造成什么后果?

    什么是电芯的不一致性?电芯不一致会造成什么后果? 电芯是电池组成部分之,由正负极、电解质和隔膜组成。在电动车和移动设备中广泛使用的锂离子电池,通常由数十个甚至数百个电芯组成。电芯的不一致
    的头像 发表于 11-06 10:56 2060次阅读

    如何保证缓存一致

    “ 本文的参考文章是2022年HOT 34上Intel Rob Blakenship关于CXL缓存一致性的篇介绍。”
    的头像 发表于 10-19 17:42 667次阅读
    如何保证缓存<b class='flag-5'>一致</b>性