【鸿蒙实战开发】媒体开发-视频编码详解

【HarmonyOS实战开发】媒体开发之视频解码 开发者可以调用本模块的Native API接口,完成视频解码,即将媒体数据解码成YUV文件或送显。 阅读详情

开发者可以调用本模块的Native API接口,完成视频编码,即将未压缩的视频数据压缩成视频码流。

当前支持的编码能力如下:

image.png

目前仅支持硬件编码,基于MimeType创建编码器时,支持配置为H264 (OH_AVCODEC_MIMETYPE_VIDEO_AVC) 和 H265 (OH_AVCODEC_MIMETYPE_VIDEO_HEVC)。

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

通过视频编码,应用可以实现以下重点能力,包括:
image.png

限制约束

  1. buffer模式不支持10bit的图像数据。
  2. 由于硬件编码器资源有限,每个编码器在使用完毕后都必须调用OH_VideoEncoder_Destroy()函数来销毁实例并释放资源。
  3. 在调用Flush,Reset,Stop的过程中,开发者不应对之前回调函数获取到的OH_AVBuffer继续进行操作。

Surface输入与Buffer输入

  1. 两者的数据来源不同。

  2. 两者的适用场景不同。

  • Surface输入是指用OHNativeWindow来传递输入数据,可以与其他模块对接,例如相机模块。
  • Buffer输入是指有一块预先分配好的内存区域,调用者需要将原始数据拷贝进这块内存区域中。更适用于从文件中读取视频数据等场景。
  1. 在接口调用的过程中,两种方式的接口调用方式基本一致,但存在以下差异点:
  • Buffer模式下,应用调用OH_VideoEncoder_PushInputBuffer()输入数据;Surface模式下,应用应在编码器就绪前调用OH_VideoEncoder_GetSurface(),获取OHNativeWindow用于传递视频数据。
  • Buffer模式下,应用调用OH_VideoEncoder_PushInputBuffer()传入结束flag,编码器读取到尾帧后,停止编码;Surface模式下,需要调用OH_VideoEncoder_NotifyEndOfStream()通知编码器输入流结束。

两种模式的开发步骤详细说明请参考:Surface模式和Buffer模式。

状态机调用关系

如下为状态机调用关系图:

image.png

  1. 有两种方式可以使编码器进入Initialized状态:

    • 初始创建编码器实例时,编码器处于Initialized状态
    • 任何状态下调用OH_VideoEncoder_Reset()方法,编码器将会移回Initialized状态
  2. Initialized状态下,调用OH_VideoEncoder_Configure()方法配置编码器,配置成功后编码器进入Configured状态。

  3. Configured状态下调用OH_VideoEncoder_Prepare()进入Prepared状态。

  4. Prepared状态调用OH_VideoEncoder_Start()方法使编码器进入Executing状态。

    • 处于Executing状态时,调用OH_VideoEncoder_Stop()方法可以使编码器返回到Prepared状态
  5. 在极少数情况下,编码器可能会遇到错误并进入Error状态。编码器的错误传递,可以通过队列操作返回无效值或者抛出异常。

    • Error状态下可以调用OH_VideoEncoder_Reset()方法将编码器移到Initialized状态;或者调用OH_VideoEncoder_Destroy()方法移动到最后的Released状态
  6. Executing 状态具有三个子状态:Flushed、Running和End-of-Stream:

    • 在调用了OH_VideoEncoder_Start()之后,编码器立即进入Running子状态。
    • 对于处于Executing状态的编码器,可以调用OH_VideoEncoder_Flush()方法返回到Flushed子状态。
    • 当待处理数据全部传递给编码器后,可以在input buffers队列中为最后一个入队的input buffer中添加AVCODEC_BUFFER_FLAGS_EOS标记,遇到这个标记时,编码器会转换为End-of-Stream子状态。在此状态下,编码器不再接受新的输入,但是仍然会继续生成输出,直到输出到达尾帧。
  7. 使用完编码器后,必须调用OH_VideoEncoder_Destroy()方法销毁编码器实例。使编码器进入Released 状态。

开发指导

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

如下为视频编码调用关系图:

image.png

在 CMake 脚本中链接动态库

target_link_libraries(sample PUBLIC libnative_media_codecbase.so)
target_link_libraries(sample PUBLIC libnative_media_core.so)
target_link_libraries(sample PUBLIC libnative_media_venc.so)

Surface模式

参考以下示例代码,开发者可以完成Surface模式下视频编码的全流程。此处以surface数据输入,编码成H.264格式为例。

本模块目前仅支持异步模式的数据轮转。

  1. 添加头文件。
#include <multimedia/player_framework/native_avcodec_videoencoder.h>
#include <multimedia/player_framework/native_avcapability.h>
#include <multimedia/player_framework/native_avcodec_base.h>
#include <multimedia/player_framework/native_avformat.h>
#include <multimedia/player_framework/native_avbuffer.h>
#include <fstream>
  1. 全局变量。
