安卓手机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,见安卓的相机的例子.
注意的是,安卓使用低动态范围的方式进行快照.在屏幕快照时,
高动态范围的内容被映射为低动态范围的内容.

相关推荐

  1. 手机APP开发__媒体开发部分__播放器接口

    2024-04-30 06:00:08       13 阅读
  2. 手机APP开发__媒体开发部分__APK裁剪

    2024-04-30 06:00:08       16 阅读
  3. 手机APP开发__媒体开发部分__媒体

    2024-04-30 06:00:08       16 阅读
  4. 手机APP开发__媒体开发部分__媒体

    2024-04-30 06:00:08       14 阅读
  5. 手机APP开发__媒体开发部分__直播流

    2024-04-30 06:00:08       15 阅读
  6. 手机APP开发__媒体开发部分__网络栈

    2024-04-30 06:00:08       17 阅读
  7. 手机APP开发媒体相关内容播放列表

    2024-04-30 06:00:08       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-30 06:00:08       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-30 06:00:08       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-30 06:00:08       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-30 06:00:08       20 阅读

热门阅读

  1. 设计模式(四)、策略模式

    2024-04-30 06:00:08       11 阅读
  2. Python:将数组从一个范围等效到另一个范围

    2024-04-30 06:00:08       13 阅读
  3. github fork项目不带tag解决

    2024-04-30 06:00:08       14 阅读
  4. el-row中元素如何上下居中对齐?

    2024-04-30 06:00:08       16 阅读
  5. python基础知识

    2024-04-30 06:00:08       12 阅读
  6. leetcode15-3Sum

    2024-04-30 06:00:08       25 阅读