安卓手机APP开发__媒体开发部分__高动态范围的视频播放

安卓手机APP开发__媒体开发部分__高动态范围的视频播放

目录

高动态范围的概述

设备的前提条件

检查高动态范围的播放的支持

在你的APP中设置高动态范围的播放

使用SurfaceView来设置MediaCodec


高动态范围的概述

高动态范围提供了一个宽的范围的颜色和最亮的白色与最暗的阴影之间的更强的对比.
这让视频质量更加地接近人眼所见到的影像.

你能通过在你的APP的预览中设置高动态范围的播放,并且播放高动态范围的视频内容.

设备的前提条件

不是所有的安卓设备都支持高动态范围的播放.在你的APP播放高动态范围的视频内容之前,
确定你的设备是否满足如下的前提条件:

目标的安卓版本是7.0或者更高(API级别是24)
有一个能够做高动态范围的视频的解码器,能够做高动态范围视频的显示器.

检查高动态范围的播放的支持

使用Display.getHdrCapabilities()来查询一个显示器的高动态范围的视频能力.
这个方法返回被支持的高动态范围的概要信息和显示器的亮度范围.

如下的代码检查设备是否支持HLG10播放.从安卓13开始,如果设备能支持
高动态范围的播放,HLG10是设备制造商必须支持的最低标准.

Kotlin

// Check if display supports the HDR type
val capabilities = display?.hdrCapabilities?.supportedHdrTypes ?: intArrayOf()
if (!capabilities.contains(HDR_TYPE_HLG)) {
  throw RuntimeException("Display does not support desired HDR type");
}

在你的APP中设置高动态范围的播放

如果你的APP使用ExoPlayer,它默认支持高动态范围的视频的播放.
为了检查高动态范围的支持,看下一步.

如果你的APP不使用ExoPlayer,以SurfaceView为基础,使用MediaCodec来设置
高动态范围的播放.

注意的是,在安卓13及以上的版本的TextureView上,对高动态范围的
视频的播放有有限的支持. 当播放高动态范围的内容进,TextureView把
视频从高动态范围转到低动态范围,这导致在播放中,可能有细节上的损失,
包括被截短的颜色和视频条带.如果可能的话,你应该使用SurfaceView,来实现
高动态范围的播放.


使用SurfaceView来设置MediaCodec

使用SurfaceView来设置一个标准的MediaCodec的播放流.这允许你显示
高动态范围的内容,而不用任何特殊的针对高动态范围的视频的播放的处理.


    MediaCodec: 解码高动态范围的视频的内容.
    SurfaceView: 显示高动态范围的视频的内容.

如下的代码检查了codec是否支持高动态范围的概要,然后使用SurfaceView来设置
MediaCodec.

Kotlin

// Check if there's a codec that supports the specific HDR profile
val list = MediaCodecList(MediaCodecList.REGULAR_CODECS) var format = MediaFormat() /* media format from the container */;
format.setInteger(MediaFormat.KEY_PROFILE, MediaCodecInfo.CodecProfileLevel.AV1ProfileMain10)
val codecName = list.findDecoderForFormat (format) ?: throw RuntimeException ("No codec supports the format")

// Here is a standard MediaCodec playback flow
val codec: MediaCodec = MediaCodec.createByCodecName(codecName);
val surface: Surface = surfaceView.holder.surface
val callback: MediaCodec.Callback = (object : MediaCodec.Callback() {
   override fun onInputBufferAvailable(codec: MediaCodec, index: Int) {
      queue.offer(index)
   }

   override fun onOutputBufferAvailable(
      codec: MediaCodec,
      index: Int,
      info: MediaCodec.BufferInfo
   ) {
      codec.releaseOutputBuffer(index, timestamp)
   }

   override fun onError(codec: MediaCodec, e: MediaCodec.CodecException) {
      // handle error
   }

   override fun onOutputFormatChanged(
      codec: MediaCodec, format: MediaFormat
   ) {
      // handle format change
   }
})

codec.setCallback(callback)
codec.configure(format, surface, crypto, 0 /* flags */)
codec.start()
while (/* until EOS */) {
   val index = queue.poll()
   val buffer = codec.getInputBuffer(index)
   buffer?.put(/* write bitstream */)
   codec.queueInputBuffer(index, offset, size, timestamp, flags)
}
codec.stop()
codec.release()

对于更多的使用SurfaceView的MediaCodec,见安卓的相机的例子.
注意的是,安卓使用低动态范围的方式进行快照.在屏幕快照时,
高动态范围的内容被映射为低动态范围的内容.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/582822.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

命令执行。

命令执行 在该项目的readme中,描述了怎么去调用的flink 通过java原生的runtime来调用flink,下一步就是去看看具体的调用过程了,是否存在可控的参数 找到具体提交命令的类方法CommandRpcClinetAdapterImpl#submitJob() 这里要确定command&am…

SAP-ERP TM运输管理模块详解-3

9、定义采购数据结算 事务代码及配置路径: TCODE: SPRO 路径:IMG > 后勤执行 > 运输 > 装运成本 > 结算 > 分配采购数据。详见图9-1。 配置路径截图: 、 如图9-2所示,配置根据计划运输点Z001装运成本类型Z001…

国家强制标准来了!契约锁如何帮您合规签署8项特殊作业票

