中国总决赛
全球总决赛
学习进度
完成
省赛
能力分类
主要子系统
能力模型
相机、音频、播控、媒体库等

媒体应用开发概述


媒体系统架构

媒体系统提供用户视觉、听觉信息的处理能力,如音视频信息的采集、压缩存储、解压播放等。在操作系统实现中,通常基于不同的媒体信息处理内容,将媒体划分为不同的模块,包括:音频、视频(也称播放录制)、图片等。
如下图所示,媒体系统面向应用开发提供音视频应用、图库应用的编程框架接口;面向设备开发提供对接不同硬件芯片适配加速功能;中间以服务形态提供媒体核心功能和管理机制。
图1 媒体系统整体框架
notion image
  • 音频(audio):提供音量管理、音频路由管理、混音管理接口与服务。
  • 视频(media):提供音视频解压播放、压缩录制接口与服务。
  • 图片(image):提供图片编解码、图片处理接口与服务。
 

Audio Kit音视频


音视频概述

Audio Kit(音频服务)旨在提供场景化的音频播放和录制接口,助力开发者迅速构建音频高清采集及沉浸式播放能力。
在音视频开发指导中,将介绍各种涉及音频、视频播放或录制功能场景的开发方式,指导开发者如何使用系统提供的音视频API实现对应功能。比如使用TonePlayer实现简单的提示音,当设备接收到新消息时,会发出短促的“滴滴”声;使用AVPlayer实现音乐播放器,循环播放一首音乐。
在每个功能中,会介绍多种实现方式以应对不同的使用场景,以及该场景相关的子功能点。比如在音频播放功能内,会同时介绍音频的并发策略、音量管理和输出设备等在操作系统中的处理方式,帮助开发者能够开发出功能覆盖更全面的应用。
本开发指导仅针对音视频播放或录制本身,由@ohos.multimedia.audio(下文简称audio模块)和@ohos.multimedia.media(下文简称media模块)提供相关能力,不涉及UI界面、图形处理、媒体存储或其他相关领域功能。

开发说明

在开发音频功能之前,尤其是要实现处理音频数据的功能前,建议开发者先了解声学相关的知识,帮助理解操作系统提供的API是如何控制音频系统,从而开发出更易用、体验更好的音视频类应用。建议了解的相关概念包括但不限于:
  • 音频量化的过程:采样 > 量化 > 编码
  • 音频量化过程的相关概念:模拟信号和数字信号、采样率、声道、采样格式、位宽、码率、常见编码格式(如AAC、MP3、PCM、WMA等)、常见封装格式(如WAV、MPA、FLAC、AAC、OGG等)
在开发音乐、视频播放功能之前,建议了解流媒体播放的相关概念包括但不限于:
  • 播放过程:网络协议 > 容器格式 > 音视频编解码 > 图形/音频渲染
  • 网络协议:比如HLS、HTTP/HTTPS;容器格式:比如mp4,mkv,mpeg-ts,webm。
  • 编码格式:比如h263/h264/h265,MPEG4/MPEG2。

音频流介绍

在开发音频应用之前,还需要了解什么是音频流,它是HarmonyOS音频系统中的关键概念,在之后的章节中会多次提及。
音频流,是音频系统中对一个具备音频格式和音频使用场景信息的独立音频数据处理单元的定义,可以表示播放,也可以表示录制,并且具备独立音量调节和音频设备路由切换能力。
音频流基础信息通过AudioStreamInfo表示,包含采样、声道、位宽、编码信息,是创建音频播放或录制流的必要参数,描述了音频数据的基本属性。在配置时开发者需要保证基础信息与传输的音频数据是相匹配的,音频系统才能正确处理数据。

音频流使用场景信息

除了基本属性,音频流还需要具备使用场景信息。基础信息只能对音频数据进行描述,但在实际的使用过程中,不同的音频流,在音量大小,设备路由,并发策略上是有区别的。系统就是通过音频流所附带的使用场景信息,为不同的音频流制定合适的处理策略,以达到最佳的音频用户体验。
  • 播放场景
    • 音频播放场景的信息,通过StreamUsageContentType进行描述。
      StreamUsage指音频流本身的用途类型,包括媒体、语音通信、语音播报、通知、铃声等。
      ContentType指音频流中数据的内容类型,包括语音、音乐、影视、通知、铃声等。
  • 录制场景
    • 音频流录制场景的信息,通过SourceType进行描述。
      SourceType指音频流中录音源的类型,包括麦克风音频源、语音识别音频源、语音通话音频源等。