// 配置视频帧宽度(必须)
int32_t width = 320; 
// 配置视频帧高度(必须)
int32_t height = 240;
// 配置视频像素格式(必须)
constexpr OH_AVPixelFormat DEFAULT_PIXELFORMAT = AV_PIXEL_FORMAT_NV12;
int32_t widthStride = 0;
int32_t heightStride = 0;
  1. 创建编码器实例对象。

    应用可以通过名称或媒体类型创建编码器。示例中的变量说明如下:

    • videoEnc:视频编码器实例的指针;
    • capability:编解码器能力查询实例的指针;
    • OH_AVCODEC_MIMETYPE_VIDEO_AVC:AVC格式视频码流的名称。

创建方式示例如下:

// 通过codec name创建编码器,应用有特殊需求,比如选择支持某种分辨率规格的编码器,可先查询capability,再根据codec name创建编码器。
OH_AVCapability *capability = OH_AVCodec_GetCapability(OH_AVCODEC_MIMETYPE_VIDEO_AVC, true);
const char *codecName = OH_AVCapability_GetName(capability);
OH_AVCodec *videoEnc = OH_VideoEncoder_CreateByName(codecName);
// 通过MIME TYPE创建编码器,只能创建系统推荐的特定编解码器
// 涉及创建多路编解码器时,优先创建硬件编码器实例,硬件资源不够时再创建软件编码器实例
OH_AVCodec *videoEnc = OH_VideoEncoder_CreateByMime(OH_AVCODEC_MIMETYPE_VIDEO
Android音视频 - MediaCodec编解码音视频 前情提要 MediaCodec 阅读详情

相关推荐

HarmonyOS实战开发-音频编码

开发者可以调用本模块的Native API接口,完成音频编码,即将音频PCM编码压缩成不同的格式。

2401_82546228的博客 1312

鸿蒙媒体开发【简述】

在音视频开发指导中,将介绍各种涉及音频、视频播放或录制功能场景的开发方式,指导开发者如何使用系统提供的音视频API实现对应功能。比如使用TonePlayer实现简单的提示音,当设备接收到新消息时,会发出短促的“滴滴”声;使用AVPlayer实现音乐播放器,循环播放一首音乐。在每个功能中,会介绍多种实现方式以应对不同的使用场景,以及该场景相关的子功能点。比如在音频播放功能内,会同时介绍音频的并发策略、音量管理和输出设备等在操作系统中的处理方式,帮助开发者能够开发出功能覆盖更全面的应用。

m0_62167422的博客 1702

鸿蒙Harmony南向开发:媒体组件模块详解

跟其源码路径名字一样,多媒体组件模块提供了通过url播放本地音频/视频的能力。但其功能远不止此,可以说是整个多媒体子系统的基石。

weixin_55362248的博客 1201

【鸿蒙实战开发】AVCodec Kit简介

AVCodec kit(Audio & Video Codec Kit,音视频编解码,封装解封装原子能力)是媒体系统中的音视频的编解码、媒体文件的解析、封装、媒体数据输入等原子能力。

HarmonyOS007的博客 941

鸿蒙媒体子系统解读-编码录像流程解读

媒体子系统旨在为多媒体应用开发者开发者提供统一的开发接口,使得开发者可以专注于应用业务的开发,轻松使用多媒体的资源。

weixin_47070198的博客 2086

【鸿蒙南向开发实战】OpenHarmony之媒体组件模块简介

本文中我们讨论了OpenHarmony 3.2 Release中媒体组件模块的功能以及结构,并且对其实现的原理进行了一些简单的探讨。GStreamer是一个功能强大的多媒体库,上文中作为例子讨论的PlayerEngine使用的是一款"全自动"的pipeline。而OpenHarmony中也有像AVCodecEngine那种OpenHarmony化的pipeline,包含了依赖于OpenHarmony平台编解码能力的插件。涉及的内容不单单包括媒体组件跟GStreamer,还包括驱动相关的内容。

HarmonyOS_666的博客 950

鸿蒙(HarmonyOS)实战开发篇——基于Camera Kit,获取相机流数据传递给native,进行压缩编码

ATS侧启动相机,使用摄像头采集视频流数据,获取相机视频流数据传递到native侧,通过buffer模式将视频编码成MP4文件保存到沙箱路径。

lc748258的博客 1272

告别Arduino IDE!用VSCode搭建Arduino UNO R3开发环境(含代码补全配置)

本文详细指导如何用VSCode替代Arduino IDE搭建Arduino UNO R3开发环境,包含代码补全配置和高效开发技巧。通过安装必要插件、配置项目结构和优化工作流,可显著提升开发效率,特别适合复杂项目开发。文章还提供了常见问题解决方案和高级功能调优方法。

weixin_30698297的博客 470

工业缺陷检测的新范式:2025-2026年零样本检测技术全景扫描

摘要: 工业视觉领域面临缺陷样本稀缺、标注成本高等痛点,零样本缺陷检测(Zero-Shot Defect Detection)成为研究热点。2025-2026年的技术进展主要分为三类:1)视觉-语言模型(VLM)路线,如CLIP适配器跨域对齐热成像数据;2)数字孪生路线,通过CAD模型生成理想状态对比检测缺陷;3)基于CLIP的提示学习,如Crane模型通过上下文提示提升泛化能力。尽管实验室效果显著(如IoU达70%),但在真实工业场景(如MIRAD数据集)中性能平均下降29.78%,凸显跨域泛化仍是挑战。

