Table of Contents

在 xr-frame 微信小程序上播放透明視頻

開始之前

  • 準備需要播放的透明視頻:將透明視頻上傳至文件服務器並獲取用於在 xr-frame 中加載的 URL。

  • 由於透明視頻的播放依賴於替換場景中的貼圖,需要事先標註播放透明視頻的位置。 需要能夠使用 Unity 編輯器創建並上傳標註

什麼是透明視頻

透明視頻 是一種為了在不原生支持透明通道的視頻編碼格式(如 H.264/AVC, H.265/HEVC)中實現透明背景效果的技術方案。

該方案通過將視頻畫面的顏色信息 (RGB)透明度信息 (Alpha) 拆分,並按照特定的空間佈局拼接到同一幀圖像中,從而生成一個帶有黑白遮罩的普通視頻文件。在播放端,通過圖形渲染管線實時採樣並將兩部分合成,還原出具有透明背景的動態畫面。

根據顏色區域與 Alpha 區域的拼接方式,主要分為兩種格式:

  1. Side-by-Side (SBS)

    Side-by-Side 是一種將 RGB 顏色幀與 Alpha 遮罩幀在水平方向上並排拼接的格式。通常約定左側為顏色區域,右側為對應的灰度 Alpha 區域。

  2. Top-by-Bottom (TBB)

    Top-by-Bottom 是一種將 RGB 顏色幀與 Alpha 遮罩幀在垂直方向上堆疊拼接的格式。通常約定上半部分為顏色區域,下半部分為對應的灰度 Alpha 區域。

在 xr-frame 小程序上標註位置播放透明視頻

首先加載類型為 video-texture 的視頻資源。

async loadAsset() {
    const videoTexture = {
        assetId: "fireball",
        type: "video-texture",
        // 視頻資源 URL
        src: "url/video-resource.mp4",
        options: {
            autoPlay: true,
            loop: true,
        }
    };
    try {
        // 加載 video-texture 類型資源
        await scene.assets.loadAsset(videoTexture);
    } catch (err) {
        console.error(`Failed to load video texture: ${err.message}`);
    }
}

在 EMA 加載的回調中使用 scene.createElement(xrFrameSystem.XRMesh,{}) 創建簡單的幾何體賦予 easyar-video-tsbs 材質, 並修改 uniformu_baseColorMap:video-{$assetId}

附註

easyar-video-tsbseasyar-video-ttbb 材質的加載,註冊,反註冊,卸載由 AR Session 控制。

handleEmaResult(ema: easyar.ema.v0_5.Ema) {
    const blockHolder: easyar.BlockHolder = session.blockHolder;
    ema.blocks.forEach(emaBlock => {
        const blockInfo: easyar.BlockInfo = {
            id: emaBlock.id
        };
        // 若 Block 節點不存在,創建 Block 節點
        blockHolder.holdBlock(blockInfo, easyarPlugin.toXRFrame(emaBlock.transform));
    });
    ema.annotations.forEach(annotation => {
        if (annotation.type !== mega.EmaV05AnnotationType.Node) {
            return;
        }
        const nodeAnnotation = annotation as easyar.ema.v0_5.Node;
        const xrNode: xrfs.XRNode = easyarPlugin.createXRNodeFromNodeAnnotation(nodeAnnotation, blockHolder);
        const assetInfo = AnnotationMetaData[nodeAnnotation.id as keyof typeof AnnotationMetaData];
        let model: xrfs.Element;

        if (assetInfo) {
            // GLTF 部分
        } else {
            // 利用內置 Mesh 創建用於渲染的幾何體
            model = scene.createElement(xrFrameSystem.XRMesh, {
                geometry: "cube",
                material: "easyar-video-tsbs",
                uniforms: "u_baseColorMap:video-fireball",
            });
            xrNode.addChild(model);
        }
    });
}
附註

在使用 video-texture 時,若控制台出現 wx.createVideoDecoder with type: 'wemedia' is deprecated 警告,請忽略。

經與微信官方團隊確認,該警告不影響使用。

後續步驟

相關主題