支持的音频格式

audio模块下的接口支持PCM编码,包括AudioRenderer、AudioCapturer、TonePlayer、OpenSL ES等。
音频格式说明:
  • 支持的常用的音频采样率(Hz):8000、11025、12000、16000、22050、24000、32000、44100、48000、64000、96000,具体参考枚举AudioSamplingRate
    • 不同设备支持的采样率规格会存在差异。
  • 支持的采样格式:U8(无符号8位整数)、S16LE(带符号的16位整数,小尾数)、S24LE(带符号的24位整数,小尾数)、S32LE(带符号的32位整数,小尾数)、F32LE(带符号的32位浮点数,小尾数),具体参考AudioSampleFormat
    • 由于系统限制,S24LE、S32LE、F32LE仅部分设备支持,请根据实际情况使用。
      小尾数指的是小端模式,即数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。这种存储模式将地址的高低和数据的位权有效结合起来,高地址部分权值高,低地址部分权值低。
media模块下的接口支持的音视频格式将在AVPlayer和AVRecorder的介绍中承载。

AVPlayer和AVRecorder

media模块提供了AVPlayerAVRecorder用于播放、录制音视频。

AVPlayer

AVPlayer主要工作是将Audio/Video媒体资源(比如mp4/mp3/mkv/mpeg-ts等)转码为可供渲染的图像和可听见的音频模拟信号,并通过输出设备进行播放。
AVPlayer提供功能完善一体化播放能力,应用只需要提供流媒体来源不负责数据解析和解码就可达成播放效果。(这样有什么好处???)
音频播放
当使用AVPlayer开发音乐应用播放音频时,其交互关系如图所示。
图1
音频播放外部模块交互图
notion image
音乐类应用通过调用JS接口层提供的AVPlayer接口实现相应功能时,框架层会通过播放服务(Player Framework)将资源解析成音频数据流(PCM),音频数据流经过软件解码后输出至音频服务(Audio Framework),由音频服务输出至音频驱动渲染,实现音频播放功能。完整的音频播放需要应用、Player Framework、Audio Framework、音频HDI共同实现。
图1中,数字标注表示需要数据与外部模块的传递。
  1. 音乐应用将媒体资源传递给AVPlayer接口。
  1. Player Framework将音频PCM数据流输出给Audio Framework,再由Audio Framework输出给音频HDI。
视频播放
当使用AVPlayer开发视频应用播放视频时,其交互关系如图所示。
图2
视频播放外部模块交互图
notion image
应用通过调用JS接口层提供的AVPlayer接口实现相应功能时,框架层会通过播放服务(Player Framework)解析成单独的音频数据流和视频数据流,音频数据流经过软件解码后输出至音频服务(Audio Framework),再至硬件接口层的音频HDI,实现音频播放功能。视频数据流经过硬件(推荐)/软件解码后输出至图形渲染服务(Graphic Framework),再输出至硬件接口层的显示HDI,完成图形渲染。
完整的视频播放需要:应用、XComponent、Player Framework、Graphic Framework、Audio Framework、显示HDI和音频HDI共同实现。
图2中,数字标注表示需要数据与外部模块的传递。
  1. 应用从XComponent组件获取窗口SurfaceID,获取方式参考XComponent
  1. 应用把媒体资源、SurfaceID传递给AVPlayer接口。
  1. Player Framework把视频ES数据流输出给解码HDI,解码获得视频帧(NV12/NV21/RGBA)。
  1. Player Framework把音频PCM数据流输出给Audio Framework,Audio Framework输出给音频HDI。
  1. Player Framework把视频帧(NV12/NV21/RGBA)输出给Graphic Framework,Graphic Framework输出给显示HDI。
