如今,视频正在以一种前所未有的方式渗入日常生活,是当下人们记录生活最热门的方式。所以,用户对视频的画质要求越来越高,App想要吸引更多的用户,拥有视频画质新技术的强力支撑很关键。

HDR(High-Dynamic Range)就是一种提高影像亮度和对比度的处理技术。它可以将每个暗部的细节变亮,增加对比度,丰富更多细节色彩,让电影、图片都能呈现出极佳的效果,在观影时更接近真实环境中的视觉感受。但是传统的HDR技术存在标准不统一,终端呈现效果参差不齐,制作难度大,缺少超高清片源等桎梏。

HMS Core视频服务HDR Vivid能力不但解决了HDR的问题,而且可以呈现丰富的色彩及层次,更加强烈的影像纵深感及细节,让画面更加的趋近真实世界,力求实现人眼“所见即所得”的效果。HDR Vivid SDK提供的HDR Vivid视频图像的OETF、Tonemapping、HDR2SDR等能力,助力您快速构建HDR Vivid视频的播放、分享特性,帮助您向用户提供HDR Vivid视频媒体体验。HDR Ability SDK提供的屏幕亮度相关能力,获得更好的HDR视频播放体验,可以单独集成,也可以和HDR Vivid SDK配合使用。

开发准备

  1. 在开发应用前需要在华为开发者联盟网站上注册成为开发者并完成实名认证,具体方法请参见帐号注册认证

  2. 集成HMS Core SDK

针对Android Studio开发环境,华为提供了Maven仓集成方式的HMS Core SDK包。在开始开发前,您需要将HMS Core SDK集成到您的Android Studio开发环境中。

  1. 配置混淆脚本

4.添加权限

应用开发

1. 准备工作

检查设备是否具有HDR Vivid片源硬件解码能力。如果以下函数返回true,则说明设备具有HDR Vivid片源硬件解码能力。

  1. public boolean isSupportDecode() {
  2. // 获取MediaCodec在设备上的支持信息
  3. MediaCodecList mcList = new MediaCodecList(MediaCodecList.ALL_CODECS);
  4. MediaCodecInfo[] mcInfos = mcList.getCodecInfos();
  5. for (MediaCodecInfo mci : mcInfos) {
  6. // 过滤掉编码器
  7. if (mci.isEncoder()) {
  8. continue;
  9. }
  10. String[] types = mci.getSupportedTypes();
  11. String typesArr = Arrays.toString(types);
  12. // 过滤非HEVC解码器
  13. if (!typesArr.contains("hevc")) {
  14. continue;
  15. }
  16. for (String type : types) {
  17. // 判断解码器是否支持HEVC 10Bit的解码
  18. MediaCodecInfo.CodecCapabilities codecCapabilities = mci.getCapabilitiesForType(type);
  19. for (MediaCodecInfo.CodecProfileLevel codecProfileLevel : codecCapabilities.profileLevels) {
  20. if (codecProfileLevel.profile == HEVCProfileMain10
  21. || codecProfileLevel.profile == HEVCProfileMain10HDR10
  22. || codecProfileLevel.profile == HEVCProfileMain10HDR10Plus) {
  23. // 返回支持
  24. return true;
  25. }
  26. }
  27. }
  28. }
  29. // 返回不支持
  30. return false;
  31. }

从视频中解析视频信息,包括:分辨率、转换函数、色彩空间、颜色格式。存放到自定义变量中,如:VideoInfo。

  1. public class VideoInfo {
  2. private int width;
  3. private int height;
  4. private int tf;
  5. private int colorSpace;
  6. private int colorFormat;
  7. private long durationUs;
  8. }

创建SurfaceView,用于SDK处理后渲染画面。

  1. // surface_view为布局文件layout中定义
  2. SurfaceView surfaceView = (SurfaceView) view.findViewById(R.id.surface_view);

创建线程,从视频中解析视频流,具体请参见示例代码

2. 渲染转码

2.1创建并初始化HdrVividRender实例。

  1. HdrVividRender hdrVividRender = new HdrVividRender();
  2. hdrVividRender.init();

2.2设置视频源的分辨率、光电转换函数。

  1. // 设置视频源的光电转换函数
  2. hdrVividRender.setTransFunc(2);
  3. // 设置视频源的分辨率
  4. hdrVividRender.setInputVideoSize(3840, 2160);

说明:Android平台下只支持渲染输入模式场景。

2.3设置输出的亮度值(可选)。

  1. hdrVividRender.setBrightness(700);

2.4创建输入Surface。当输入模式为渲染模式时,需要调用该接口创建输入Surface,并将该Surface作为configure的inputSurface参数传入。

  1. Surface inputSurface = hdrVividRender.createInputSurface();

2.5设置输出参数。

