# HDR2SDR
**Repository Path**: harmonyos_samples/hdr2sdr
## Basic Information
- **Project Name**: HDR2SDR
- **Description**: 本示例基于Surface模式实现高效视频编解码,支持HDR视频录制及HDR转SDR转码功能,通过硬件加速和色彩空间优化技术,提升视频质量处理效率。
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 4
- **Created**: 2025-10-21
- **Last Updated**: 2026-01-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 实现HDR视频转码SDR视频功能
## 项目简介
本示例基于Surface模式实现高效视频编解码,支持HDR视频录制及HDR转SDR转码功能,通过硬件加速和色彩空间优化技术,提升视频质量处理效率。
## 效果图预览
| 首页 | 播放页 |
|----------------------------------------------------------|--------------------------------------------------------------|
|
|
|
| 录制页 | 转码页 |
|
|
|
## 使用说明
1. 打开应用,点击AVRecorder或AVCodec进行HDR视频录制。
2. 点击录制视频,完成录制后返回,点击视频播放或暂停视频。
3. 点击保存视频,确认保存。
4. 返回首页,点击HDR视频转码。
5. 点击屏幕选择视频,点击AVCodec或Video_Processing进行SDR转码并送显。
> **注意**:
> 1. AVRecorder录制不支持设置AVMetadata音视频元数据的HDR类型。
> 2. 在使用转码的功能时,请选择HDR类型的视频,HDR视频在相册中有HDR标识。
## 工程目录
```
├──entry/src/main/cpp // Native层
│ ├──capbilities // 接口能力实现
│ │ ├──include // 编解码模块接口定义
│ │ ├──AudioCapturer.cpp // 音频采集实现
│ │ ├──AudioDecoder.cpp // 转码音频解码实现
│ │ ├──AudioEncoder.cpp // 音频编码实现
│ │ ├──Demuxer.cpp // 解封装实现
│ │ ├──Muxer.cpp // 封装实现
│ │ ├──VideoDecoder.cpp // 转码视频解码实现
│ │ ├──VideoEncoder.cpp // 视频编码实现
│ │ └──VideoProcessing.cpp // 视频转换实现
│ ├──common // 公共模块
│ │ ├──dfx // 日志实现
│ │ ├──SampleCallback.cpp // 编解码回调实现
│ │ ├──SampleCallback.h // 编解码回调定义
│ │ └──SampleInfo.h // 公共类
│ ├──render // 送显模块
│ │ ├──include // 送显模块接口定义
│ │ ├──PluginManager.cpp // 送显模块管理实现
│ │ └──PluginRender.cpp // 送显模块逻辑实现
│ ├──sample
│ │ ├──player // 转码播放接口
│ │ │ ├──Player.cpp // 转码播放接口实现
│ │ │ ├──Player.h // 转码播放接口定义
│ │ │ ├──PlayerNative.cpp // 转码接口调用入口
│ │ │ └──PlayerNative.h // 调用入口定义
│ │ ├──recorder // 录制接口
│ │ │ ├──Recorder.cpp // 录制功能接口实现
│ │ │ ├──Recorder.h // 录制功能接口定义
│ │ │ ├──RecorderNative.cpp // 录制接口调用入口
│ │ │ └──RecorderNative.h // 调用入口定义
│ │ └──transcoder // 转码接口
│ │ ├──AVCodecTranscoder.cpp // AVCodec转码功能接口实现
│ │ ├──AVCodecTranscoder.h // AVCodec转码功能接口定义
│ │ ├──AVTranscoder.cpp // AVTranscoder转码功能接口实现
│ │ ├──AVTranscoder.h // AVTranscoder转码功能接口定义
│ │ ├──TranscoderNative.cpp // 转码接口调用入口
│ │ └──TranscoderNative.h // 转码调用入口定义
│ ├──types // Native层暴露上来的接口
│ │ ├──libplayer // 转码播放模块暴露给UI层的接口
│ │ ├──librecorder // 录制模块暴露给UI层的接口
│ │ └──libtranscoder // 转码模块暴露给UI层的接口
│ └──CMakeLists.txt // 编译入口
├──ets // UI层
│ ├──common // 公共模块
│ │ ├──utils // 公共工具类
│ │ │ ├──DateTimeUtils.ets // 时间工具类
│ │ │ ├──FileUtil.ets // 文件工具类
│ │ │ ├──Logger.ets // 日志类
│ │ │ ├──PermissionsUtils.ets // 申请权限类
│ │ │ └──VideoOperationUtils.ets // 保存文件类
│ │ ├──CommonConstants.ets // 参数常量
│ │ └──CommonEnum.ets // 枚举类
│ ├──controller // 控制模块
│ │ ├──AVCodecController.ets // AVcodec控制类
│ │ ├──AvPlayerController.ets // AVplayer播放类
│ │ └──RecordController.ets // Recorder录制类
│ ├──entryability // 应用入口函数
│ │ └──EntryAbility.ets
│ ├──entrybackupability
│ │ └──EntryBackupAbility.ets
│ ├──model
│ │ └──CameraDateModel.ets // 相机参数数据类
│ ├──pages
│ │ ├──AVCodecPage.ets // 视频转码页
│ │ ├──AVCodecPage.ets // 视频AVCodec播放页
│ │ ├──AVPlayerPage.ets // 视频AVPlayer播放页
│ │ ├──AVTranscoderPage.ets // 视频AVTranscoder转码页
│ │ ├──CameraPage.ets // 相机录制页
│ │ ├──Index.ets // 首页
│ │ └──Recording.ets // 视频录制页
│ └──view // 组件模块
│ ├──MultiStatusButton.ets // 多选框组件
│ └──SaveDialog.ets // 保存弹窗
├──module.json5 // 模块配置信息
└──resources // 静态资源文件
```
## 具体实现
视频录制:
1. 通过cameraInput,获取相机采集数据,创建相机输入。
2. 创建previewOutput,获取预览输出流,通过XComponent的surfaceId连接,送显XComponent。
3. 通过surfaceId创建录像输出流VideoOutput输出到文件中。
4. 基于Recorder方法具体实现都封装在[RecordController.ets](./entry/src/main/ets/controller/RecordController.ets),基于AVCodec方法具体实现都封装在[AVCodecController.ets](./entry/src/main/ets/controller/AVCodecController.ets)
视频转码:
1. 用户成功选择文件后,调用转码的接口。
2. 开始转码前,调用init函数初始化解封装器、封装器、编码器、解码器。同时保存上下文参数。
3. 调用Start函数开始解码,开启解码线程包括输入子线程和输出子线程对视频数据进行解码。
4. 在输入子线程中,使用解封装后的bufferInfo,调用解码的PushInputData接口将帧buffer、index存入输入队列中。在输出子线程中,把上一步的帧信息储存为bufferInfo后,pop出队,调用FreeOutputData接口后,就会送显并释放buffer。
## 相关权限
允许应用使用相机:ohos.permission.CAMERA。
允许应用使用麦克风:ohos.permission.MICROPHONE。
允许应用写入用户媒体文件:ohos.permission.WRITE_MEDIA。
## 依赖
1. 引入libboundcheck安全函数三方库,拉取项目后需要执行git submodule update --init 加载子模块。示例代码如下:
```
git clone https://gitee.com/harmonyos_samples/hdr2sdr.git
git submodule update --init
```
## 约束与限制
1.本示例仅支持标准系统上运行,支持设备:华为手机。
2.HarmonyOS系统:HarmonyOS 6.0.0 Release及以上。
3.DevEco Studio版本:DevEco Studio 6.0.0 Release及以上。
4.HarmonyOS SDK版本:HarmonyOS 6.0.0 Release SDK及以上。