如今,視訊正在以一種前所未有的方式滲入日常生活,是當下人們記錄生活最熱門的方式。所以,使用者對視訊的畫質要求越來越高,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配合使用。
針對Android Studio開發環境,華為提供了Maven倉整合方式的HMS Core SDK包。在開始開發前,您需要將HMS Core SDK整合到您的Android Studio開發環境中。
4. 新增許可權
檢查裝置是否具有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.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。
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);
瞭解更多詳情>>
存取華為開發者聯盟官網
獲取開發指導檔案
華為移動服務開源倉庫地址:GitHub、Gitee
關注我們,第一時間瞭解 HMS Core 最新技術資訊~