2.5.1设置渲染的Surface的大小(渲染输出模式需要设置)。

  1. // surfaceView为视频播放窗口
  2. hdrVividRender.setOutputSurfaceSize(surfaceView.getWidth(), surfaceView.getHeight());

2.5.2设置输出Buffer的色彩空间(转码输出模式时设置,可选,如果不设置,默认为BT.709)。

  1. hdrVividRender.setColorSpace(HdrVividRender.COLORSPACE_P3);

2.5.3设置输出Buffer的颜色格式(转码输出模式时设置,可选,如果不设置,默认为R8G8B8A8)。

  1. hdrVividRender.setColorFormat(HdrVividRender.COLORFORMAT_R8G8B8A8);

2.6输出模式为渲染模式时,需要调用如下接口:

  1. hdrVividRender.configure(inputSurface, new HdrVividRender.InputCallback() {
  2. @Override
  3. public int onGetDynamicMetaData(HdrVividRender hdrVividRender, long pts) {
  4. // 设置静态元数据,需要从视频源中获取。
  5. HdrVividRender.StaticMetaData lastStaticMetaData = new HdrVividRender.StaticMetaData();
  6. hdrVividRender.setStaticMetaData(lastStaticMetaData);
  7. // 设置动态元数据,从视频源中获取。
  8. ByteBuffer dynamicMetaData = ByteBuffer.allocateDirect(10);
  9. hdrVividRender.setDynamicMetaData(20000, dynamicMetaData);
  10. return 0;
  11. }
  12. }, surfaceView.getHolder().getSurface(), null);

2.7输出模式为转码模式时,需要调用如下接口:

  1. hdrVividRender.configure(inputSurface, new HdrVividRender.InputCallback() {
  2. @Override
  3. public int onGetDynamicMetaData(HdrVividRender hdrVividRender, long pts) {
  4. // 设置静态元数据,需要从视频源中获取。
  5. HdrVividRender.StaticMetaData lastStaticMetaData = new HdrVividRender.StaticMetaData();
  6. hdrVividRender.setStaticMetaData(lastStaticMetaData);
  7. // 设置动态元数据,从视频源中获取。
  8. ByteBuffer dynamicMetaData = ByteBuffer.allocateDirect(10);
  9. hdrVividRender.setDynamicMetaData(20000, dynamicMetaData);
  10. return 0;
  11. }
  12. }, null, new HdrVividRender.OutputCallback() {
  13. @Override
  14. public void onOutputBufferAvailable(HdrVividRender hdrVividRender, ByteBuffer byteBuffer,
  15. HdrVividRender.BufferInfo bufferInfo) {
  16. // App处理缓冲Buffer数据逻辑
  17. }
  18. });

说明:如果不使用new HdrVividRender.OutputCallback()异步处理返回Buffer数据,可以通过read方法主动获取。例如:hdrVividRender.read(new BufferInfo(), 10); // 10为时间戳,由App决定具体时间戳。

2.8启动处理流程。

  1. hdrVividRender.start();

2.9停止处理流程。

  1. hdrVividRender.stop();

2.10释放资源。

  1. hdrVividRender.release();
  2. hdrVividRender = null;

说明:

渲染输出模式,当Surface大小改变时,需要调用setOutputSurfaceSize重新设置输出Surface的大小。

渲染输出模式,当Surface销毁重新创建时(前后台切换),如果HdrVividRender实例没有销毁,需要调用setOutputSurface接口设置新的输出Surface。

3. HDR能力配置

HDR能力接口类HdrAbility,可用于HDR Vivid SDK对HDR Vivid视频进行渲染转码处理过程中,进行亮度调节。

3.1初始化亮度调节功能。

  1. HdrAbility.init(getApplicationContext());

3.2打开设备的HDR能力,屏幕的峰值亮度会增加。

  1. HdrAbility.setHdrAbility(true);

3.3设置输出视频图像数据的白点的备选的最大峰值亮度。

  1. HdrAbility.setBrightness(600);

3.4打开视频图层高亮显示能力。

  1. HdrAbility.setHdrLayer(surfaceView, true);

3.5设置字幕/弹幕图层高亮显示能力。

  1. HdrAbility.setCaptionsLayer(captionView, 1.5f);

了解更多详情>>

访问华为开发者联盟官网

获取开发指导文档

华为移动服务开源仓库地址:GitHubGitee

关注我们,第一时间了解 HMS Core 最新技术资讯~