支持的格式与协议
推荐使用以下主流的播放格式,音视频容器、音视频编码属于内容创作者所掌握的专业领域,不建议应用开发者自制码流进行测试,以免产生无法播放、卡顿、花屏等兼容性问题。若发生此类问题不会影响系统,退出播放即可。
支持的协议如下:
协议类型
协议描述
本地点播
协议格式:支持file descriptor,禁止file path
网络点播
协议格式:支持http/https/hls
支持的音频播放格式如下:
音频容器规格
规格描述
m4a
音频格式:AAC
aac
音频格式:AAC
mp3
音频格式:MP3
ogg
音频格式:VORBIS
wav
音频格式:PCM
说明
视频播放支持的视频格式分为必选规格和可选规格。必选规格为所有设备均支持的视频格式。对于可选规格,不同设备的实际实现不同。建议开发者做对应的兼容处理,保证应用功能全平台兼容。
视频格式
是否必选规格
H264
MPEG2
MPEG4
H263
VP8
支持的视频播放格式和主流分辨率如下:
视频容器规格
规格描述
分辨率
mp4
视频格式:H264/MPEG2/MPEG4/H263 音频格式:AAC/MP3
主流分辨率,如4K/1080P/720P/480P/270P
mkv
视频格式:H264/MPEG2/MPEG4/H263 音频格式:AAC/MP3
主流分辨率,如4K/1080P/720P/480P/270P
ts
视频格式:H264/MPEG2/MPEG4 音频格式:AAC/MP3
主流分辨率,如4K/1080P/720P/480P/270P
webm
视频格式:VP8 音频格式:VORBIS
主流分辨率,如4K/1080P/720P/480P/270P

AVRecorder

AVRecorder主要工作是捕获音频信号,接收视频信号,完成音视频编码并保存到文件中,帮助开发者轻松实现音视频录制功能,包括开始录制、暂停录制、恢复录制、停止录制、释放资源等功能控制。它允许调用者指定录制的编码格式、封装格式、文件路径等参数。
图3
视频录制外部模块交互图
notion image
  • 音频录制:应用通过调用JS接口层提供的AVRecorder接口实现音频录制时,框架层会通过录制服务(Player Framework),调用音频服务(Audio Framework)通过音频HDI捕获音频数据,通过软件编码封装后保存至文件中,实现音频录制功能。
  • 视频录制:应用通过调用JS接口层提供的AVRecorder接口实现视频录制时,先通过Camera接口调用相机服务(Camera Framework)通过视频HDI捕获图像数据送至框架层的录制服务,录制服务将图像数据通过视频编码HDI编码,再将编码后的图像数据封装至文件中,实现视频录制功能。
    • 说明
      AVRecorder只负责视频数据的处理,需要与视频数据采集模块配合才能完成视频录制。视频数据采集模块需要通过Surface将视频数据传递给AVRecorder进行数据处理。
      当前常用的数据采集模块为相机模块,相关说明以相机举例,相机模块目前仅对系统应用开放。
通过音视频录制组合,可分别实现纯音频录制、纯视频录制,音视频录制。
图3中,数字标注表示需要数据与外部模块的传递。
  1. 应用通过AVRecorder接口从录制服务获取SurfaceID。
  1. 应用将SurfaceID设置给相机服务,相机服务可以通过SurfaceID获取到Surface。相机服务通过视频HDI捕获图像数据送至框架层的录制服务。
  1. 相机服务通过Surface将视频数据传递给录制服务。
  1. 录制服务通过视频编码HDI模块将视频数据编码。
  1. 录制服务将音频参数设置给音频服务,并从音频服务获取到音频数据。

支持的格式

支持的音频源如下:
音频源类型
说明
mic
系统麦克风作为音频源输入。
支持的视频源如下:
视频源类型
说明
surface_yuv
输入surface中携带的是raw data。
surface_es
输入surface中携带的是ES data。
支持的音视频编码格式如下:
音视频编码格式
说明
audio/mp4a-latm
音频/mp4a-latm类型
video/mp4v-es
视频/mpeg4类型
video/avc
视频/avc类型
支持的输出文件格式如下:
输出文件格式
说明
mp4
视频的容器格式,MP4。
m4a
音频的容器格式,M4A。

音频播放

音频播放开发概述

