每日分享最新,最流行的软件开发知识与最新行业趋势,希望大家能够一键三连,多多支持,跪求关注,点赞,留言 。
在视频播放器中实施 HDR 的演练 。

文章插图
什么是 HDR 及其重要性
流媒体技术得到显着提升,视频分辨率越来越高,从480p或以下(称为标准清晰度或简称SD)到720p或以上(高清或简称HD) 。
视频分辨率对所有应用程序都至关重要 。我最近遇到的研究支持了这一点:62% 的人更有可能对提供低质量视频体验的品牌产生负面看法,而 57% 的人不太可能分享低质量的视频 。考虑到这一点,难怪有如此多的新兴解决方案来提高视频分辨率 。
一种解决方案是 HDR——高动态范围 。它是一种用于成像和摄影的后处理方法,通过为黑暗区域提供更多细节并提高对比度来模仿人眼可以看到的内容 。在视频播放器中使用时 , HDR 可以提供分辨率更高的更丰富的视频 。
然而,许多 HDR 解决方案都因烦人的限制而令人失望 。这些可能包括缺乏统一的技术规范,实施难度大 , 以及对超高清视频的要求 。我试图寻找没有此类限制的解决方案 , 幸运的是,我找到了一个 。这就是 HMS Core Video Kit 的HDR Vivid SDK 。该解决方案包含图像处理功能,例如光电传递函数 (OETF)、色调映射和 HDR2SDR 。有了这些功能 , SDK 可以为视频播放器配备更丰富的色彩、更高层次的细节等等 。
我将SDK与HDR Ability SDK(也可以单独使用)一起使用,试用了后者的亮度调节功能,发现它们可以提供更好的HDR视频播放体验 。在这一点上,我想分享一下我是如何使用这两个 SDK 来创建视频播放器的 。
开发前
1.在AppGallery Connect中根据需要配置应用信息 。
2、集成HMS Core SDK 。
对于 Android Studio,可以通过 Maven 存储库集成 SDK 。在开发过程之前,需要将SDK集成到Android Studio项目中 。
3. 配置混淆脚本 。
4、增加权限,包括访问互联网、获取网络状态、访问Wi-Fi网络、写入外接存储、读取外接存储数据、读取设备信息、查看设备是否root等权限获取唤醒锁 。(最后三个权限是可选的 。)

