写点什么

视频服务 HDR Vivid 还原色彩,让所见成“真”

作者:HMS Core
  • 2022-11-16
    贵州
  • 本文字数:3392 字

    阅读完需:约 11 分钟

如今,视频正在以一种前所未有的方式渗入日常生活,是当下人们记录生活最热门的方式。所以,用户对视频的画质要求越来越高,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 片源硬件解码能力。


public boolean isSupportDecode() {    // 获取MediaCodec在设备上的支持信息    MediaCodecList mcList = new MediaCodecList(MediaCodecList.ALL_CODECS);    MediaCodecInfo[] mcInfos = mcList.getCodecInfos();

for (MediaCodecInfo mci : mcInfos) { // 过滤掉编码器 if (mci.isEncoder()) { continue; } String[] types = mci.getSupportedTypes(); String typesArr = Arrays.toString(types); // 过滤非HEVC解码器 if (!typesArr.contains("hevc")) { continue; } for (String type : types) { // 判断解码器是否支持HEVC 10Bit的解码 MediaCodecInfo.CodecCapabilities codecCapabilities = mci.getCapabilitiesForType(type); for (MediaCodecInfo.CodecProfileLevel codecProfileLevel : codecCapabilities.profileLevels) { if (codecProfileLevel.profile == HEVCProfileMain10 || codecProfileLevel.profile == HEVCProfileMain10HDR10 || codecProfileLevel.profile == HEVCProfileMain10HDR10Plus) { // 返回支持 return true; } } } } // 返回不支持 return false;}
复制代码


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


public class VideoInfo {    private int width;    private int height;    private int tf;    private int colorSpace;    private int colorFormat;    private long durationUs;}
复制代码


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


// surface_view为布局文件layout中定义SurfaceView surfaceView = (SurfaceView) view.findViewById(R.id.surface_view);
复制代码


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

2. 渲染转码

2.1 创建并初始化HdrVividRender实例。


HdrVividRender hdrVividRender = new HdrVividRender();hdrVividRender.init();
复制代码


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


// 设置视频源的光电转换函数hdrVividRender.setTransFunc(2);// 设置视频源的分辨率hdrVividRender.setInputVideoSize(3840, 2160);
复制代码


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


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


hdrVividRender.setBrightness(700);
复制代码


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


Surface inputSurface = hdrVividRender.createInputSurface();
复制代码


2.5 设置输出参数。


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


// surfaceView为视频播放窗口hdrVividRender.setOutputSurfaceSize(surfaceView.getWidth(), surfaceView.getHeight());
复制代码


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


hdrVividRender.setColorSpace(HdrVividRender.COLORSPACE_P3);
复制代码


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


hdrVividRender.setColorFormat(HdrVividRender.COLORFORMAT_R8G8B8A8);
复制代码


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


hdrVividRender.configure(inputSurface, new HdrVividRender.InputCallback() {    @Override    public int onGetDynamicMetaData(HdrVividRender hdrVividRender, long pts) {        // 设置静态元数据,需要从视频源中获取。        HdrVividRender.StaticMetaData lastStaticMetaData = new HdrVividRender.StaticMetaData();        hdrVividRender.setStaticMetaData(lastStaticMetaData);        // 设置动态元数据,从视频源中获取。        ByteBuffer dynamicMetaData = ByteBuffer.allocateDirect(10);        hdrVividRender.setDynamicMetaData(20000, dynamicMetaData);        return 0;    }}, surfaceView.getHolder().getSurface(), null);
复制代码


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


hdrVividRender.configure(inputSurface, new HdrVividRender.InputCallback() {    @Override    public int onGetDynamicMetaData(HdrVividRender hdrVividRender, long pts) {        // 设置静态元数据,需要从视频源中获取。        HdrVividRender.StaticMetaData lastStaticMetaData = new HdrVividRender.StaticMetaData();        hdrVividRender.setStaticMetaData(lastStaticMetaData);        // 设置动态元数据,从视频源中获取。        ByteBuffer dynamicMetaData = ByteBuffer.allocateDirect(10);        hdrVividRender.setDynamicMetaData(20000, dynamicMetaData);        return 0;    }}, null, new HdrVividRender.OutputCallback() {    @Override    public void onOutputBufferAvailable(HdrVividRender hdrVividRender, ByteBuffer byteBuffer,        HdrVividRender.BufferInfo bufferInfo) {            // App处理缓冲Buffer数据逻辑    }});
复制代码


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


2.8 启动处理流程。


hdrVividRender.start();
复制代码


2.9 停止处理流程。


hdrVividRender.stop();
复制代码


2.10 释放资源。


hdrVividRender.release();hdrVividRender = null;
复制代码


说明:


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


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

3. HDR 能力配置

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


3.1 初始化亮度调节功能。


HdrAbility.init(getApplicationContext());
复制代码


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


HdrAbility.setHdrAbility(true);
复制代码


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


HdrAbility.setBrightness(600);
复制代码


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


HdrAbility.setHdrLayer(surfaceView, true);
复制代码


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


HdrAbility.setCaptionsLayer(captionView, 1.5f);
复制代码


了解更多详情>>


访问华为开发者联盟官网


获取开发指导文档


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


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

用户头像

HMS Core

关注

HMS Core技术团队。 2022-06-16 加入

分享最新的技术干货,带来最全的能力应用场景,更新热门开发者圈子活动。与开发者一起,同成长,共精彩。

评论

发布
暂无评论
视频服务HDR Vivid 还原色彩,让所见成“真”_视频_HMS Core_InfoQ写作社区