“作业票”是明确现场施工内容、排查作业风险、落实安全措施的授权许可票,也是现场施工作业安全管理的第一道关口。 近年国家应急管理部组织修订的国家标准《危险化学品企业特殊作业安全规范》(GB 30871-2022)已将“8大特殊作业票”的部分管理…

【机器学习-19】集成学习---投票法(Voting)

一、引言 集成学习(Ensemble Learning)是机器学习领域中的一种重要策略,它通过结合多个模型的预测结果来提高整体性能。在单个模型容易过拟合或欠拟合的情况下,集成学习能够通过综合多个模型的优点来减少这种风险,从而…

代码量应该和数据结构的学习深度成比例。

在开始前我有一些资料,是我根据网友给的问题精心整理了一份「数据结构的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! 代码量少,敲个…

2024年水资源保护盛事,“澜湄周”邀请国信华源加入!

4月26日,2024年水资源领域“澜湄周”活动在北京举行。水利部国科司、外交部亚洲司和边海司、湄公河五国驻华使馆以及澜湄水资源合作单位的代表嘉宾出席活动。北京国信华源公司特邀参加,现场就深化澜湄水资源合作展开深入交流研讨。 澜湄六国,…

软件测试用例模板

今天给大家分享下测试用例模板包含哪些内容: 1、测试项:[测试项名称] 2、测试用例标题:[测试用例标题] 3、优先级:[测试用例的优先级,冒烟用例为P0,基础用例P1等] 4、前置条件:[列出执行该测…

LeetCode_(兜兜转转还是你)浪漫的环形链表问题

✨✨所属专栏:LeetCode刷题专栏✨✨ ✨✨作者主页:嶔某✨✨ 第一题: 这道题的代码很简单,但是后续的一些问题在思考的过程是很复杂的。下面我们就一起来分析一下吧! 链表带环的意思就是说链表的某个节点的next指针指向…

定位系统源码,工厂人员定位系统源码,UWB高精度定位系统源码

一套java定位系统源码,工厂人员定位系统源码,UWB高精度定位系统源码,前后端分离架构,源码有演示。 工厂人员定位系统,高精度的位置数据作为智能工厂数据流的重要组成部分,可实现对工厂内的人,车…

环状串的字典序

【题目描述】 长度为n的环状串有n种表示法,分别为从某个位置开始顺时针得到。例如,图3-4的环状串有10种表示: CGAGTCAGCT,GAGTCAGCTC,AGTCAGCTCG等。在这些表示法中,字典序最小的称为"最小表示"…

利用GaussDB的可观测性能力构建故障模型

D-SMART高斯专版已经开发了几个月了,目前主要技术问题都已经解决,也能够初步看到大概的面貌了。有朋友问我,GaussDB不已经有了TPOPS了,为什么你们还要开发D-SMART高斯专版呢? 实际上TPOPS和D-SMART虽然都可以用于Gaus…

区块链技术下的DApp与电商:融合创新,开启商业新纪元

区块链技术的蓬勃发展正引领着一种新型应用程序的崛起——去中心化应用程序(DApp)。DApp并非传统的中心化应用,它构建于去中心化网络之上,融合了智能合约与前端用户界面,为用户提供了全新的交互体验。智能合约&#xf…

01.Kafka简介与基本概念介绍

1 Kafka 简介 Kafka 是最初由 Linkedin公司开发,是一个分布式、支持分区(partition)的、多副本(replica)的,基于 Zookeeper 协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于 hadoop 的…

算法工程师——算法岗的分类及要求汇总

算法岗工程师 根据 Talent Seer 人才报告显示,全球 AI 从业者总人数约有 30 万,还是供不应求,其中 AI 技术专家(具有相关领域博士学位及 3 年以上工作经验的)约有 3.65 万。 简介 对于计算机专业的毕业生而言,算法岗基本上就是 「高薪」 的代名词。 在当今 IT 行业,算…

如何将本地项目上传到Github(SSH方式)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

训练营第三十七天动态规划(基础题part3)

训练营第三十七天动态规划(基础题part3) 343. 整数拆分 力扣题目链接 题目 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 …

一篇文章 学会Qt 样式表(qss)

QML 中风格和主题的设计可以通过配置文件选择现有几种中的一种,或者直接在控件定义时,指定其属性,如背景颜色或者字体大小。在QWidget框架中,则通过了一种叫做qss样式表的东西来进行描述,跟CSS逻辑上类似。 这个qss抽…

【Redis 开发】多级缓存,本地进程缓存Caffeine

多级缓存 多级缓存本地进程缓存CaffeineCaffeine三种缓存驱逐策略 多级缓存 Redis处理并发的能力是非常强大的,但是tomcat的支持并发的能力跟不上Redis的性能,导致整体性能的下降 Redis缓存失效时,会对数据库产生冲击,之间再无屏…

自动驾驶横向控制算法

本文内容来源是B站——忠厚老实的老王,侵删。 三个坐标系和一些有关的物理量 使用 frenet坐标系可以实现将车辆纵向控制和横向控制解耦,将其分开控制。使用右手系来进行学习。 一些有关物理量的基本概念: 运动学方程 建立微分方程 主要是弄…

软件测试之学习及复习面试路线汇总

对于很多想通过自学或面试复习软件测试的同学,痛点并不是学习动力,而是找不到清晰的学习思路。 熬夜3天,吐血整理了这份《软件测试学习路线》,全文接近6000字,请大家耐心看完! 软件测试职业成长图 第一阶…