# 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**: 2 - **Created**: 2025-10-21 - **Last Updated**: 2025-10-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # HDR转码SDR ## 项目简介 本示例基于Surface模式实现高效视频编解码,支持HDR视频录制及HDR转SDR转码功能,通过硬件加速和色彩空间优化技术,提升视频质量处理效率。 ## 效果图预览 | 首页 | 录制页 | |-----------------------------------------------------|---------------------------------------------| | | | | 转码页 | 保存弹窗 | |---------------------------------------------------------|------------------------------------------------------| | | | ## 使用说明 1. 打开应用,点击HDR视频录制,选择Recorder或AVCodec封装方法。 2. 点击录制视频,完成录制后返回,点击视频播放或暂停视频。 3. 点击保存视频,确认保存。 4. 返回首页,点击HDR视频转码。 5. 点击屏幕选择视频,点击AVCodec或Video_Processing进行SDR转码并送显。 ## 工程目录 ``` ├──entry/src/main/cpp // Native层 │ ├──CMakeLists.txt // 编译入口 │ ├──capbilities // 接口能力实现 │ ├──AudioCapturer.cpp // 音频采集实现 │ ├──AudioEncoder.cpp // 音频编码实现 │ ├──Demuxer.cpp // 解封装实现 │ ├──Muxer.cpp // 封装实现 │ ├──AudioDecoder.cpp // 转码音频解码实现 │ ├──Demuxer.cpp // 转码解封装实现 │ │ ├──VideoDecoder.cpp // 转码视频解码实现 │ │ ├──VideoEncoder.cpp // 视频编码实现 │ │ └──include // 接口能力定义 │ ├──common // 公共模块 │ │ ├──SampleCallback.cpp // 编解码回调实现 │ │ ├──SampleCallback.h // 编解码回调定义 │ │ ├──SampleInfo.h // 公共类 │ │ └──dfx // 日志实现 │ ├──render // 送显模块 │ │ ├──ProcessingPluginManager.cpp // 送显模块管理实现 │ │ ├──ProcessingPluginRender.cpp // 送显模块逻辑实现 │ │ └──include // 送显模块接口定义 │ ├──sample │ │ ├──player // 转码播放接口 │ │ │ ├──Player.cpp // 转码播放接口实现 │ │ │ ├──Player.h // 转码播放接口定义 │ │ │ ├──PlayerNative.cpp // 转码接口调用入口 │ │ │ └──PlayerNative.h // 调用入口定义 │ │ └──recorder // 录制接口 │ │ ├──Recorder.cpp // 录制功能接口实现 │ │ ├──Recorder.h // 录制功能接口定义 │ │ ├──RecorderNative.cpp // 录制接口调用入口 │ │ └──RecorderNative.h // 调用入口定义 │ └──types // Native层暴露上来的接口 │ ├──libplayer // 转码播放模块暴露给UI层的接口 │ └──librecorder // 录制模块暴露给UI层的接口 ├── ets // UI层 │ ├──common // 公共模块 │ │ ├──CommonConstants.ets // 参数常量 │ │ └──utils // 公共工具类 │ │ ├──DateTimeUtils.ets // 时间工具类 │ │ ├──FileUtil.ets // 文件工具类 │ │ ├──PermissionsUtils.ets // 申请权限类 │ │ └──VideoOperationUtils.ets // 保存文件类 │ ├──controller // 控制模块 │ │ ├──AVCodecController.ets // AVcodec控制类 │ │ ├──AvPlayerController.ets // AVplayer播放类 │ │ └──RecordController.ets // Recorder录制类 │ ├──entryability // 应用入口函数 │ │ └──EntryAbility.ets │ ├──entrybackupability │ │ └──EntryBackupAbility.ets │ ├──model │ │ └──CameraDateModel.ets // 相机参数数据类 │ ├──pages │ │ ├──CameraPage.ets // 相机录制页 │ │ ├──Index.ets // 首页 │ │ ├──Recording.ets // 视频录制页 │ │ └──Transcode.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. 用户成功选择文件后,调用playNative转码的接口。 2. 开始转码前,调用init函数初始化解封装器、封装器、编码器、解码器。同时保存上下文参数。 3. 调用Start函数开始解码,开启解码线程包括输入子线程和输出子线程对视频数据进行解码。 4. 在输入子线程中,使用解封装后的bufferInfo,调用解码的PushInputData接口将帧buffer、index存入输入队列中。在输出子线程中,把上一步的帧信息储存为bufferInfo后,pop出队,调用FreeOutputData接口后,就会送显并释放buffer。 ## 相关权限 允许应用使用相机:ohos.permission.CAMERA。 允许应用使用麦克风:ohos.permission.MICROPHONE。 允许应用写入用户媒体文件:ohos.permission.WRITE_MEDIA。 ## 约束与限制 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及以上。