视频服务HDR Vivid 还原色彩,让所见成“真”
如今,视频正在以一种前所未有的方式渗入日常生活,是当下人们记录生活最热门的方式。所以,用户对视频的画质要求越来越高,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配合使用。
开发准备
针对Android Studio开发环境,华为提供了Maven仓集成方式的HMS Core SDK包。在开始开发前,您需要将HMS Core SDK集成到您的Android Studio开发环境中。
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);
了解更多详情>>
访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHub、Gitee
关注我们,第一时间了解 HMS Core 最新技术资讯~

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
印度解禁 VLC
在经历了 9 个月的封禁之后,印度电子和信息技术部 (MeitY) 取消了对 VLC Media Player 网站的相关禁令。这意味着印度用户可以继续免费下载这款热门的开源多媒体播放器。 从今年 2 月份开始,印度政府屏蔽了 VLC 播放器项目的网站及下载链接。印度用户访问该网站会显示 “根据电子信息技术部在 2000 年 IT 法下的命令,网站已被屏蔽” 的信息。 上个月 VLC 播放器开发商威胁起诉印度政府,声称印度机构在封杀其网站前没有通知他们,也没有给他们解释的机会。因此他们要求印度政府对封杀其域名 https://www.videolan.org/ 做出解释,给出合理理由并举行虚拟听证会,如果印度政府拒绝这一要求,VLC 播放器开发商会采取法律行动。 近日,印度政府解除了对 VLC 网站的相关禁令。根据外媒 Techcrunch 的报道,解禁 VLC 的公告不是来自印度政府,而是来自新德里的倡导组织——互联网自由基金会 (Internet Freedom Foundation, IFF),该组织为 VLC 的开发商VideoLAN 基金会提供“法律支持”。 从开始封禁 VL...
- 下一篇
直播预告| Apache EventMesh&Apache APISIX Meetup 来袭
11 月 19 日(周六)13:30,Apache APISIX 将联合微众银行的开源项目—— Apache EventMesh(Incubating)举办线上 Meetup,这也 Apache EventMesh 社区与Apache APISIX的第一次 Meetup! 本次活动将由腾讯、浙大网新(网新电气)、Apache EventMesh PPMC 成员及君润人力的四位技术大咖分享关于两个开源项目的开发与实践案例等话题,将为大家呈现一场技术内容丰富、实践参考性强的直播盛宴。 欢迎各位社区小伙伴及广大开源爱好者、开发者观看本次直播! 活动日程 活动时间:11月19日(周六)13:30-16:30 观看方式:EventMesh视频号 报名方式:扫描海报二维码,加入社群 关于 Apache EventMesh(Incubating) Apache EventMesh (Incubating)是一个用于解耦应用和后端中间件层的的动态云原生事件驱动架构基础设施。它支持广泛的用例,包括复杂的混合云、使用了不同技术栈的分布式架构。 GitHub:https://github.com/apach...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装