# VideoRender **Repository Path**: harmonyos_samples/video-render ## Basic Information - **Project Name**: VideoRender - **Description**: 该示例主要是用来指导如何通过视频解码进行画面渲染,包括基于XComponent渲染、基于OpenGL渲染、基于Vulkan渲染。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 2 - **Created**: 2025-08-06 - **Last Updated**: 2025-12-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 渲染视频数据 ## 项目简介 本示例适用于视频解码后的视频画面渲染送显,渲染送显的方式包括基于XComponent渲染送显、基于OpenGL渲染送显、基于Vulkan渲染送显。本示例提供了视频渲染的多种方案,帮助开发者实现自定义播放器开发,了解视频解码到渲染的全流程。 ## 效果预览 | 首页 | 基于XComponent播放页 | |-----------------------------------------------------|--------------------------------------------------------| | | | | 基于OpenGL播放页 | 基于Vulkan播放页 | | | | ## 使用说明 点击进入基于XComponent渲染视频、基于OpenGL渲染视频、基于Vulkan渲染视频的子页面,点击播放即可渲染播放视频。 ## 工程目录 ``` ├───entry/src/main/cpp │ ├───capbilities │ │ ├───include │ │ │ ├───SampleInfo.h // 视频样本 │ │ │ ├───SampleCallback.h // 视频回调 │ │ │ ├───Demuxer.h // 媒体解析 │ │ │ └───VideoDecoder.h // 视频解码 │ │ └───src │ │ ├───SampleCallback.cpp // 视频回调 │ │ ├───Demuxer.cpp // 媒体解析 │ │ └───VideoDecoder.cpp // 视频解码 │ ├───player │ │ ├───include │ │ │ └───Player.h // 视频播放 │ │ ├───src │ │ │ └───Player.cpp // 视频播放 │ └───render │ ├───include │ │ ├───OpenGLRender.h // OpenGL渲染上下文 │ │ ├───OpenGLRenderThread.h // OpenGL渲染线程 │ │ ├───PluginManager.h // XComponent管理 │ │ ├───PluginRender.h // 渲染管理 │ │ ├───ShaderProgram.h // 着色器 │ │ ├───VulkanRender.h // Vulkan渲染上下文 │ │ └───VulkanRenderThread.h // Vulkan渲染线程 │ └───src │ ├───OpenGLRender.cpp // OpenGL渲染上下文 │ ├───OpenGLRenderThread.cpp // OpenGL渲染线程 │ ├───PluginManager.cpp // XComponent管理 │ ├───PluginRender.cpp // 渲染管理 │ ├───ShaderProgram.cpp // OpenGL着色器 │ ├───VulkanRender.cpp // Vulkan渲染上下文 │ └───VulkanRenderThread.cpp // Vulkan渲染线程 ├───entry/src/main/ets │ ├───entryability │ │ └-──EntryAbility.ets // 主Ability的生命周期回调内容 │ ├───entrybackupability │ │ └───EntryBackupAbility.ets // Ability的生命周期回调内容 │ └───pages │ ├───OpenGLPlayer.ets // OpenGL播放页面 │ ├───Index.ets // 首页 │ ├───VulkanPlayer.ets // Vulkan播放页面 │ └───XComponentPlayer.ets // XComponent播放页面 └───entry/src/main/resources // 资源目录 ``` ## 具体实现 ### 基于XComponent渲染视频 1. 在XComponent创建时,通过回调函数OnSurfaceCreatedCB获取对应的NativeWindow对象。 2. 实现编解码器的基本功能,包括解封装器、解码器等。 3. 实现播放功能,启动输入子线程、输出子线程。 4. 在解码输入子线程中,通过解封装器读取视频数据,并提交给解码器。 5. 在解码输出子线程中,将解码后的数据提交给输出Surface。 ### 基于OpenGL渲染视频 1. 实现OpenGL渲染子线程相关的内容,包括初始化OpenGL环境、创建Surface、初始化NativeImage等基础能力。 2. 创建NativeImage对象,并根据NativeImage获取NativeWindow对象。 3. 在XComponent创建时,通过回调函数OnSurfaceCreatedCB获取对应的NativeWindow对象,OpenGL通过XComponent的NativeWindow对象创建Surface。 4. 实现编解码器的基本功能,包括解封装器、解码器等。 5. 实现播放功能,启动输入子线程、输出子线程。 6. 在解码输入子线程中,通过解封装器读取视频数据,并提交给解码器。 7. 在解码输出子线程中,将解码后的数据提交给输出Surface,即NativeImage的NativeWindow对象。 8. 通过NativeImage,将视频图像缓存更新至OpenGL的纹理上。 9. 通过eglSwapBuffers将渲染的缓存提交给XComponent的NativeWindow对象。 ### 基于Vulkan渲染视频 1. 创建渲染子线程,在启动子线程时,加载Vulkan的动态链接库。 2. 创建NativeImage对象,并根据NativeImage获取NativeWindow对象。 3. 在XComponent创建时,通过回调函数OnSurfaceCreatedCB获取对应的NativeWindow对象,Vulkan通过XComponent的NativeWindow对象创建Surface。 4. 实现编解码器的基本功能,包括解封装器、解码器等。 5. 实现播放功能,启动输入子线程、输出子线程。 6. 在解码输入子线程中,通过解封装器读取视频数据,并提交给解码器。 7. 在解码输出子线程中,将解码后的数据提交给输出Surface,即NativeImage的NativeWindow对象。 8. 在NativeImage有可用数据后,通过OH_NativeImage_AcquireNativeWindowBuffer()获取视频数据,并通过OH_NativeBuffer_FromNativeWindowBuffer()转化为NativeBuffer的类型。 9. Vulkan获取到NativeBuffer后,将格式转化为RGBA后进行渲染显示。 ## 相关权限 不涉及 ## 约束与限制 1. 本示例仅支持标准系统上运行,支持设备:华为手机。 2. HarmonyOS系统:HarmonyOS 5.1.1 Release及以上。 3. DevEco Studio版本:DevEco Studio 5.1.1 Release及以上。 4. HarmonyOS SDK版本:HarmonyOS 5.1.1 Release SDK及以上。