如何选择音频播放开发方式
在HarmonyOS系统中,多种API都提供了音频播放开发的支持,不同的API适用于不同音频数据格式、音频资源来源、音频使用场景,甚至是不同开发语言。因此,选择合适的音频播放API,有助于降低开发工作量,实现更佳的音频播放效果。
  • AVPlayer:功能较完善的音频、视频播放ArkTS/JS API,集成了流媒体和本地资源解析、媒体资源解封装、音频解码和音频输出功能。可以用于直接播放mp3、m4a等格式的音频文件,不支持直接播放PCM格式文件。
  • AudioRenderer:用于音频输出的的ArkTS/JS API,仅支持PCM格式,需要应用持续写入音频数据进行工作。应用可以在输入前添加数据预处理,如设定音频文件的采样率、位宽等,要求开发者具备音频处理的基础知识,适用于更专业、更多样化的媒体播放应用开发。
  • OpenSL ES:一套跨平台标准化的音频Native API,目前阶段唯一的音频类Native API,同样提供音频输出能力,仅支持PCM格式,适用于从其他嵌入式平台移植,或依赖在Native层实现音频输出功能的播放应用使用。
  • 在音频播放中,应用时常需要用到一些急促简短的音效,如相机快门音效、按键音效、游戏射击音效等,当前只能使用AVPlayer播放音频文件替代实现,在HarmonyOS后续版本将会推出相关接口来支持该场景。

使用AVPlayer开发音频播放功能

使用AVPlayer可以实现端到端播放原始媒体资源,本开发指导将以完整地播放一首音乐作为示例,向开发者讲解AVPlayer音频播放相关功能。
播放的全流程包含:创建AVPlayer,设置播放资源,设置播放参数(音量/倍速/焦点模式),播放控制(播放/暂停/跳转/停止),重置,销毁资源。
在进行应用开发的过程中,开发者可以通过AVPlayer的state属性主动获取当前状态或使用on('stateChange')方法监听状态变化。如果应用在音频播放器处于错误状态时执行操作,系统可能会抛出异常或生成其他未定义的行为。
图1
播放状态变化示意图
notion image
状态的详细说明请参考AVPlayerState。当播放处于prepared / playing / paused / completed状态时,播放引擎处于工作状态,这需要占用系统较多的运行内存。当客户端暂时不使用播放器时,调用reset()或release()回收内存资源,做好资源利用。
开发步骤及注意事项
详细的API说明请参考AVPlayer API参考
  1. 创建实例createAVPlayer(),AVPlayer初始化idle状态。
  1. 设置业务需要的监听事件,搭配全流程场景使用。支持的监听事件包括:
    1. 事件类型
      说明
      stateChange
      必要事件,监听播放器的state属性改变。
      error
      必要事件,监听播放器的错误信息。
      durationUpdate
      用于进度条,监听进度条长度,刷新资源时长。
      timeUpdate
      用于进度条,监听进度条当前位置,刷新当前时间。
      seekDone
      响应API调用,监听seek()请求完成情况。 当使用seek()跳转到指定播放位置后,如果seek操作成功,将上报该事件。
      speedDone
      响应API调用,监听setSpeed()请求完成情况。 当使用setSpeed()设置播放倍速后,如果setSpeed操作成功,将上报该事件。
      volumeChange
      响应API调用,监听setVolume()请求完成情况。 当使用setVolume()调节播放音量后,如果setVolume操作成功,将上报该事件。
      bufferingUpdate
      用于网络播放,监听网络播放缓冲信息,用于上报缓冲百分比以及缓存播放进度。
      audioInterrupt
      监听音频焦点切换信息,搭配属性audioInterruptMode使用。 如果当前设备存在多个音频正在播放,音频焦点被切换(即播放其他媒体如通话等)时将上报该事件,应用可以及时处理。
  1. 设置资源:设置属性url,AVPlayer进入initialized状态。
    1. 说明
      下面代码示例中的url仅作示意使用,开发者需根据实际情况,确认资源有效性并设置:
      • 如果使用本地资源播放,必须确认资源文件可用,并使用应用沙箱路径访问对应资源,参考获取应用文件路径。应用沙箱的介绍及如何向应用沙箱推送文件,请参考文件管理
  1. 准备播放:调用prepare(),AVPlayer进入prepared状态,此时可以获取duration,设置音量。
  1. 音频播控:播放play(),暂停pause(),跳转seek(),停止stop() 等操作。
  1. (可选)更换资源:调用reset()重置资源,AVPlayer重新进入idle状态,允许更换资源url。
  1. 退出播放:调用release()销毁实例,AVPlayer进入released状态,退出播放。
