鸿蒙媒体开发系列03——AVPlayer和AVRecorder概述

 如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。

1、概述

本期我们初步讨论音视频资源的播放与录制相关能力 —— AVPlayer & AVRecorder。

👉🏻 AVPlayer主要工作是将Audio/Video媒体资源(比如mp4/mp3/mkv/mpeg-ts等)转码为可供渲染的图像和可听见的音频模拟信号,并通过输出设备进行播放。

👉🏻 AVRecorder主要工作是捕获音频信号,接收视频信号,完成音视频编码并保存到文件中。

2、AVPlayer

AVPlayer主要工作是将Audio/Video媒体资源(比如mp4/mp3/mkv/mpeg-ts等)转码为可供渲染的图像和可听见的音频模拟信号,并通过输出设备进行播放。

AVPlayer提供功能完善一体化播放能力,应用只需要提供流媒体来源,不负责数据解析和解码就可达成播放效果。

2.1、音频播放

当使用AVPlayer开发音乐应用播放音频时,其交互关系如下图(图1)所示。

图片

音乐类应用通过调用JS接口层提供的AVPlayer接口实现相应功能时,框架层会通过播放服务(Player Framework)将资源解析成音频数据流(PCM),音频数据流经过软件解码后输出至音频服务(Audio Framework),由音频服务输出至音频驱动渲染,实现音频播放功能。完整的音频播放需要应用、Player Framework、Audio Framework、音频HDI共同实现。

上图中,数字标注表示需要数据与外部模块的传递。

  1. 音乐应用将媒体资源传递给AVPlayer接口。

  2. Player Framework将音频PCM数据流输出给Audio Framework,再由Audio Framework输出给音频HDI。

2.2、视频播放

当使用AVPlayer开发视频应用播放视频时,其交互关系如图(图2)所示。

图片

应用通过调用JS接口层提供的AVPlayer接口实现相应功能时,框架层会通过播放服务(Player Framework)解析成单独的音频数据流和视频数据流,音频数据流经过软件解码后输出至音频服务(Audio Framework),再至硬件接口层的音频HDI,实现音频播放功能。视频数据流经过硬件(推荐)/软件解码后输出至图形渲染服务(Graphic Framework),再输出至硬件接口层的显示HDI,完成图形渲染。

完整的视频播放需要:应用、XComponent、Player Framework、Graphic Framework、Audio Framework、显示HDI和音频HDI共同实现。

上图中,数字标注表示需要数据与外部模块的传递。

  1. 应用从XComponent组件获取窗口SurfaceID。

  2. 应用把媒体资源、SurfaceID传递给AVPlayer接口。

  3. Player Framework把视频ES数据流输出给解码HDI,解码获得视频帧(NV12/NV21/RGBA)。

  4. Player Framework把音频PCM数据流输出给Audio Framework,Audio Framework输出给音频HDI。

  5. Player Framework把视频帧(NV12/NV21/RGBA)输出给Graphic Framework,Graphic Framework输出给显示HDI。

2.3、支持的格式与协议

推荐使用以下主流的播放格式,音视频容器、音视频编码属于内容创作者所掌握的专业领域,不建议应用开发者自制码流进行测试,以免产生无法播放、卡顿、花屏等兼容性问题。若发生此类问题不会影响系统,退出播放即可。

支持的协议如下:

图片

支持的音频播放格式如下:

图片

注意:

视频播放支持的视频格式分为必选规格和可选规格。必选规格为所有设备均支持的视频格式。对于可选规格,不同设备的实际实现不同。建议开发者做对应的兼容处理,保证应用功能全平台兼容。

图片

支持的视频播放格式和主流分辨率如下:

图片

一个简单的示例(创建一个AVPlayer):

import media from '@ohos.multimedia.media';// ...let avPlayer;media.createAVPlayer((error, video) => {  if (video != null) {    avPlayer = video;    console.info('createAVPlayer success');  } else {    console.error(`createAVPlayer fail, error message:${error.message}`);  }});// ...

AVPlayer的属性一览如下:

图片

👉🏻 AVPlayer涉及到的接口和属性较多,篇幅原因,我们后续再讨论具体的接口。

3、AVRecorder

AVRecorder主要工作是捕获音频信号,接收视频信号,完成音视频编码并保存到文件中,帮助开发者轻松实现音视频录制功能,包括开始录制、暂停录制、恢复录制、停止录制、释放资源等功能控制。它允许调用者指定录制的编码格式、封装格式、文件路径等参数。如下图

