視頻服務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
  • 周末,寫點簡單的水一下。 新版本的vs創建項目的時候可以選擇自帶一個swagger。然而這隻是基本的swagger功能。 幾個介面無所謂啦,隨著介面越來越多,就這麼丟給你,一時間也會懵逼,所以這篇文章要做的有兩個功能。 給swagger文檔添加註釋 給swagger添加切換“版本”的功能(也可以理解 ...
  • 大家好,我是沙漠盡頭的狼。 本文首發於Dotnet9,介紹使用Lib.Harmony庫攔截第三方.NET庫方法,達到不修改其源碼並能實現修改方法邏輯、預期行為的效果,並且不限於只攔截public訪問修飾的類及方法,行文目錄: 什麼是方法攔截? 示常式序攔截 非public方法怎麼攔截? 總結 1. ...
  • 問題代碼: xmal:一個按鈕+一個顯示框 1 <Button Width="100" Height="50" Margin="10" Click="Button_Click">test</Button> 2 <TextBox x:Name="display" Width="300" Height= ...
  • 前置條件 ​ 阿裡雲伺服器一臺(可在購買伺服器時勾選安裝寶塔選項,免去後面的寶塔安裝) ​ 設置阿裡雲伺服器密碼並登陸伺服器 ​ 以下操作均在伺服器Linux中進行(使用遠程連接工具登錄) 寶塔登錄 登錄阿裡雲伺服器在Linux命令行中輸入bt,查看寶塔信息 ​ 根據寶塔信息提供的網站登陸寶塔服務( ...
  • GetTokenInformation 用於檢索進程或線程的令牌(Token)信息。Token是一個數據結構,其包含有關進程或線程的安全上下文,代表當前用戶或服務的安全標識符和許可權信息。GetTokenInformation函數也可以用來獲取這些安全信息,通常用於在運行時檢查某個進程或線程的許可權或安... ...
  • matplotlib 在1.0版本之前其實是不支持3D圖形繪製的。 後來的版本中,matplotlib加入了3D圖形的支持,不僅僅是為了使數據的展示更加生動和有趣。更重要的是,由於多了一個維度,擴展了其展示數據分佈和關係的能力,可以一次從三個維度來比較數據。 下麵介紹在matplotlib中繪製各類 ...
  • 編寫一個App就能編譯發佈到iOS、Android和Web等各大平臺的跨平臺技術,各大廠商一直都有研究和發佈對應技術產品,目前最熱門的莫過於Flutter框架了。而Dart作為其唯一的編程語言,今天我們開始來體驗一下…… ...
  • 實現基本的線程池 前提:我們要實現的線程池有如下功能: 基本的線程池模型 能提交和運行任務 能正常關閉線程池 線程的拒絕策略 線程池擴容 縮容線程池 代碼地址: 1、線程池的介紹? 線程池是什麼? 線程池是一種利用池化技術來管理線程的一種技術。 當沒有線程池的時候,我們如何創建線程? 繼承Threa ...
  • SDRAM基本信息 儲存能力計算 4X16X4=256(Mbit),註意不是MByte SDRAM控制 sdram包含兩個部分:sdram_ctrl、fifo_ctrl。 sdram_ctrl:其頂層為SDRAM的控制模塊內部實例化了5個模塊,有初始化、自刷新、寫和讀模塊,還有一個仲裁模塊對這四個不 ...
  • 歡迎訪問我的GitHub 這裡分類和彙總了欣宸的全部原創(含配套源碼):https://github.com/zq2599/blog_demos 本篇概覽 欣宸正在為接下新的Java雲原生實戰系列原創做準備,既然是實戰,少不了一套雲原生環境,以下內容是必不可少的: linux操作系統 kuberne ...