完整示例
参考以下示例,完整地播放一首音乐。

多音频播放的并发策略

音频打断策略
多音频并发,即多个音频流同时播放。此场景下,如果系统不加管控,会造成多个音频流混音播放,容易让用户感到嘈杂,造成不好的用户体验。为了解决这个问题,系统预设了音频打断策略,对多音频播放的并发进行管控,只有持有音频焦点的音频流才可以正常播放,避免多个音频流无序并发播放的现象出现。
当应用开始播放音频时,系统首先为相应的音频流申请音频焦点,获得焦点的音频流可以播放;若焦点申请被拒绝,则不能播放。在音频流播放的过程中,若被其他音频流打断,则会失去音频焦点。当音频流失去音频焦点时,只能暂停播放。在应用播放音频的过程中,这些动作均由系统自行完成,无需应用主动触发。但为了维持应用和系统的状态一致性,保证良好的用户体验,推荐应用监听音频打断事件,并在收到音频打断事件(InterruptEvent)时做出相应处理。
为满足应用对多音频并发策略的不同需求,音频打断策略预设了两种焦点模式,针对同一应用创建的多个音频流,应用可通过设置焦点模式,选择由应用自主管控或由系统统一管控。
音频打断策略决定了应该对音频流采取何种操作,如暂停播放、继续播放、降低音量播放、恢复音量播放等,这些操作可能由系统或应用来执行。音频打断策略预置了两种打断类型,用于区分音频打断事件(InterruptEvent)的执行者。
焦点模式
音频打断策略预设了两种焦点模式(InterruptMode):
  • 共享焦点模式(SHARE_MODE):由同一应用创建的多个音频流,共享一个音频焦点。这些音频流之间的并发规则由应用自主决定,音频打断策略不会介入。当其他应用创建的音频流与该应用的音频流并发播放时,才会触发音频打断策略的管控。
  • 独立焦点模式(INDEPENDENT_MODE)应用创建的每一个音频流均会独立拥有一个音频焦点,当多个音频流并发播放时,会触发音频打断策略的管控。
应用可以按需选择合适的焦点模式,在创建音频流时,系统默认采用共享焦点模式,应用可主动设置所需的模式。
设置焦点模式的方法:
打断类型
音频打断策略(包括两种焦点模式)决定了应该对各个音频流采取何种操作,如暂停播放、继续播放、降低音量播放、恢复音量播放等。而针对这些操作的执行过程,根据执行者的不同,可以分为两种打断类型(InterruptForceType):
  • 强制打断类型(INTERRUPT_FORCE):由系统进行操作,强制打断音频播放。
  • 共享打断类型(INTERRUPT_SHARE):由应用进行操作,可以选择打断或忽略。
对于音频打断策略的执行,系统默认采用强制打断类型(INTERRUPT_FORCE),应用无法更改。但对于一些策略(如继续播放等),系统无法强制执行,所以这两种打断类型均可能出现。应用可根据音频打断事件(InterruptEvent)的成员变量forceType的值,获取该事件采用的打断类型。
在应用播放音频的过程中,系统自动为音频流执行申请焦点、持有焦点、释放焦点等动作,当发生音频打断事件时,系统强制对音频流执行暂停、停止、降低音量、恢复音量等操作,并向应用发送音频打断事件(InterruptEvent)回调。由于系统会强制改变音频流状态,为了维持应用和系统的状态一致性,保证良好的用户体验,推荐应用监听音频打断事件,并在收到音频打断事件(InterruptEvent)时做出相应处理。
对于一些系统无法强制执行的操作(例如音频流继续播放的场景),会向应用发送包含了共享打断类型的音频打断事件,由应用自行执行相应操作,此时应用可以选择执行或忽略,系统不会干涉。
监听音频打断事件
在应用播放音频时,推荐应用监听音频打断事件,当音频打断事件发生时,系统会根据预设策略,对音频流做出相应的操作,并针对状态发生改变的音频流,向所属的应用发送音频打断事件。
应用收到音频打断事件后,需根据其内容提示,做出相应的处理,避免出现应用状态与预期效果不一致的问题。
监听音频打断事件的方法:
为了带给用户更好的体验,针对不同的音频打断事件内容,应用需要做出相应的处理操作。此处以使用AudioRenderer开发音频播放功能为例,展示推荐应用采取的处理方法,提供伪代码供开发者参考(若使用AVPlayer开发音频播放功能,处理方法类似),具体的代码实现,开发者可结合实际情况编写,处理方法也可自行调整。

