鸿蒙开发实践——对各种图片编解码格式的支持

场景一:展示系统原生支持的图片格式编解码的代码实现

// 获取resourceManager资源管理
const context : Context = getContext(this);
const resourceMgr : resourceManager.ResourceManager = context.resourceManager;
// 创建ImageSource
resourceMgr.getRawFileContent('test.jpg').then((fileData : Uint8Array) => {
  console.log("Succeeded in getting RawFileContent")
  // 获取图片的ArrayBuffer
  const buffer = fileData.buffer.slice(0);
  const imageSource : image.ImageSource = image.createImageSource(buffer);
}).catch((err : BusinessError) => {
  console.error("Failed to get RawFileContent")
});
// 创建PixelMap
imageSource.createPixelMap().then((pixelMap: image.PixelMap) => {
   console.log("Succeeded in creating PixelMap")
}).catch((err : BusinessError) => {
   console.error("Failed to creating PixelMap")
});

场景二:使用第三方库进行系统原生不支持的常用图片格式解码进行解码

avif 格式

2.1 将libavif库添加到工程中,

2.1.1 编译第三方库

下载本仓库

git clone https://gitee.com/openharmony-sig/tpc_c_cplusplus.git --depth=1

 三方库目录结构

o    tpc_c_cplusplus/thirdparty/libavif   #三方库libavif的目录结构如下
o    ├── docs                               #三方库相关文档的文件夹
o    ├── HPKBUILD                           #构建脚本
o    ├── HPKCHECK                           #自动化测试脚本
o    ├── SHA512SUM                          #三方库校验文件
o    ├── README.OpenSource                  #说明三方库源码的下载地址,版本,license等信息
o    ├── README_zh.md                       #三方库说明文档
├── OAT.xml                            #开源扫描相关文件
  • 在tpc_c_cplusplus/lycium目录下编译三方库

编译环境的搭建参考 准备三方库构建环境

cd tpc_c_cplusplus/lycium
./build.sh libavif
  • 三方库头文件及生成的库

在lycium目录下会生成usr目录,该目录下存在已编译完成的32位和64位三方库和头文件

libavif/arm64-v8a   libavif/armeabi-v7a

2.1.2 应用中使用第三方库 

  • 拷贝动态库到\entry\libs\${OHOS_ARCH}\目录: 动态库需要在\entry\libs\${OHOS_ARCH}\目录,才能集成到hap包中,所以需要将对应的so文件拷贝到对应CPU架构的目录

  • 在IDE的cpp目录下新增thirdparty目录,将编译生成的库拷贝到该目录下,如下图所示

  • 在最外层(cpp目录下)CMakeLists.txt中添加如下语句

#将三方库加入工程中
target_link_libraries(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libaom.a
${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libavif.so.16
${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libgmock.a
${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libgmock_main.a
${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libgtest.a
${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libgtest_main.a
${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libjpeg.a
${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libpng.a
${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libpng16.a
${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libyuv.so
)
#将三方库的头文件加入工程中
target_include_directories(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libavif/${OHOS_ARCH}/include
${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libyuv/${OHOS_ARCH}/include
${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libaom/${OHOS_ARCH}/include
${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/jpeg/${OHOS_ARCH}/include
${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libpng/${OHOS_ARCH}/include
${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/googletest/${OHOS_ARCH}/include)

2.1.3  测试第三方库

三方库的测试使用原库自带的测试用例来做测试, 准备三方库测试环境

进入到构建目录(arm64-v8a-build为构建64位的目录,armeabi-v7a-build为构建32位的目录),执行如下操作步骤:

  • 配置环境变量 执行如下命令:

export LD_LIBRARY_PATH=${LYCIUM_ROOT}/usr/libyuv/${ARCH}/lib:${LYCIUM_ROOT}/usr/libavif/${ARCH}/lib:${LYCIUM_ROOT}/usr/jpeg/${ARCH}/lib:${LYCIUM_ROOT}/usr/libaom/${ARCH}/lib:${LYCIUM_ROOT}/usr/libpng/${ARCH}/lib:$LD_LIBRARY_PATH

注意:LYCIUM_ROOT代表lycium所在目录的绝对路径;ARCH代表构建架构,64位为arm64-v8a,32位为armeabi-v7a。

  • 执行测试项:

实现方式参考上述heif格式,策略相通均为C++侧读取图片数据转换为pixelMap返回给TS侧 

### HarmonyOS 上实现直播摄像头播放的方法 #### 配置 HAP 和 config.json 文件 为了使应用程序能够在 HarmonyOS 设备上正常工作,每个HAP(Harmony Ability Package)的根目录下都需要有一个`config.json`配置文件[^1]。此文件定义了应用的基本信息以及其依赖关系和其他必要的参数。 #### 创建并管理相机实例 对于想要访问设备上的摄像硬件资源的应用程序来说,需要通过创建 `CameraStateCallbackImpl` 对象来处理相机的状态变化事件,并以此为基础构建起与实际物理相机之间的桥梁[^2]。这一步骤确保了当相机准备就绪或者遇到错误时能够及时得到通知。 #### 开发适用于多端部署的功能模块 考虑到 HarmonyOS 的设计理念是一次开发可以适配多种类型的终端产品[^3],因此建议开发者设计具有高度灵活性和可移植性的代码结构。这意味着不仅要考虑当前所使用的具体型号或品牌下的特性支持状况,还要兼顾未来可能扩展至其他平台的需求。 #### 利用现有技术框架集成视频流服务 针对直播功能的具体实现,则通常涉及到选用合适的第三方 SDK 或者 API 来获取实时图像数据并将这些数据推送到远程服务器或是直接分发给观众客户端。由于 HarmonyOS 支持丰富的多媒体接口和服务组件,所以可以根据项目实际情况挑选最恰当的方式完成这项任务。例如,在某些情况下可以直接调用系统级的服务来进行编码压缩操作;而在另一些场景里则更适合借助开源库的帮助简化流程控制逻辑。 ```java // 假设我们已经获得了有效的 MediaStream 对象 stream MediaRecorder mediaRecorder = new MediaRecorder(); mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); // 设置输出格式为 MP4 并指定目标路径 mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); File outputFile = new File(getExternalFilesDir(null), "output.mp4"); mediaRecorder.setOutputFile(outputFile.getAbsolutePath()); // 添加音频/视频编解码器设置... try { mediaRecorder.prepare(); } catch (IOException e) { Log.e("LiveStreaming", "Failed to prepare recorder.", e); } mediaRecorder.start(); // 启动录制过程 ``` 上述代码片段展示了如何利用 Android NDK 中提供的 `MediaRecorder` 类进行简单的音视频采集准备工作。虽然这段代码并非专门为 HarmonyOS 编写,但是它提供了一个很好的起点去理解怎样组织相关类以便于后续进一步定制化调整以适应特定环境的要求。 #### 应用场景中的实践考量 随着 5G 技术的发展推动智能家居市场的繁荣,像华为这样的厂商推出的基于 HarmonyOS 构建的家庭安全监控类产品正在变得越来越受欢迎[^4]。这类产品的成功不仅取决于高质量的产品本身,更离不开背后强大的软件支撑体系——即能否高效稳定地向用户提供清晰流畅的画面传输体验成为了衡量此类产品质量好坏的重要标准之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值