首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Sony Ericsson JP-7 平台 Video Canvas 繪圖覆蓋技術

     編輯:Java 相關知識

前言

在 MMAPI 播放視頻或預覽攝像頭時,常需在畫面上疊加選單、十字準星、水印等圖形。Sony Ericsson JP-7 (如 K800, W950) 提供原生支援,JP-6 需技巧繞過。本文詳述兩種平台的實現方案。

JP-7 原生覆蓋模式

VideoControl.initDisplayMode() 參數編碼:

int mode = VideoControl.USE_DIRECT_VIDEO 
         | (overlay << 8) 
         | (Sprite.TRANS_ROT90 << 4);
videoControl.initDisplayMode(mode, canvas);
  • overlay = 1:繪圖覆蓋在視頻之上(透明背景)。
  • overlay = 0:繪圖在視頻之下(被遮擋)。
  • 低 4 位可指定旋轉變換(TRANS_ROT90 等),適配橫屏拍攝。

之後直接在 Canvas.paint(Graphics g) 繪制即可,系統自動合成。

JP-6 / 早期平台繞過方案

核心難點

視頻幀直接寫入顯示控制器,Canvas.paint() 繪制的內容會被下一幀視頻覆蓋。

解決策略:PlayerListener 同步 + setClip(0,0,0,0)


private boolean videoStarted = false;

public void playerUpdate(Player p, String event, Object obj) {
    if (p.getState() == Player.STARTED) {
        videoStarted = true; // 視頻已穩定輸出
    }
}

public void paint(Graphics g) {
    if (camera != null && camera.isInitialized()) {
        if (videoStarted && !updateFlag) {
            drawOverlay(g); // 繪制選單/十字線
            g.setClip(0, 0, 0, 0); // 關鍵:清空裁剪區,防止系統重繪視頻時清除覆蓋層
        } else if (updateFlag) {
            updateFlag = false; // 外部觸發重繪(如選單切換)
        }
    }
}

原理:setClip(0,0,0,0) 使後續系統繪制視頻幀時不清除已繪制的覆蓋像素(實測有效,屬廠商實現細節)。

效果展示

視頻覆蓋選單截圖

源碼下載

作者提供完整工程:UploadFiles/2007-1/18575526.zip(含 JP-6/JP-7 適配邏輯)。

參考資料

總結

JP-7 直接使用 overlay 參數最簡潔;JP-6 需監聽 Player 啟動事件並配合 setClip(0,0,0,0) 這一「黑科技」。實際開發建議運行時檢測平台版本動態選擇策略。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved