【鸿蒙实战开发】HarmonyOS文件解析封装

【鸿蒙开发保姆级教程】-HarmonyOS NEXT请求库封装 通过上面的几个例子,我们大概学习了在新的版本怎么自定义一个自己的请求库。新的请求库基本满足我们的日常使用,同时也兼顾了一些我们的扩展需求。如果有更多的需要,我们也可以在这个基础上再增加额外的函数来满足我们的需要。有很多小伙伴不知道该从哪里开始学习鸿蒙开发技术?也不知道鸿蒙开发的知识点重点掌握的又有哪些?自学时频繁踩坑,导致浪费大量时间。结果还是一知半解。所以有一份实用的鸿蒙(HarmonyOS NEXT)全栈开发资料用来跟着学习是非常有必要的。 阅读详情

音视频封装

开发者可以调用本模块的Native API接口,完成音视频封装,即将音频、视频等编码后的媒体数据,按一定的格式存储到文件里。

当前支持的封装能力如下:

封装格式 视频编解码类型 音频编解码类型 封面类型
mp4 AVC(H.264)、HEVC(H.265) AAC、MPEG(MP3) jpeg、png、bmp
m4a - AAC jpeg、png、bmp
mp3 - MPEG(MP3) -
amr - AMR -

如果需要对HDRVivid视频码流进行封装,需要配置MimeType为H265 (OH_AVCODEC_MIMETYPE_VIDEO_HEVC),本功能从API version 11开始支持。

适用场景

  • 录像、录音

    保存录像、录音文件时,需要先对音视频流进行编码,再封装为文件。

  • 音视频编辑

    完成编辑后的音视频,需要封装为文件。

  • 音视频转码

    转码后,保存文件时需要封装。

开发指导

详细的API说明请参考API文档。

说明

如果调用封装能力写本地文件,需要向用户申请授权:ohos.permission.READ_MEDIA, ohos.permission.WRITE_MEDIA

在 CMake 脚本中链接动态库

target_link_libraries(sample PUBLIC libnative_media_avmuxer.so)
target_link_libraries(sample PUBLIC libnative_media_core.so)

开发步骤

参考以下示例代码,完成音视频封装的全流程。以封装mp4格式的音视频文件为例。

  1. 添加头文件。
#include <multimedia/player_framework/native_avmuxer.h>
#include <multimedia/player_framework/native_avcodec_base.h>
#include <multimedia/player_framework/native_avformat.h>
#include <multimedia/player_framework/native_avbuffer.h>
#include <fcntl.h>
  1. 调用OH_AVMuxer_Create()创建封装器实例对象。
// 设置封装格式为mp4
OH_AVOutputFormat format = AV_OUTPUT_FORMAT_MPEG_4;
// 以读写方式创建fd
int32_t fd = open("test.mp4", O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR);
OH_AVMuxer *muxer = OH_AVMuxer_Create(fd, format);
  1. (可选)调用OH_AVMuxer_SetRotation()设置旋转角度。
// 旋转角度,视频画面需要旋转的时候设置
OH_AVMuxer_SetRotation(muxer, 0);
  1. 添加音频轨。

    方法一:用OH_AVFormat_Create创建format

int audioTrackId = -1;
uint8_t *buffer = ...; // 编码config data,如果没有可以不传
size_t size = ...;  // 编码config data的长度,根据实际情况配置
OH_AVFormat *formatAudio = OH_AVFormat_Create();
OH_AVFormat_SetStringValue(formatAudio, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_AUDIO_AAC); // 必填
OH_AVFormat_SetIntValue(formatAudio, OH_MD_KEY_AUD_SAMPLE_RATE, 44100); // 必填
OH_AVFormat_SetIntValue(formatAudio, OH_MD_KEY_AUD_CHANNEL_COUNT, 2); // 必填
OH_AVFormat_SetIntValue(formatAudio, OH_MD_KEY_PROFILE, AAC_PROFILE_LC); // 选填
OH_AVFormat_SetBuffer(formatAudio, OH_MD_KEY_CODEC_CONFIG, buffer, size); // 选填

int ret = OH_AVMuxer_AddTrack(muxer, &audioTrackId, formatAudio);
if (ret != AV_ERR_OK || audioTrackId < 0) {
    // 音频轨添加失败
}
OH_AVFormat_Destroy(formatAudio); // 销毁

方法二:用OH_AVFormat_CreateAudioFormat创建format

int audioTrackId = -1;
uint8_t *buffer = ...; // 编码config data,如果没有可以不传
size_t size = ...;  // 编码config data的长度,根据实际情况配置
OH_AVFormat *formatAudio = OH_AVFormat_CreateAudioFormat(OH_AVCODEC_MIMETYPE_AUDIO_AAC, 44100, 2);
OH_AVFormat_SetIntValue(formatAudio, OH_MD_KEY_PROFILE, AAC_PROFILE_LC); // 选填
OH_AVFormat_SetBuffer(formatAudio, OH_MD_KEY_CODEC_CONFIG, buffer, size); // 选填