AVSession Kit(音视频播控服务)


AVSession Kit简介

AVSession Kit(Audio & Video Session Kit,音视频播控服务)是系统提供的音视频管控服务,用于统一管理系统中所有音视频行为,帮助开发者快速构建音视频统一展示和控制能力。

能力范围

  • 提供音视频统一管控能力,音视频类应用接入AVSession后,可以发送应用的数据(比如正在播放的歌曲、歌曲的播放状态等),用户可以通过系统播控中心、语音助手等应用切换多个应用、多个设备播放。
  • 提供音频后台约束能力,音频接入AVSession后,可以进行后台音频播放。此功能需要同时申请后台任务。

亮点/特征

  • 投播体验一致
    • 提供音视频统一管控能力,音视频类应用接入AVSession后,可以发送应用的数据(比如正在播放的歌曲、歌曲的播放状态等)。
      用户可以通过系统播控中心、语音助手等应用切换多个应用、多个设备播放。
  • 规范后台播放管理
    • 通过播控中心,应用后台播放可见可控,音视频应用可统一控制。
      系统针对后台播放进行强制管控,未接入AVSession的应用在退到后台时,将会被强制暂停音频播放。解决应用在后台恶意播放,而用户无法找到对应应用无法关闭的问题。

基础概念

在开发前,需要先了解以下基础概念:
  • 媒体会话(AVSession)
    • 媒体会话的一端连接被控的音视频应用,另一端连接音视频应用的控制端(如播控中心、语音助手等)。媒体会话提供了音视频应用和音视频应用控制端之间进行信息交换的通道。
  • 媒体会话提供方
    • 媒体会话提供方指接入媒体会话的音视频应用。音视频应用接入媒体会话后,需要向媒体会话提供播放的媒体信息,例如播放曲目名称、播放状态等。同时,音视频应用需要通过媒体会话接收控制端发出的控制命令并进行正确响应。
  • 媒体会话控制方
    • 媒体会话控制方指接入媒体会话并具有全局管控音视频行为功能的应用,例如系统播控中心、语音助手等。为便于开发者理解,下文将多处使用系统应用播控中心,作为媒体会话控制方举例。播控中心等系统应用接入媒体会话后,可以通过监听媒体会话获取最新的媒体信息,也可以通过媒体会话向音视频应用发出控制命令。
  • 媒体会话控制器(AVSessionController)
    • 媒体会话控制器的持有者,一般指媒体会话控制方,可以控制媒体会话提供方的应用播放行为,也可以获取应用的播放信息,还可以监听音视频应用播放状态的变化,用于确保媒体会话信息在音视频应用和播控中心之间的同步。
  • 媒体会话管理器(AVSessionManager)
    • 媒体会话管理器提供了管理媒体会话的能力,可以创建媒体会话、创建媒体会话控制器、发送系统控制事件,也支持对媒体会话的状态进行监听。

媒体会话交互过程

媒体会话分为本地和分布式两种场景。
notion image
  • 本地媒体会话
    • 本地媒体会话在本地设备中的媒体会话提供方和媒体会话控制方之间建立连接,实现系统中音视频应用统一的媒体播放控制和媒体信息显示。
  • 分布式媒体会话
    • 分布式媒体会话在跨设备场景中的媒体会话提供方和媒体会话控制方之间建立连接,实现音视频应用跨设备的媒体播放控制和媒体信息显示。例如,将设备A中播放的内容投播到设备B,并在设备B中进行播放控制。

