瀏覽代碼

feat: 添加vapx参数

hexleo 5 年之前
父節點
當前提交
0fb1b66007

+ 15 - 2
Android/PlayerProj/animtool/src/main/java/com/tencent/qgame/playerproj/animtool/AnimTool.java

@@ -202,7 +202,7 @@ public class AnimTool {
      * @param commonArg
      */
     private void createVapcJson(CommonArg commonArg) {
-        String json = "{\"info\":{\"v\":$(v),\"f\":$(f),\"w\":$(w),\"h\":$(h),\"videoW\":$(videoW),\"videoH\":$(videoH),\"orien\":0,\"fps\":$(fps),\"isVapx\":0,\"aFrame\":$(aFrame),\"rgbFrame\":$(rgbFrame)}}";
+        String json = "\"info\":{\"v\":$(v),\"f\":$(f),\"w\":$(w),\"h\":$(h),\"videoW\":$(videoW),\"videoH\":$(videoH),\"orien\":0,\"fps\":$(fps),\"isVapx\":0,\"aFrame\":$(aFrame),\"rgbFrame\":$(rgbFrame)}";
         json = json.replace("$(v)", String.valueOf(commonArg.version));
         json = json.replace("$(f)", String.valueOf(commonArg.totalFrame));
         json = json.replace("$(w)", String.valueOf(commonArg.rgbPoint.w));
@@ -212,6 +212,19 @@ public class AnimTool {
         json = json.replace("$(videoH)", String.valueOf(commonArg.outputH));
         json = json.replace("$(aFrame)", commonArg.alphaPoint.toString());
         json = json.replace("$(rgbFrame)", commonArg.rgbPoint.toString());
+
+        TLog.i(TAG, "{" + json + "}");
+
+        StringBuilder sb = new StringBuilder();
+        sb.append("{");
+        sb.append(json);
+        if (commonArg.isVapx) {
+            sb.append(",");
+            sb.append(commonArg.srcSet.toString());
+        }
+        sb.append("}");
+        json = sb.toString();
+
         try {
             BufferedWriter writer = new BufferedWriter(new FileWriter(commonArg.outputPath + VAPC_JSON_FILE));
             writer.write(json);
@@ -221,7 +234,7 @@ public class AnimTool {
             e.printStackTrace();
             throw new RuntimeException();
         }
-        TLog.i(TAG,json);
+
 
     }
 

+ 11 - 0
Android/PlayerProj/animtool/src/main/java/com/tencent/qgame/playerproj/animtool/CommonArg.java

@@ -16,6 +16,8 @@
 package com.tencent.qgame.playerproj.animtool;
 
 import com.tencent.qgame.playerproj.animtool.data.PointRect;
+import com.tencent.qgame.playerproj.animtool.vapx.FrameSet;
+import com.tencent.qgame.playerproj.animtool.vapx.SrcSet;
 
 public class CommonArg {
 
@@ -52,6 +54,15 @@ public class CommonArg {
 
     public int outputH = 0;
 
+    /**
+     * 融合动画相关参数
+     */
+
+    public boolean isVapx = false;
+
+    public SrcSet srcSet = new SrcSet();
+    public FrameSet frameSet = new FrameSet();
+
     @Override
     public String toString() {
         return "CommonArg{" +

+ 1 - 1
Android/PlayerProj/animtool/src/main/java/com/tencent/qgame/playerproj/animtool/CommonArgTool.java

@@ -22,7 +22,7 @@ class CommonArgTool {
         String os = System.getProperty("os.name");
         TLog.i(TAG, os);
 
-        if (commonArg.inputPath == null && commonArg.inputPath == "") {
+        if (commonArg.inputPath == null && "".equals(commonArg.inputPath)) {
             TLog.i(TAG, "error: input path invalid");
             return false;
         }

+ 93 - 1
Android/PlayerProj/animtool/src/main/java/com/tencent/qgame/playerproj/animtool/Main.java

@@ -17,15 +17,20 @@ package com.tencent.qgame.playerproj.animtool;
 
 
 import com.tencent.qgame.playerproj.animtool.ui.ToolUI;
+import com.tencent.qgame.playerproj.animtool.vapx.SrcSet;
 
 public class Main {
 
 
     public static void main(String[] args) throws Exception {
         // 启动UI界面
-        new ToolUI().run();
+        // new ToolUI().run();
+
         // java工具
         // animTool();
+
+        // 融合动画
+        animVapxTool();
     }
 
 
@@ -74,6 +79,93 @@ public class Main {
         // needVideo true 直接生成video false 生成帧图片,由用户手动生成最终视频文件
         animTool.create(commonArg, true);
     }
+
+
+    public static void animVapxTool() throws Exception {
+        final CommonArg commonArg = new CommonArg();
+        // ffmpeg 命令路径
+        commonArg.ffmpegCmd = "ffmpeg";
+        // bento4 mp4edit 命令路径
+        commonArg.mp4editCmd = "mp4edit";
+
+        String path = "/Users/hexleo/temp/moon/Demo/";
+        /*
+         * 是否开启h265(默认关闭)
+         * 优点:压缩率更高,视频更清晰
+         * 缺点:Android 4.x系统 & 极少部分低端机 无法播放265视频
+         */
+        commonArg.enableH265 = false;
+        // fps
+        commonArg.fps = 24;
+        // 素材文件路径
+        commonArg.inputPath = path + "video";
+        // alpha 区域缩放大小  (0.5 - 1)
+        commonArg.scale = 0.5f;
+        // 启动融合动画
+        commonArg.isVapx = true;
+        // src 设置
+        commonArg.srcSet = getSrcSet(path);
+
+
+        // 开始运行
+        AnimTool animTool = new AnimTool();
+        // needVideo true 直接生成video false 生成帧图片,由用户手动生成最终视频文件
+        animTool.create(commonArg, true);
+    }
+
+
+    private static SrcSet getSrcSet(String path) {
+        SrcSet srcSet = new SrcSet();
+
+        {
+            SrcSet.Src src = new SrcSet.Src();
+            src.srcPath = path + "mask1";
+            src.srcId = "1";
+            src.srcType = SrcSet.Src.SRC_TYPE_IMG;
+            src.srcTag = "head1";
+            src.fitType = SrcSet.Src.FIT_TYPE_CF;
+            srcSet.srcs.add(src);
+        }
+
+
+        {
+            SrcSet.Src src = new SrcSet.Src();
+            src.srcPath = path + "mask2";
+            src.srcId = "2";
+            src.srcType = SrcSet.Src.SRC_TYPE_IMG;
+            src.srcTag = "head2";
+            src.fitType = SrcSet.Src.FIT_TYPE_CF;
+            srcSet.srcs.add(src);
+        }
+
+        {
+            SrcSet.Src src = new SrcSet.Src();
+            src.srcPath = path + "mask3";
+            src.srcId = "3";
+            src.srcType = SrcSet.Src.SRC_TYPE_IMG;
+            src.srcTag = "text1";
+            src.fitType = SrcSet.Src.FIT_TYPE_FITXY;
+            src.color = "#0000ff";
+            src.style = SrcSet.Src.TEXT_STYLE_BOLD;
+            srcSet.srcs.add(src);
+        }
+
+        {
+            SrcSet.Src src = new SrcSet.Src();
+            src.srcPath = path + "mask4";
+            src.srcId = "4";
+            src.srcType = SrcSet.Src.SRC_TYPE_IMG;
+            src.srcTag = "text2";
+            src.fitType = SrcSet.Src.FIT_TYPE_FITXY;
+            src.color = "#00ff00";
+            src.style = SrcSet.Src.TEXT_STYLE_BOLD;
+            srcSet.srcs.add(src);
+        }
+
+
+        return srcSet;
+    }
+
     /**
      * 生成对应的box bin
      * 执行 mp4edit --insert :vapc.bin:1 demo_origin.mp4 demo_output.mp4 插入对应box

+ 6 - 2
Android/PlayerProj/animtool/src/main/java/com/tencent/qgame/playerproj/animtool/ui/ToolUI.java

@@ -39,8 +39,8 @@ public class ToolUI {
 
     private static final String TAG = "ToolUI";
     private static final String PROPERTIES_FILE = "setting.properties";
-    private final int WIDTH = 550;
-    private final int HEIGHT = 350;
+    private final int WIDTH = 800;
+    private final int HEIGHT = 600;
 
     private final ButtonGroup group = new ButtonGroup();
     private final JRadioButton btnH265 = new JRadioButton("h265");
@@ -55,6 +55,8 @@ public class ToolUI {
     private final Dimension labelSize = new Dimension(100, 20);
     private final Properties props = new Properties();
 
+    private final VapxUI vapxUI = new VapxUI();
+
 
 
     public void run() {
@@ -182,6 +184,8 @@ public class ToolUI {
         panel.add(getScaleLayout());
         // path
         panel.add(getPathLayout());
+        // vapx
+        panel.add(vapxUI.createUI());
         // create
         panel.add(getCreateLayout());
         // log

+ 33 - 0
Android/PlayerProj/animtool/src/main/java/com/tencent/qgame/playerproj/animtool/ui/VapxUI.java

@@ -0,0 +1,33 @@
+package com.tencent.qgame.playerproj.animtool.ui;
+
+import java.awt.FlowLayout;
+
+import javax.swing.BoxLayout;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+
+class VapxUI {
+
+
+    public JPanel createUI() {
+        JPanel panel = new JPanel();
+        panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
+
+        JPanel controlPanel = new JPanel();
+        controlPanel.setLayout(new BoxLayout(controlPanel, BoxLayout.PAGE_AXIS));
+
+
+        JScrollPane areaScrollPane = new JScrollPane(controlPanel);
+
+        for (int i = 0; i<100 ; i++) {
+            // controlPanel.add(new JLabel("codec:" + i));
+        }
+
+
+
+        panel.add(areaScrollPane);
+        return panel;
+    }
+
+}

+ 78 - 0
Android/PlayerProj/animtool/src/main/java/com/tencent/qgame/playerproj/animtool/vapx/FrameSet.java

@@ -0,0 +1,78 @@
+package com.tencent.qgame.playerproj.animtool.vapx;
+
+import com.tencent.qgame.playerproj.animtool.data.PointRect;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class FrameSet {
+
+
+    public List<FrameObj> frameObjs = new ArrayList<>();
+
+    @Override
+    public String toString() {
+        StringBuilder json = new StringBuilder();
+
+        json.append("\"frame\":[");
+        FrameSet.FrameObj frameObj;
+        for (int i=0; i<frameObjs.size(); i++) {
+            frameObj = frameObjs.get(i);
+            json.append(frameObj.toString());
+            if (i != frameObjs.size() - 1) {
+                json.append(",");
+            }
+        }
+
+        json.append("]");
+
+        return json.toString();
+    }
+
+    public static class FrameObj {
+        public List<Frame> frames = new ArrayList<>();
+        public int frameIndex = 0;
+
+        @Override
+        public String toString() {
+            StringBuilder json = new StringBuilder();
+
+            json.append("{");
+            json.append("\"i\":").append(frameIndex).append(",");
+            json.append("\"obj\":[");
+            FrameSet.Frame frame;
+            for (int i=0; i<frames.size(); i++) {
+                frame = frames.get(i);
+                json.append(frame.toString());
+                if (i != frames.size() - 1) {
+                    json.append(",");
+                }
+            }
+            json.append("]");
+            json.append("}");
+
+            return json.toString();
+        }
+    }
+
+    public static class Frame {
+        public String srcId = "";
+        public int z = 0;
+        public int mt = 0; // 旋转角度 目前只支持0
+        public PointRect frame = new PointRect(); // src位置
+        public PointRect mFrame = new PointRect(); // 遮罩区域
+
+
+        @Override
+        public String toString() {
+
+            return "{" +
+                    "\"srcId\":" + "\"" + srcId + "\"," +
+                    "\"z\":" + z + "," +
+                    "\"frame\":" + frame.toString() + "," +
+                    "\"mFrame\":" + mFrame.toString() + "," +
+                    "\"mt\":" + mt +
+                    "}";
+        }
+    }
+}

+ 90 - 0
Android/PlayerProj/animtool/src/main/java/com/tencent/qgame/playerproj/animtool/vapx/SrcSet.java

@@ -0,0 +1,90 @@
+package com.tencent.qgame.playerproj.animtool.vapx;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SrcSet {
+
+
+    public List<Src> srcs = new ArrayList<>();
+
+
+    public static class Src {
+
+        public static final String SRC_TYPE_IMG = "img";
+        public static final String SRC_TYPE_TXT = "txt";
+
+        public static final String LOAD_TYPE_NET = "net";
+        public static final String LOAD_TYPE_LOC = "local";
+
+        public static final String TEXT_STYLE_DEFAULT = "";
+        public static final String TEXT_STYLE_BOLD = "b";
+
+        public static final String FIT_TYPE_FITXY = "fitXY";
+        public static final String FIT_TYPE_CF = "centerFull"; // 同centerCrop
+
+        /**
+         * src 配置
+         */
+        public String srcId = "";
+        public String srcType = SRC_TYPE_IMG;
+        public String loadTyp = LOAD_TYPE_NET;
+        public String srcTag = "";
+        public String color = "#000000";
+        public String style = TEXT_STYLE_DEFAULT;
+        public int w = 0;
+        public int h = 0;
+        public String fitType = FIT_TYPE_FITXY;
+
+        /**
+         * src 辅助信息
+         */
+        public String srcPath = "";
+        public int z = 0; // 渲染层级 与输入顺序相关
+
+        @Override
+        public String toString() {
+            StringBuilder json = new StringBuilder();
+            json.append("{");
+            json.append("\"srcId\":").append("\"").append(srcId).append("\",");
+            json.append("\"srcType\":").append("\"").append(srcType).append("\",");
+            json.append("\"srcTag\":").append("\"").append(srcTag.trim()).append("\",");
+            if (SRC_TYPE_TXT.equals(srcType)) {
+                if (color != null && color != null) {
+                    json.append("\"color\":").append("\"").append(color.trim()).append("\",");
+                }
+                json.append("\"style\":").append("\"").append(style).append("\",");
+                json.append("\"loadTyp\":").append("\"").append(LOAD_TYPE_LOC).append("\",");
+            } else {
+                json.append("\"loadTyp\":").append("\"").append(loadTyp).append("\",");
+            }
+
+
+            json.append("\"fitType\":").append("\"").append(fitType).append("\",");
+            json.append("\"w\":").append(w).append(",");
+            json.append("\"h\":").append(h);
+            json.append("}");
+
+            return json.toString();
+        }
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder json = new StringBuilder();
+
+        json.append("\"src\":[");
+        Src src;
+        for (int i=0; i<srcs.size(); i++) {
+            src = srcs.get(i);
+            json.append(src.toString());
+            if (i != srcs.size() - 1) {
+                json.append(",");
+            }
+        }
+
+        json.append("]");
+
+        return json.toString();
+    }
+}