int ret = OH_AVMuxer_AddTrack(muxer, &audioTrackId, formatAudio);
if (ret != AV_ERR_OK || audioTrackId < 0) {
    // 音频轨添加失败
}
OH_AVFormat_Destroy(formatAudio); // 销毁
  1. 添加视频轨。

    方法一:用OH_AVFormat_Create创建format

int videoTrackId = -1;
uint8_t *buffer = ...; // 编码config data,如果没有可以不传
size_t size = ...;  // 编码config data的长度,根据实际情况配置
OH_AVFormat *formatVideo = OH_AVFormat_Create();
OH_AVFormat_SetStringValue(formatVideo, OH_MD_KEY_CODEC_MIME, OH_AVCODEC_MIMETYPE_VIDEO_AVC); // 必填
OH_AVFormat_SetIntValue(formatVideo, OH_MD_KEY_WIDTH, 1280); // 必填
OH_AVFormat_SetIntValue(formatVideo, OH_MD_KEY_HEIGHT, 720); // 必填
OH_AVFormat_SetBuffer(formatVideo, OH_MD_KEY_CODEC_CONFIG, buffer, size); // 非必须

int ret = OH_AVMuxer_AddTrack(muxer, &videoTrackId, formatVideo);
if (ret != AV_ERR_OK || videoTrackId < 0) {
    // 视频轨添加失败
}
OH_AVFormat_Destroy(formatVideo); // 销毁
**方法二:用OH_AVFormat_CreateVideoFormat创建format**
int videoTrackId = -1;
uint8_t *buffer = ...; // 编码config data,如果没有可以不传
size_t size = ...;  // 编码config data的长度,根据实际情况配置
OH_AVFormat *formatVideo = OH_AVFormat_CreateVideoFormat(OH_AVCODEC_MIMETYPE_VIDEO_AVC, 1280, 720);
OH_AVFormat_SetBuffer(formatVideo, OH_MD_KEY_CODEC_CONFIG, buffer, size); // 非必须

int ret = OH_AVMuxer_AddTrack(muxer, &videoTrackId, formatVideo);
if (ret != AV_ERR_OK || videoTrackId < 0) {
    // 视频轨添加失败
}
OH_AVFormat_Destroy(formatVideo); // 销毁
【鸿蒙实战开发】媒体开发-视频编码详解 开发者可以调用本模块的Native API接口,完成视频编码,即将未压缩的视频数据压缩成视频码流 阅读详情

相关推荐

【鸿蒙】安装DevEco Studio运行HarmonyOS第一个APP(小白必看)

鸿蒙OS是华为公司开发的一款基于微内核、耗时10年、4000多名研发人员投入开发、面向5G物联网 、面向全场景的分布式操作系统。鸿蒙的英文名是HarmonyOS,意为和谐。这个新的操作系统将打通手机、电脑、平板、电视、工业自动化控制、无人驾驶 、车机设备、智能穿戴统一成一个操作系统,并且该系统是面向下一代技术而设计的,能兼容全部安卓应用的所有Web应用。HarmonyOS提供一系列构建全场景应用的完整平台工具链与生态体系:分布式应用框架能够将复杂的设备间协同封装成简单接口,实现跨设备应用协同。

IT里的交易员-博客 7017

【鸿蒙教程】华为HarmonyOS NEXT 应用开发 实现日常提醒应用

主要依据tab组件以及tab 组件的BottomTabBarStyle的构造函数。首页page/MinePage.ets代码如下@Entry@Component// 构造类 自定义底部切换按钮Column() {.width(24)build() {Column() {HomeTabs();//首页}.tabBar(this.TabBuilder(0,$r('app.media.ic_home'),$r('app.media.ic_home_selected'),'首页'))

HarmonyOS_001的博客 1816

HarmonyOS 鸿蒙AVSession开发指导

AVSession的所有接口均为系统接口,其功能仅提供给系统应用使用。

2401_83048197的博客 1677

鸿蒙(HarmonyOS)应用开发实战——全局弹窗封装案例

本示例介绍两种弹窗的封装案例。一种是自定义弹窗封装成自定义组件的方式,使用一句代码即可控制显示;一种是使用子窗口的方式实现弹窗,使用一句代码即可展示。

CTrup的博客 1164

【鸿蒙开发实战】HarmonyOS装饰详解

调用的时候可以直接使用this.function()使用自定义组件内@Builder方法个数不限制,可以在build()函数内调用,也可以在其他自定义函数,但是不能在组件外调用。使用方法GlobalBuilderFunction()可以被整个应用获取,不允许使用this和bind方法。如果不涉及组件状态变化,建议使用全局自定义构建方法我们可以理解为这个装饰器可以把我们开发中组件重复的样式设置代码进行抽离成一个方法。语法。