约束和限制

所有需要进行后台播放的音视频应用,都需要同时接入AVSession和后台任务管理,未接入的应用在退到后台时,将会被强制暂停音频播放。

与相关Kit的关系

应用实现后台播放时,需要使用BackgroundTasks Kit(后台任务管理)的能力,申请对应的长时任务,避免进入挂起(Suspend)状态。
 

图片


图片开发概述

应用开发中的图片开发是对图片像素数据进行解析、处理、构造的过程,达到目标图片效果,主要涉及图片解码、图片处理、图片编码等。
 

相关概念

  • 图片解码
指将所支持格式的存档图片解码成统一的PixelMap,以便在应用或系统中进行图片显示或图片处理。当前支持的存档图片格式包括JPEG、PNG、GIF、RAW、WebP、BMP、SVG。
  • PixelMap
指图片解码后无压缩的位图,用于图片显示或图片处理。
  • 图片处理
指对PixelMap进行相关的操作,如旋转、缩放、设置透明度、获取图片信息、读写像素数据等。
  • 图片编码
指将PixelMap编码成不同格式的存档图片(当前仅支持JPEG和WebP),用于后续处理,如保存、传输等。
 

开发流程

notion image
 
1、获取图片:通过应用沙箱等方式获取原始图片。
2、创建ImageSource实例:ImageSource是图片解码出来的图片源类,用于获取或修改图片相关信息。
3、图片解码:通过ImageSource解码生成PixelMap。
4、图片处理:对PixelMap进行处理,更改图片属性实现图片的旋转、缩放、裁剪等效果。然后通过Image组件显示图片。
5、图片编码:使用图片打包器类ImagePacker,将PixelMap或ImageSource进行压缩编码,生成一张新的图片。
 

图片解码

图片解码指将所支持格式的存档图片解码成统一的PixelMap,以便在应用或系统中进行图片显示或图片处理。当前支持的存档图片格式包括JPEG、PNG、GIF、RAW、WebP、BMP、SVG。

图像变化

图片处理指对PixelMap进行相关的操作,如获取图片信息、裁剪、缩放、偏移、旋转、翻转、设置透明度、读写像素数据等。图片处理主要包括图像变换、位图操作。

位图操作

当需要对目标图片中的部分区域进行处理时,可以使用位图操作功能。此功能常用于图片美化等操作。
如下图所示,一张图片中,将指定的矩形区域像素数据读取出来,进行修改后,再写回原图片对应区域。
notion image

图片编码

图片编码指将PixelMap编码成不同格式的存档图片(当前仅支持打包为JPEG和WebP格式),用于后续处理,如保存、传输等。

图片工具

图片工具当前主要提供图片EXIF信息的读取与编辑能力。
EXIF(Exchangeable image file format)是专门为数码相机的照片设定的文件格式,可以记录数码照片的属性信息和拍摄数据。当前仅支持JPEG格式图片
在图库等应用中,需要查看或修改数码照片的EXIF信息。由于摄像机的手动镜头的参数无法自动写入到EXIF信息中或者因为相机断电等原因经常会导致拍摄时间出错,这时候就需要手动修改错误的EXIF数据,即可使用本功能。
HarmonyOS目前仅支持对部分EXIF信息的查看和修改。
 

Camera Kit(相机服务)


Camera Kit简介

开发者通过调用Camera Kit(相机服务)提供的接口可以开发相机应用,应用通过访问和操作相机硬件,实现基础操作,如预览、拍照和录像;还可以通过接口组合完成更多操作,如控制闪光灯和曝光时间、对焦或调焦等。

开发场景

当开发者需要开发一个相机应用(或是在应用内开发相机模块)时,可参考以下开发模型了解相机的工作流程,进而开发相机应用,具体可参考相机开发指导
如果开发者仅是需要拉起系统相机拍摄一张照片、录制一段视频,可直接使用CameraPicker,无需申请相机权限,直接拉起系统相机完成拍摄,具体可参考Camera Picker

开发模型

