視頻服務HDR Vivid 還原色彩,讓所見成“真”

来源:https://www.cnblogs.com/hmscore/archive/2022/11/16/16895826.html
-Advertisement-
Play Games

如今,視頻正在以一種前所未有的方式滲入日常生活,是當下人們記錄生活最熱門的方式。所以,用戶對視頻的畫質要求越來越高,App想要吸引更多的用戶,擁有視頻畫質新技術的強力支撐很關鍵。 HDR(High-Dynamic Range)就是一種提高影像亮度和對比度的處理技術。它可以將每個暗部的細節變亮,增加對 ...


如今,視頻正在以一種前所未有的方式滲入日常生活,是當下人們記錄生活最熱門的方式。所以,用戶對視頻的畫質要求越來越高,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 最新技術資訊~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • //源文件 void RccPhyConfig() { uint16_t retry = 0; RCC->APB1ENR|=1<<28; //電源介面時鐘使能 PWR->CR1|=3<<14; //高性能模式,時鐘可到 180Mhz PWR->CR1|=1<<16; //使能過驅動,頻率可到 216 ...
  • Babelfish是在PostgreSQL的基礎之上實現了類似Microsoft SQL Server部分功能。為了實現這個目標,PostgreSQL核心內部的幾個部分必須被修改。PostgreSQL 沒有提供這種開箱即用的功能,因此必須提供附加組件才能實現這一點。 Babelfish... ...
  • 摘要:數據加密作為有效防止未授權訪問和防護數據泄露的技術,在各種信息系統中廣泛使用。作為信息系統的核心,GaussDB(DWS)數倉也提供數據加密功能,包括透明加密和使用SQL函數加密。 本文分享自華為雲社區《看GaussDB(DWS)如何使用SQL加密函數實現數據列加解密》,作者:Hello EI ...
  • 近年來,憑藉高可擴展、高可用等技術特性,分散式資料庫正在成為金融行業數字化轉型的重要支撐。分散式資料庫如何在不同的金融級應用場景下,在確保數據一致性的前提下,同時保障系統的高性能和高可擴展性,是分散式資料庫的一個核心技術挑戰。 針對以上分散式一致性的困境,中國人民大學-騰訊協同創新實驗室研究提出“多 ...
  • ​摘要:賬本資料庫融合了區塊鏈思想,將用戶操作記錄至兩種歷史表中:用戶歷史表和全局區塊表。 本文分享自華為雲社區《openGauss賬本資料庫,你不知道的那些事兒》,作者:Gauss松鼠會。 賬本資料庫融合了區塊鏈思想,將用戶操作記錄至兩種歷史表中:用戶歷史表和全局區塊表。當用戶創建防篡改用戶表時, ...
  • 引子 在使用events_statements_current的過程中發現,同一線程在同一時刻,可能有多條記錄,與直觀感覺不太一樣,於是跟蹤了一下內部實現,有了本文。 STATEMENT STACK的定義 STATEMENT STACK 是events_statements_current表被後用於 ...
  • 對於開發人員而言,資料庫的增刪改查操作才是最常使用的功能,學習 MongoDB 時還需對這些功能熟記於心才行啊。我就在這裡做一個簡單的備忘,多看官方文檔才是正道。 ...
  • 1.從官網下載 官網下載對應版本 https://www.elastic.co/cn/downloads/past-releases#kibana 2.解壓縮 tar -xvf kibana-7.15.2-linux-x86_64.tar.gz 3.修改配置文件 server.port: 5601 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...