HarmonyOS_001的博客 812

《HarmonyOS实战——前端开发华为鸿蒙系统应用 OpenHarmony JS》

导读:一款“面向未来”、面向全场景(移动办公、运动健康、社交通信、媒体娱乐等)的分布式操作系统 。现已开源,名为 OpenHarmony。2019 年 8 月 9 日,华为在 HDC 开发...

孙叫兽的博客 1万+

5分钟搞定Google Custom Search API申请:从注册到获取CX Key全流程

本文详细介绍了如何快速申请和配置Google Custom Search API,从Google Cloud项目创建、启用计费、获取API Key,到在Programmable Search Engine控制台创建自定义搜索引擎并获取关键的CX Key,提供了全流程实战指南。文章还包含安全配置建议、API调用测试方法及前端与后端的集成代码示例,帮助开发者高效实现网站或应用的智能搜索功能。

weixin_29227585的博客 1637

常见的AXI总线仲裁器概述-AXI协议理解(一)

SoC 设计广泛采用共享总线式的片上通信,其中的仲裁器是共享总线的关键技术之一。AMBA AXI 总线协议以高性能、高频率的系统设计为目标,适合高带宽、低延迟的系统设计,可以达到高频率的操作而不需要复杂的总线桥,满足众多部件的接口要求,具备高度灵活的互联结构,并且向后兼容 AHB 和 APB 接口。

Paul 安的博客 1万+

别再让电池充不满!用CN3791芯片设计太阳能充电电路,这几个调试坑我帮你踩了

本文详细解析了使用CN3791芯片设计太阳能充电电路时的常见调试问题及解决方案。从RCS电阻的选择到MPPT电压偏差的修正,再到线路损耗和温度补偿的优化,提供了全面的避坑指南。通过实测数据和优化方案,帮助工程师提升锂电池充电效率,确保太阳能充电电路的稳定性和可靠性。

weixin_42528191的博客 227

VMD分子可视化实战:5个隐藏技巧让你的科研图像秒变顶刊级别

本文深入探讨了VMD分子可视化软件在科研图像美化中的5个高阶技巧,旨在帮助研究者将分子结构图提升至顶刊级别。内容涵盖原子色彩与材质的艺术化定制、沉浸式分子环境构建、专业构图与视角控制、数据驱动的动态可视化以及自动化工作流建立,通过精细的色彩映射、光照调整、周期性边界展示和脚本自动化,显著增强图像的科学叙事性与视觉冲击力。

weixin_29240343的博客 412

nvlddmkm事件ID14报错排查全指南:从找不到描述到显卡驱动崩溃

系统日志中的“无法找到描述”往往让人一头雾水,但这类提示其实隐藏着驱动故障的关键线索。Windows事件查看器通过事件源和ID记录系统异常,其中显卡驱动相关的内核模式驱动组件一旦超时失败,就会触发TDR机制,产生13、14、153等不同事件ID。理解这些ID的含义,比纠结“找不到描述”本身更重要。对于频繁出现的驱动崩溃问题,可以从日志频率和发生场景判断方向,再通过安全模式下彻底清理驱动、关闭冲突软件、检查供电和温度等步骤逐层定位。无论是游戏满载黑屏,还是睡眠唤醒后闪退,掌握NVIDIA驱动日志的解读逻辑,都

weixin_30545945的博客 346

《UDS协议从入门到精通》系列——图解0x27:安全访问

什么是安全访问服务?应用场景和基本原理是什么?全网最直观详细的图解UDS-0x27:安全访问服务!!

车载系统攻城狮 7204

YOLOv8【第十章:多任务扩展深度篇·第16节】车道线检测——基于 YOLOv8-Seg 的车道线分割与拟合!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 1万+

电容式三点式振荡电路/电感式三点振荡电路基础知识及Multisim电路仿真

摘要:三极管振荡电路利用放大特性与正反馈实现自激振荡,需满足巴克豪森条件(增益≥1,相位匹配)。核心由放大级、反馈网络、选频网络和稳幅环节构成。主要分为三类:1)LC/RC正弦波振荡电路(如电容三点式、电感三点式),输出高频/低频正弦波;2)多谐振荡电路,通过电容充放电产生方波;3)张弛振荡电路,生成锯齿波等。设计需关注相位匹配、增益控制和元件适配。LC振荡频率由谐振参数决定,RC振荡由时间常数控制。稳幅机制通过非线性或主动元件维持等幅输出。该电路在信号发生、时钟源等领域有广泛应用。

XU157303764的博客 2013

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

上一篇: 【红霉素实战开发】HarmonyOS-HDR Vivid能力详解
下一篇: 【鸿蒙实战开发】HarmonyOS本地媒体会话
普通网友
博客等级 码龄2年 2835粉丝 200原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值