相机调用摄像头采集、加工图像视频数据,精确控制对应的硬件,灵活输出图像、视频内容,满足多镜头硬件适配(如广角、长焦、TOF)、多业务场景适配(如不同分辨率、不同格式、不同效果)的要求。
相机的工作流程如图所示,可概括为相机输入设备管理、会话管理和相机输出管理三部分。
  • 相机设备调用摄像头采集数据,作为相机输入流。
  • 会话管理可配置输入流,即选择哪些镜头进行拍摄。另外还可以配置闪光灯、曝光时间、对焦和调焦等参数,实现不同效果的拍摄,从而适配不同的业务场景。应用可以通过切换会话满足不同场景的拍摄需求。
  • 配置相机的输出流,即将内容以预览流、拍照流或视频流输出。
图1 相机工作流程
notion image
了解相机工作流程后,建议开发者了解相机的开发模型,便于更好地开发相机应用。
图2 相机开发模型
notion image
相机应用通过控制相机,实现图像显示(预览)、照片保存(拍照)、视频录制(录像)等基础操作。在实现基本操作过程中,相机服务会控制相机设备采集和输出数据,采集的图像数据在相机底层的设备硬件接口(HDI,Hardware Device Interfaces),直接通过BufferQueue传递到具体的功能模块进行处理。BufferQueue在应用开发中无需关注,用于将底层处理的数据及时送到上层进行图像显示。
以视频录制为例进行说明,相机应用在录制视频过程中,媒体录制服务先创建一个视频Surface用于传递数据,并提供给相机服务,相机服务可控制相机设备采集视频数据,生成视频流。采集的数据通过底层相机HDI处理后,通过Surface将视频流传递给媒体录制服务,媒体录制服务对视频数据进行处理后,保存为视频文件,完成视频录制。

开发准备

相机应用开发的主要流程包含开发准备、设备输入、会话管理、预览、拍照和录像等。
在开发相机应用时,需要先申请相机相关权限,确保应用拥有访问相机硬件及其他功能的权限,需要的权限如下表。在申请权限前,请保证符合权限使用的基本原则
权限名
说明
授权方式
ohos.permission.CAMERA
允许应用使用相机拍摄照片和录制视频。
user_grant
ohos.permission.MICROPHONE
允许应用使用麦克风(可选)。 如需同时录制音频,需要申请该权限。
user_grant
ohos.permission.WRITE_MEDIA
允许应用读写用户外部存储中的媒体文件信息(可选)。
user_grant
ohos.permission.READ_MEDIA
允许应用读取用户外部存储中的媒体文件信息(可选)。
user_grant
ohos.permission.MEDIA_LOCATION
允许应用访问用户媒体文件中的地理位置信息(可选)。
user_grant
以上权限的授权方式均为user_grant(用户授权),即开发者在module.json5文件中配置对应的权限后,需要使用接口abilityAccessCtrl.requestPermissionsFromUser去校验当前用户是否已授权。如果是,应用可以直接访问/操作目标对象;否则需要弹框向用户申请授权。
具体申请方式及校验方式,请参考向用户申请授权
说明
即使用户曾被授予过权限,应用在调用此权限保护的接口前,也应该先检查是否有权限。不能把之前授予的状态持久化,因为用户在动态授予后可能通过“设置”取消应用权限
开发指导
当前相机提供了ArkTS和C++两种开发语言的开发指导,如下表所示。
开发流程
ArkTS开发指导
C++开发指导
设备输入
会话管理
预览
预览流二次处理
-
拍照
分段式拍照
-
动态照片
-
录像
元数据
Loading...
Koreyoshi
Koreyoshi
一个无可救药的乐观主义者
Latest posts
软件测试:集成测试
2025-3-25
软件测试:控制流测试
2025-3-25
软件测试:系统测试
2025-3-25
软件测试:数据流测试
2025-3-25
软件测试:测试驱动开发
2025-3-25
软件工程:面向对象的概念和记号
2025-3-24
Announcement
🎉写给自己的2025心愿🎉
保研
国奖
完善博客
学一门乐器
发表一篇论文
拍摄人生照片
去3个城市旅游
专业课知识视频
拍摄毕业季视频
----- 2025 ------
👏希望我们一起变好👏