blanokvaffy的博客 1132

MacOS上如何修改jupyter book的默认打开地址以及如何复制文件路径

记点笔记,才换新系统小半年,还是不太熟悉,所以记录一下笔记,感觉之后也会用到,希望能帮到你们。主要内容是:修改jupyter的默认地址以及复制文件路径。

魔仙的博客 1973

用废旧汽车电池DIY家用UPS:手把手教你低成本搭建Wi-Fi不断电系统

本文详细介绍了如何利用废旧汽车电池DIY低成本家用UPS系统,确保Wi-Fi设备在断电时持续供电。通过精选材料、电路搭建和安全防护,实现高效稳定的电源转换与智能切换,成本仅为市售UPS的三分之一。特别适合家庭办公和远程工作者提升网络供电可靠性。

weixin_29200485的博客 458

点云配准实战:用DGCNN+Transformer+SVD搞定3D模型对齐(附PyTorch代码)

本文详细介绍了基于深度学习的点云配准实战方法,重点解析了Deep Closest Point (DCP)模型。该模型融合了DGCNN、Transformer和可微分SVD三大核心模块,能够端到端地预测点云间的刚性变换,有效克服传统ICP算法对初始位置敏感、易陷入局部最优的缺点。文章提供了完整的PyTorch代码实现、ModelNet40数据集处理、训练策略及显存优化技巧,旨在帮助开发者在机器人、自动驾驶等领域实现精准的3D模型对齐。

weixin_29061041的博客 144

PD3.0详解 第十一章 策略层 电源协商(三)(sink端)

前面大师匈介绍了Source端的内容,今天再看一下sink端的内容。大师匈还是想把标准文件的状态机拿出来说一下。大师匈把一张图分成俩部分,大家凑合看一下,一张图实在看不清内容。 Sink 端电源协商状态机。基于sink端哦!!! 上图先!!! 上面俩张图就是整个SINK端口的状态机了。。。介绍一下这个流程: 1、收到hardreset或者刚上电的进入PE_SNK_Startup开始状态。 2、在PE_SNK_Startup阶段后进入PE_SNK_Discovery,并等待Vbus的到来。 3、当Vbus

大师匈的博客 4125

【OD统一考试(B卷)】比赛的冠亚季军,Python 解答

比赛的规则是 0 号和 1 号比赛,2 号和 3 号比赛,以此类推,每一轮,相邻的运动员进行比赛,获胜的进入下一轮,实力值大的获胜,实力值相等的情况,id 小的情况下获胜,轮空的直接进入下一轮。第一轮比赛,id 为 0 实力值为 2 的运动员和 id 为 1 实力值为 3 的运动员比赛, 1 号胜出进入下一轮争夺冠亚军,id 为 2 的运动员和 id 为 3 的运动员比赛,3 号胜出进入下一轮争夺冠亚军;2 号与 0 号,比赛进行季军的争夺,2 号实力值为 4,0 号实力值 2,故 2 号胜出,得季军。

梦想橡皮擦,专栏100例写作模式先行者,现象级专栏 《Python 爬虫 100 例》作者、《滚雪球学 Python 专栏》原创者 1万+

MimicKit 人形机器人强化学习全身模仿控制算法使用教程

本文介绍了MimicKit运动模仿算法框架的使用指南。主要内容包括:1)安装IsaacGym和依赖项;2)训练模型命令及参数说明;3)测试模型的方法;4)分布式训练配置;5)使用TensorBoard可视化日志;6)动作数据格式说明。该框架支持DeepMimic、AMP、ASE、ADD等算法,包含PPO、AWR等强化学习算法,适用于物理仿真角色动画控制研究。

机器人控制与仿真应用 1193

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: 【鸿蒙实战开发】HarmonyOS应用开发-音频解码
下一篇: 【HarmonyOS实战开发】鸿蒙音视频编解码之时域可分层视频编码
普通网友
博客等级 码龄2年 2835粉丝 200原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值