视频服务HDR Vivid 还原色彩,让所见成“真”的更多相关文章

  1. 短视频服务大PK,阿里云、腾讯云、又拍云、七牛云、金山云5强横向对比

    继直播后,短视频又再次爆发,在这个风口,国内的各大云厂商也都相继推出了自己的一站式短视频解决方案.上周由于公司短视频功能开发的需要,对比了阿里云.腾讯云.又拍云.七牛云.金山云5家的短视频服务. 先介 ...

  2. EasySwoole+ElasticSearch打造 高性能 小视频服务系统

    EasySwoole+ElasticSearch打造高性能小视频服务 第1章 课程概述 第2章 EasySwoole框架快速上手 第3章 性能测试 第4章 玩转高性能消息队列服务 第5章 小视频服务平 ...

  3. iNeuOS工业互联平台,.NETCore开发的视频服务组件iNeuVideo,RTSP转WebSocket

    目       录 1.      概述... 2 2.      将来集成到iNeuOS平台演示... 3 3.      iNeuVideo结构... 3 4.      iNeuVideo部署及 ...

  4. 使用IIS 7.0 Smooth Streaming 优化视频服务

    http://www.cnblogs.com/dudu/archive/2013/06/08/iis_webserver_settings.html (支持高并发的IIS Web服务器常用设置) ht ...

  5. 阿里云视频服务SDK

    原文地址:https://help.aliyun.com/document_detail/51992.html?spm=5176.doc52200.6.668.Sn3AjC SDK下载 更新时间:20 ...

  6. 采用EasyDSS视频点播服务器搭建企业私有化的音视频多媒体、短视频、视频服务网站与管理后台

    最近有越来越多的用户咨询关于视频点播的功能,主要需求就是集中于如何搭建专属的私有化视频点播平台: 实现的功能类似于,对应自身拥有的视频文件,需要发布到一个网站,其他用户都可以实现点播观看. 针对于类似 ...

  7. ZEGO音视频服务的高可用架构设计与运营

    前言: ZEGO 即构科技作为一家实时音视频的提供商,系统稳定性直接影响用户的主观体验,如何保障服务高可用且用户体验最优是行业面临的挑战,本文结合实际业务场景进行思考,介绍 ZEGO 即构在高可用架构 ...

  8. 企业私有云部署im,视频服务

    1,安全问题 2,员工跨地域 3,内部视频培训 考勤申请,设备借用申请 名片申请 会议室预订 审批 内网,局域网部署 Android源码 https://github.com/starrtc/andr ...

  9. 视频服务之ffmpeg部署

    FFmpeg介绍 FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序. 采用LGPL或GPL许可证.它提供了录制.转换以及流化音视频的完整解决方案. 它包含了非常先进 ...

  10. nginx视频服务缓存方案设置指导

    本文描述了如何通过设置nginx缓存达到降低服务器后端压力的效果以及结合nginx第三方插件ngx_cache_purge实现nginx缓存后的自动清理功能.具体实施步骤如下所示:第一步:获取清除清除 ...

随机推荐

  1. KingbaseES V8R6备份恢复案例之---手工清理冗余历史备份

    案例说明: 对于KingbaseES V8R6的通过sys_rman执行的物理历史备份,可以在执行备份时,备份的保留(retention)策略自动清理.不能通过手工删除备份,可以通过expire参数手 ...

  2. KingbaseES R6 集群主库网卡down测试案例

    数据库版本: test=# select version(); version ------------------------------------------------------------ ...

  3. 【设计模式】Java设计模式 - 适配器模式

    [设计模式]Java设计模式 - 适配器模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一 ...

  4. flink-cdc实时同步mysql数据到elasticsearch

    本文首发于我的个人博客网站 等待下一个秋-Flink 什么是CDC? CDC是(Change Data Capture 变更数据获取)的简称.核心思想是,监测并捕获数据库的变动(包括数据 或 数据表的 ...

  5. c#中容易被忽视的foreach

    有句俗语:百姓日用而不知.我们c#程序员很喜欢,也非常习惯地用foreach.今天呢,我就带大家一起探索foreach,走,开始我们的旅程. 一.for语句用的好好的,为什么要提供一个foreach? ...

  6. [报错]-RuntimeError: Input type (torch.cuda.HalfTensor) and weight type (torch.cuda.FloatTensor) should be the same

    RuntimeError: Input type (torch.cuda.HalfTensor) and weight type (torch.cuda.FloatTensor) should be ...

  7. vscode-jupyter快捷键

    运行本单元 ctrl + enter 运行本单元,新建一个单元 shift + enter 运行本单元,在其下方新建一个单元 alt + enter 在上方插入一个新单元 a 在下方插入新单元 b 复 ...

  8. 跟羽夏学 Ghidra ——调试

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

  9. HTTPS安全加固配置最佳实践指南

    转载自:https://www.bilibili.com/read/cv16067729?spm_id_from=333.999.0.0 0x02 HTTPS安全加固指南 描述: 当你的网站上了 HT ...

  10. 配置Pod的 /etc/hosts

    某些情况下,DNS 或者其他的域名解析方法可能不太适用,您需要配置 /etc/hosts 文件,在Linux下是比较容易做到的,在 Kubernetes 中,可以通过 Pod 定义中的 hostAli ...