文章插图
应用程序开发
准备工作
1. 检查设备是否能够解码 HDR Vivid 视频 。如果设备具有这样的功能,则以下函数将返回true 。
public boolean isSupportDecode() {
// Check whether the device supports MediaCodec.
MediaCodecList mcList = new MediaCodecList(MediaCodecList.ALL_CODECS);
MediaCodecInfo[] mcInfos = mcList.getCodecInfos();
for (MediaCodecInfo mci : mcInfos) {
// Filter out the encoder.
if (mci.isEncoder()) {
continue;
}
String[] types = mci.getSupportedTypes();
String typesArr = Arrays.toString(types);
// Filter out the non-HEVC decoder.
if (!typesArr.contains("hevc")) {
continue;
}
for (String type : types) {
// Check whether 10-bit HEVC decoding is supported.
MediaCodecInfo.CodecCapabilities codecCapabilities = mci.getCapabilitiesForType(type);
for (MediaCodecInfo.CodecProfileLevel codecProfileLevel : codecCapabilities.profileLevels) {
if (codecProfileLevel.profile == HEVCProfileMain10
|| codecProfileLevel.profile == HEVCProfileMain10HDR10
|| codecProfileLevel.profile == HEVCProfileMain10HDR10Plus) {
// true means supported.
return true;
}
}
}
}
// false means unsupported.
return false;
2. 解析视频以获得有关其分辨率、OETF、色彩空间和色彩格式的信息 。然后将信息保存在自定义变量中 。在下面的示例中,变量被命名为VideoInfo 。
public class VideoInfo {
private int width;
private int height;
private int tf;
private int colorSpace;
private int colorFormat;
private long durationUs;
}
3. 创建一个SurfaceView对象 , SDK 将使用该对象处理渲染图像 。
// surface_view is defined in a layout file.
SurfaceView surfaceView = (SurfaceView) view.findViewById(R.id.surface_view);
4.创建一个线程来从视频中解析视频流 。
渲染和转码视频
1. 创建并初始化HdrVividRender实例 。
HdrVividRender hdrVividRender = new HdrVividRender();
hdrVividRender.init();
2. 配置视频源的 OETF 和分辨率 。
// Configure the OETF.
hdrVividRender.setTransFunc(2);
// Configure the resolution.
hdrVividRender.setInputVideoSize(3840, 2160);
SDK 在安卓设备上使用时 , 只支持输入的渲染模式 。
3. 配置输出亮度 。此步骤是可选的 。
hdrVividRender.setBrightness(700);
4. 创建一个Surface 对象,它将用作输入 。HdrVividRender工作在渲染模式时会调用该方法,将创建的Surface对象作为configure的inputSurface参数传递给SDK 。
Surface inputSurface = hdrVividRender.createInputSurface();
5. 配置输出参数 。
设置渲染的Surface对象的尺寸 。此步骤在输出的渲染模式中是必需的 。
// surfaceView is the video playback window.
hdrVividRender.setOutputSurfaceSize(surfaceView.getWidth(), surfaceView.getHeight());
设置缓冲输出视频的色彩空间,可在转码模式下设置输出 。此步骤是可选的 。但是,当没有设置颜色空间时,默认使用 BT.709 。
hdrVividRender.setColorSpace(HdrVividRender.COLORSPACE_P3);
设置缓冲输出视频的颜色格式,可在转码模式中设置输出 。此步骤是可选的 。但是 , 当没有指定颜色格式时,默认使用 R8G8B8A8 。
hdrVividRender.setColorFormat(HdrVividRender.COLORFORMAT_R8G8B8A8);
6. 当使用渲染模式作为输出模式时,需要以下API 。
hdrVividRender.configure(inputSurface, new HdrVividRender.InputCallback() {
@Override
public int onGetDynamicMetaData(HdrVividRender hdrVividRender, long pts) {
// Set the static metadata, which needs to be obtained from the video source.
HdrVividRender.StaticMetaData lastStaticMetaData = http://www.chy56.com/show/new HdrVividRender.StaticMetaData();
hdrVividRender.setStaticMetaData(lastStaticMetaData);
// Set the dynamic metadata, which also needs to be obtained from the video source.
ByteBuffer dynamicMetaData = http://www.chy56.com/show/ByteBuffer.allocateDirect(10);
hdrVividRender.setDynamicMetaData(20000, dynamicMetaData);
return 0;
}
}, surfaceView.getHolder().getSurface(), null);
7. 当使用转码模式作为输出模式时,调用如下接口 。
hdrVividRender.configure(inputSurface, new HdrVividRender.InputCallback() {
@Override
public int onGetDynamicMetaData(HdrVividRender hdrVividRender, long pts) {
// Set the static metadata, which needs to be obtained from the video source.
HdrVividRender.StaticMetaData lastStaticMetaData = http://www.chy56.com/show/new HdrVividRender.StaticMetaData();
hdrVividRender.setStaticMetaData(lastStaticMetaData);
// Set the dynamic metadata, which also needs to be obtained from the video source.
ByteBuffer dynamicMetaData = http://www.chy56.com/show/ByteBuffer.allocateDirect(10);
hdrVividRender.setDynamicMetaData(20000, dynamicMetaData);
return 0;
}
}, null, new HdrVividRender.OutputCallback() {
@Override
public void onOutputBufferAvailable(HdrVividRender hdrVividRender, ByteBuffer byteBuffer,
HdrVividRender.BufferInfo bufferInfo) {
// Process the buffered data.
}
});
new HdrVividRender.OutputCallback()用于异步处理返回的缓冲数据 。如果不使用该方法 , 可以使用read方法代替 。例如:
hdrVividRender.read(new BufferInfo(), 10); // 10 is a timestamp, which is determined by your app.
8. 启动处理流程 。
hdrVividRender.start();
9.停止处理流程 。
hdrVividRender.stop();
10.释放已经占用的资源 。
hdrVividRender.release();
hdrVividRender = null;

文章插图
在上述步骤中,我注意到当Surface的尺寸发生变化时,必须调用setOutputSurfaceSize来重新配置Surface输出的尺寸 。
此外,在输出的渲染模式下,当WisePlayer从后台切换到前台或从后台切换到前台时,Surface对象会被销毁并重新创建 。在这种情况下 , 有可能HdrVividRender实例没有被销毁 。如果是这样,则需要调用setOutputSurface API,以便可以设置新的Surface输出 。
设置 HDR 功能
HdrAbility类中提供了 HDR 功能 。可用于HDR Vivid SDK在渲染或转码HDR Vivid视频时调整亮度 。
1.初始化亮度调节功能 。
HdrAbility.init(getApplicationContext());
2. 在设备上启用 HDR 功能 。然后,设备屏幕的最大亮度将增加 。
HdrAbility.setHdrAbility(true);
3. 配置输出视频图像数据中白点的替代最大亮度 。
HdrAbility.setBrightness(600);
4. 使视频层高亮显示 。
HdrAbility.setHdrLayer(surfaceView, true);
5.配置高亮字幕层或弹幕评论层的功能 。
HdrAbility.setCaptionsLayer(captionView, 1.5f);
【使用 hdr 技术创建高清视频播放器】概括
视频分辨率是移动应用程序用户体验的重要影响因素 。HDR 通常用于后期处理视频,但它受到许多限制的阻碍,这些限制由 Video Kit 的 HDR Vivid SDK 解决 。
该 SDK 加载了图像处理功能,例如 OETF、色调映射和 HDR2SDR,因此它可以模仿人眼可以看到的内容,以提供身临其境的视频,这些视频可以在 HDR Ability SDK 的帮助下进一步增强相同的套件 。这些 SDK 的功能和直接的集成过程使其成为将 HDR 功能实施到移动应用程序中的理想选择 。
- 牡丹吊兰有毒吗,心叶日中花有毒吗
- 冰块怎么做不容易化,怎样让冰块保持不融化
- 抖音怎么制作手动翻照片,抖音图集怎么搞成自己翻?
- 中筋粉和高筋粉的区别有哪些,高筋面粉和中筋面粉的区别
- 锂保存在哪里,锂单质存放在哪?
- 老公生日送什么礼物,送老公生日礼物送什么比较有意义
- 炒蚬子用不用焯水,辣炒蚬子 是先煮一下呢 还是直接炒
- 雅泰角鲨烯胶囊的功效,角鲨烯软胶囊的功效与作用
- 海上交通与陆上交通相比,明显的优势有,陆上运输与海上运输的优势各是什么
- 中国五大名酒,中国五大名酒是什么?