图片

  • 音频录制:应用通过调用JS接口层提供的AVRecorder接口实现音频录制时,框架层会通过录制服务(Player Framework),调用音频服务(Audio Framework)通过音频HDI捕获音频数据,通过软件编码封装后保存至文件中,实现音频录制功能。

  • 视频录制:应用通过调用JS接口层提供的AVRecorder接口实现视频录制时,先通过Camera接口调用相机服务(Camera Framework)通过视频HDI捕获图像数据送至框架层的录制服务,录制服务将图像数据通过视频编码HDI编码,再将编码后的图像数据封装至文件中,实现视频录制功能。

说明

AVRecorder只负责视频数据的处理,需要与视频数据采集模块配合才能完成视频录制。视频数据采集模块需要通过Surface将视频数据传递给AVRecorder进行数据处理。

当前常用的数据采集模块为相机模块,相关说明以相机举例,相机模块目前仅对系统应用开放。

通过音视频录制组合,可分别实现纯音频录制、纯视频录制,音视频录制。

上图中,数字标注表示需要数据与外部模块的传递。

  1. 应用通过AVRecorder接口从录制服务获取SurfaceID。

  2. 应用将SurfaceID设置给相机服务,相机服务可以通过SurfaceID获取到Surface。相机服务通过视频HDI捕获图像数据送至框架层的录制服务。

  3. 相机服务通过Surface将视频数据传递给录制服务。

  4. 录制服务通过视频编码HDI模块将视频数据编码。

  5. 录制服务将音频参数设置给音频服务,并从音频服务获取到音频数据。

3.1、支持的格式

支持的音频源如下:

图片

支持的视频源如下:

图片

支持的音视频编码格式如下:

图片

支持的输出文件格式如下:

图片

一个简单的示例(创建一个AVRecorder):​​​​​​​

import media from '@ohos.multimedia.media';// ... let avRecorder;media.createAVRecorder((error, recorder) => {  if (recorder != null) {    avRecorder = recorder;    console.info('createAVRecorder success');  } else {    console.error(`createAVRecorder fail, error message:${error.message}`);  }});// ...

👉🏻 AVRecorder涉及的方法较多,篇幅原因,我们后续逐步展开说明。这里仅仅是做个概览串连。

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

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

相关文章

数字经济指数合集

数字经济指数合集 随着信息技术的快速发展,数字经济已成为推动全球经济增长的重要力量。在中国,数字经济的发展尤为迅速,不仅促进了产业结构优化升级,还提升了社会治理效能。为了更好地衡量各地数字经济的发展水平,一…

工厂模式,策略模式,代理模式,单例模式在项目中的应用

项目背景: 首先这篇文章是总结了OJ项目和AI答题平台项目(和一点点的聚合搜索项目)中设计模式的文章 在项目中也用了很多次的设计模式,我感觉起来,这些设计模式的作用就是提高项目的扩展性和降低耦合性 工厂模式&…

视频语音转成文字用什么工具?这4款就很不错!

如今视频语音已经可以帮助我们在短时间内或去很多信息,在办公,学习教育,影视娱乐方面可以帮助我们高效的进行记录。当我们需要文字化的整理时,就会需要转换的工具。这片文章遍要罗列4款我在办公室用到的几款比较高效准确的视频语音…

原来石岩也有羊台山登山口

带娃探寻家附近的好玩的,娃问:石岩湿地公园的水从哪里来的?我说可能是羊台山吧,我们可以随着河流去找下啊。其实我内心也是没底的,我去的羊台山都是从龙华的羊台山东地铁下车去的。 骑行的好处就是可以松弛感看风景&a…

犬类检测系统源码分享

犬类检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

C++ | (二)类与对象(上)

燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,你告诉我,我们的假期为什么一去不复返呢? 目录 一、初识类 1.1 类的定义 1.2 C中…

在petalinux工程里添加iperf

在petalinux工程里添加iperf 1,首先确定iperf包在哪里 xxx/components/yocto/layer/ meta-openembedded/meta-oe/recipes-benchmark/iperf3/ 2,然后就是往menuconfig中加: xxx/project-spec/meta-user/conf/user-rootfsconfig文件中 添加: …

maxcompute使用篇

文章目录 maxcompute使用篇1.mongoDB与maxcompute 进行数据同步1.1 基本类型的数据1.2部分复杂类型的数据 2.maxcompute中复杂数据类型解析2.1 get_json_object2.2 json_tuple2.3 处理json几种失效的情况:2.4 STR_TO_MAP、MAP_KEYS2.5 regexp_replace2.6 FROM_JSON2.7 nvl2.8 t…

高级I/O知识分享【epoll || Reactor ET,LT模式】

博客主页:花果山~程序猿-CSDN博客 文章分栏:Linux_花果山~程序猿的博客-CSDN博客 关注我一起学习,一起进步,一起探索编程的无限可能吧!让我们一起努力,一起成长! 目录 一,接口 epo…

ElasticSearch-2-核心语法集群高可用实战-Week2

ES批量操作 1.批量获取文档数据 这里多个文档是指,批量操作多个文档,搜索查询文档将在之后的章节讲解 批量获取文档数据是通过_mget的API来实现的 (1)在URL中不指定index和type 请求方式:GET 请求地址:_mget 功能说明 &#…

12 Java文件处理之写入、读取:IO流(中):高级流(缓冲流、转换流、序列化流和反序列化流、打印流)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、缓冲流1 字节缓冲流(1)BufferedInputStream:字节缓冲输入流构造方法---- BufferedInputStream(InputStream in):创建一个使用默认缓冲区大小的缓冲输入流。---- BufferedInputStream(In…

【浅水模型MATLAB】尝试复刻SCI论文中的溃坝流算例

【浅水模型MATLAB】尝试复刻SCI论文中的溃坝流算例 前言问题描述控制方程及数值方法浅水方程及其数值计算方法边界条件的实现 代码框架与关键代码模拟结果 更新于2024年9月17日 前言 这篇博客算是学习浅水方程,并利用MATLAB复刻Liang (2004)1中溃坝流算例的一个记录…

特殊文本文件日志技术重点笔记。

特殊文本文件,日志技术(黑马 一套入门 3h) 特殊文件 日志技术 把程序运行的信息,记录到文件中,方便程序员定位bug,并了解程序的执行情况等。 1.为什么要用这些特殊文件 1.1存储单个用户的: 用户名,密码 1.2存储多个用户的&…

数据清洗-缺失值填充-XGboost算法填充

目录 一、安装所需的python包二、采用XGboost算法进行缺失值填充2.1可直接运行代码2.2以某个缺失值数据进行实战2.2.1 代码运行过程截屏:2.2.2 填充后的数据截屏: 三、XGBoost算法原理介绍3.1 XGBoost 的定义3.2 XGBoost 的核心思想3.3 XGBoost 的特点3.…

2024 批量下载知乎回答/文章/想法/专栏/视频/收藏夹,导出 excel 和 pdf

之前分享过文章 2024批量下载知乎回答文章想法专栏收藏夹,公众号文章内容图片封面视频音频,微博内容图片视频评论转发数据,导出excel和pdf ,今天再整理分享下知乎知乎回答/文章/想法/专栏/视频/收藏夹下载。 苏生不惑 这个账号已…

Jenkins基于tag的构建

文章目录 Jenkins参数化构建设置设置gitlab tag在工程中维护构建的版本按指定tag的版本启动服务 Jenkins参数化构建设置 选择参数化构建: 在gradle构建之前,增加执行shell的步骤: 把新增的shell框挪到gradle构建之前, 最后保存 …

驱动器磁盘未格式化难题:深度剖析与恢复实践

驱动器磁盘未格式化的深层探索 在数据存储与管理的日常中,驱动器作为我们数字生活的基石,其稳定性直接关系到数据的安全与可用性。然而,当屏幕上赫然出现“驱动器中的磁盘未被格式化”的提示时,许多用户往往感到手足无措&#xf…

Linux 文件与目录操作命令详解

文章目录 前言创建文件1. touch2. vim 文件内容显示3. cat4. more5. less6. head7. tail 文件(目录)复制、删除和移动8. cp9. rm10. mv 压缩文件与解压缩11. gzip12. zip 和 unzip 创建目录13. mkdir 删除目录14. rmdir 改变工作目录15. cd16. pwd 显示目…

【C语言】联合体枚举的讲解

目录 ✨声明!!!: 联合体与结构体只有一个区别,那就是内存存储方式不同 💕1.联合体的声明 💕2.联合体内存的存储 💕3.联合体字节大小的计算 例题2: ✨4.枚举的声明…

全面掌握 Jest:从零开始的测试指南(下篇)

在上一篇测试指南中,我们介绍了Jest 的背景、如何初始化项目、常用的匹配器语法以及钩子函数的使用。这一篇篇将继续深入探讨 Jest 的高级特性,包括 Mock 函数、异步请求的处理、Mock 请求的模拟、类的模拟以及定时器的模拟、snapshot 的使用。通过这些技…