Liu Song’s Projects


~/Projects/FFCreator

git clone https://code.lsong.org/FFCreator

Commit

Commit
3ae0ebcc1c920a42c0442fe44d34b405fb1afeb8
Author
drawcall <[email protected]>
Date
2021-05-09 17:28:56 +0800 +0800
Diffstat
 docs/qa/qa.md | 2 
 examples/effect.js | 99 ++++++++++++++++++++++++++++
 examples/index.js | 153 ++++++++++++++++++++++---------------------
 lib/animate/effects.js | 20 +++++
 lib/creator.js | 12 +++
 lib/utils/utils.js | 20 -----
 package.json | 2 

feat: add createEffect method


diff --git a/docs/qa/qa.md b/docs/qa/qa.md
index 8523e7bee4090d9e180b5089fc26a9f5a9406925..20d3b4b3326a8f44710209874838ec3d5cb53a74 100755
--- a/docs/qa/qa.md
+++ b/docs/qa/qa.md
@@ -30,7 +30,7 @@ #### 解决
 
 这可能是由您的node版本引起的。如果是node`v15`,会出现此问题 [https://github.com/Automattic/node-canvas/issues/1645](https://github.com/Automattic/node-canvas/issues/1645)。请把node版本降低到`v14`。
 
-4. #### `FFCreator`在3个以上视频片段合成时速度不如图片快
+4. #### FFCreator在3个以上视频片段合成时速度不如图片快
 
 `FFCreator`在3个以上视频片段合成时速度不如图片快, 此时`FFCreatorLite`是更好的选择.
 




diff --git a/examples/animate.js b/examples/animate.js
deleted file mode 100755
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
Binary files a/examples/animate.js and /dev/null differ




diff --git a/examples/effect.js b/examples/effect.js
new file mode 100755
index 0000000000000000000000000000000000000000..d726369d5c7839f6eb4955e84ea7ab0fd1e39d0d
--- /dev/null
+++ b/examples/effect.js
@@ -0,0 +1,99 @@
+const path = require('path');
+const colors = require('colors');
+const startAndListen = require('./listen');
+const { FFCreatorCenter, FFScene, FFAlbum, FFText, FFImage, FFCreator } = require('../');
+
+const createFFTask = () => {
+  const logo2 = path.join(__dirname, './assets/imgs/logo/logo2.png');
+  const img1 = path.join(__dirname, './assets/imgs/album/01.jpeg');
+  const img2 = path.join(__dirname, './assets/imgs/album/02.jpeg');
+  const img3 = path.join(__dirname, './assets/imgs/album/03.jpeg');
+  const img4 = path.join(__dirname, './assets/imgs/album/04.jpeg');
+  const img5 = path.join(__dirname, './assets/imgs/album/05.jpeg');
+  const audio = path.join(__dirname, './assets/audio/03.wav');
+  const outputDir = path.join(__dirname, './output/');
+  const cacheDir = path.join(__dirname, './cache/');
+
+  // create creator instance
+  const width = 576;
+  const height = 1024;
+  const creator = new FFCreator({
+    cacheDir,
+    outputDir,
+    width,
+    height,
+    debug: false,
+    cacheType: 'jpg',
+    cacheQuality: 70,
+    cacheClarity: 80,
+    audio,
+  });
+
+  // add custom effect
+  creator.createEffect('customEffect1', {
+    from: { opacity: 0, y: 350, rotate: 190, scale: 0.3 },
+    to: { opacity: 1, y: 200, rotate: 0, scale: 1 },
+    ease: 'Back.Out',
+  });
+
+  creator.createEffect('customEffect2', {
+    from: { opacity: 0, x: -300, scale: 0.2 },
+    to: { opacity: 1, x: 0, scale: 1 },
+    ease: 'Back.InOut',
+  });
+
+  // create FFScene
+  const scene1 = new FFScene();
+  scene1.setBgColor('#3b3a98');
+
+  // add new album
+  const album = new FFAlbum({
+    list: [img1, img2, img3, img4, img5],
+    x: width / 2,
+    y: height / 2,
+    width: width,
+    height: 384,
+  });
+  album.setTransition('customEffect2');
+  album.setDuration(2);
+  scene1.addChild(album);
+
+  // add title
+  const text = new FFText({ text: '多图相册DEMO', x: width / 2, y: 150, fontSize: 40 });
+  text.setColor('#ffffff');
+  text.setBackgroundColor('#01003c');
+  text.addEffect('customEffect1', 1.8, 1);
+  text.alignCenter();
+  text.setStyle({ padding: [4, 20, 6, 20] });
+  scene1.addChild(text);
+
+  // add logo
+  const flogo2 = new FFImage({ path: logo2, x: width / 2, y: 60 });
+  flogo2.setScale(0.6);
+  flogo2.addEffect('backInDown', 1, 3);
+  scene1.addChild(flogo2);
+
+  scene1.setDuration(album.getTotalDuration() + 2);
+  creator.addChild(scene1);
+
+  ////////////////////////////////////////////////////////////////
+  creator.start();
+  creator.on('error', e => {
+    console.log(`FFCreator error: ${e.error}`);
+  });
+
+  creator.on('progress', e => {
+    console.log(colors.yellow(`FFCreator progress: ${e.state} ${(e.percent * 100) >> 0}%`));
+  });
+
+  creator.on('complete', e => {
+    console.log(
+      colors.magenta(`FFCreator completed: \n USEAGE: ${e.useage} \n PATH: ${e.output} `),
+    );
+    console.log(colors.green(`\n --- You can press the s key or the w key to restart! --- \n`));
+  });
+
+  return creator;
+};
+
+module.exports = () => startAndListen(() => FFCreatorCenter.addTask(createFFTask));




diff --git a/examples/index.js b/examples/index.js
index 859328fae9fc588321951b1ab7e41cfb6d5aba7c..e89a1370672f363373ef2b8ec1a769d78ae59b55 100755
--- a/examples/index.js
+++ b/examples/index.js
@@ -6,145 +6,148 @@ const imageDemo = require('./image');
 const albumDemo = require('./album');
 const cacheDemo = require('./cache');
 const videoDemo = require('./video');
+const effectDemo = require('./effect');
 const subtitleDemo = require('./subtitle');
 const transitionDemo = require('./transition');
 
+const printRestartInfo = () =>
+const albumDemo = require('./album');
 const path = require('path');
+
+const albumDemo = require('./album');
 const fs = require('fs-extra');
-const path = require('path');
+const albumDemo = require('./album');
 const colors = require('colors');
-const path = require('path');
+const albumDemo = require('./album');
 const inquirer = require('inquirer');
-      {
+};
 const path = require('path');
-const albumDemo = require('./album');
+const path = require('path');
-const path = require('path');
+const albumDemo = require('./album');
 const cacheDemo = require('./cache');
-const path = require('path');
+const albumDemo = require('./album');
 const videoDemo = require('./video');
-const path = require('path');
+const albumDemo = require('./album');
 const subtitleDemo = require('./subtitle');
-const fs = require('fs-extra');
+const cacheDemo = require('./cache');
-const fs = require('fs-extra');
+const cacheDemo = require('./cache');
 const path = require('path');
-const fs = require('fs-extra');
+const cacheDemo = require('./cache');
 const fs = require('fs-extra');
-const fs = require('fs-extra');
+  {
+const cacheDemo = require('./cache');
 const colors = require('colors');
-          {
-const fs = require('fs-extra');
+const cacheDemo = require('./cache');
 const inquirer = require('inquirer');
-const fs = require('fs-extra');
+const cacheDemo = require('./cache');
 const imageDemo = require('./image');
+const cacheDemo = require('./cache');
 const fs = require('fs-extra');
-const colors = require('colors');
-          {
+  {
-const fs = require('fs-extra');
+const cacheDemo = require('./cache');
 const albumDemo = require('./album');
-const fs = require('fs-extra');
+const cacheDemo = require('./cache');
 const cacheDemo = require('./cache');
-          },
+    func: subtitleDemo,
+const cacheDemo = require('./cache');
 const fs = require('fs-extra');
-const fs = require('fs-extra');
+const albumDemo = require('./album');
 const videoDemo = require('./video');
-const fs = require('fs-extra');
+const cacheDemo = require('./cache');
 const subtitleDemo = require('./subtitle');
-          },
-const fs = require('fs-extra');
+const videoDemo = require('./video');
-            name: 'Video animation demo',
-const colors = require('colors');
+const videoDemo = require('./video');
 const path = require('path');
+const cacheDemo = require('./cache');
 const fs = require('fs-extra');
-const colors = require('colors');
-          {
+  {
-const colors = require('colors');
+const videoDemo = require('./video');
 const fs = require('fs-extra');
-const colors = require('colors');
+const videoDemo = require('./video');
 const colors = require('colors');
-          },
+    func: videoDemo,
+const cacheDemo = require('./cache');
 const fs = require('fs-extra');
-            name: 'Clear all caches and videos',
+  {
-const colors = require('colors');
+const videoDemo = require('./video');
 const imageDemo = require('./image');
-          },
-const colors = require('colors');
+const videoDemo = require('./video');
 const albumDemo = require('./album');
-const colors = require('colors');
+const videoDemo = require('./video');
 const cacheDemo = require('./cache');
-const colors = require('colors');
+  },
+  {
+const videoDemo = require('./video');
 const videoDemo = require('./video');
-const colors = require('colors');
+const videoDemo = require('./video');
 const subtitleDemo = require('./subtitle');
-const inquirer = require('inquirer');
+const subtitleDemo = require('./subtitle');
-
+  },
+  {
-const inquirer = require('inquirer');
+const subtitleDemo = require('./subtitle');
 const path = require('path');
-const inquirer = require('inquirer');
+const subtitleDemo = require('./subtitle');
 const fs = require('fs-extra');
-const inquirer = require('inquirer');
+const subtitleDemo = require('./subtitle');
 const colors = require('colors');
-      printRestartInfo();
+  },
+const subtitleDemo = require('./subtitle');
 const inquirer = require('inquirer');
-const imageDemo = require('./image');
-      break;
+];
 
 const inquirer = require('inquirer');
+const path = require('path');
+  for (let i = 0; i < choices.length; i++) {
+const subtitleDemo = require('./subtitle');
 const cacheDemo = require('./cache');
-      printRestartInfo();
-const inquirer = require('inquirer');
+const subtitleDemo = require('./subtitle');
 const videoDemo = require('./video');
+      if (answer.val !== 'clear') printRestartInfo();
+      choice.func();
       break;
 const path = require('path');
 const path = require('path');
-const inquirer = require('inquirer');
+const imageDemo = require('./image');
 const subtitleDemo = require('./subtitle');
 const inquirer = require('inquirer');
-const inquirer = require('inquirer');
-const imageDemo = require('./image');
-      break;
 
-const imageDemo = require('./image');
 const path = require('path');
+const fs = require('fs-extra');
-      printRestartInfo();
+  for (let i = 0; i < choices.length; i++) {
+    const choice = choices[i];
-const imageDemo = require('./image');
+const transitionDemo = require('./transition');
 const fs = require('fs-extra');
-      break;
+  }
 
-const imageDemo = require('./image');
+const path = require('path');
 const colors = require('colors');
-const inquirer = require('inquirer');
+const path = require('path');
 const inquirer = require('inquirer');
+const path = require('path');
 const imageDemo = require('./image');
-const inquirer = require('inquirer');
-      break;
+        type: 'list',
 const path = require('path');
-const path = require('path');
+const cacheDemo = require('./cache');
-    case 'cache':
+        name: 'val',
-const inquirer = require('inquirer');
+const transitionDemo = require('./transition');
 const inquirer = require('inquirer');
+const transitionDemo = require('./transition');
 const imageDemo = require('./image');
-const albumDemo = require('./album');
-const inquirer = require('inquirer');
+const transitionDemo = require('./transition');
 const albumDemo = require('./album');
 const path = require('path');
-const path = require('path');
-const imageDemo = require('./image');
 const cacheDemo = require('./cache');
-const imageDemo = require('./image');
+const transitionDemo = require('./transition');
 const videoDemo = require('./video');
-      break;
-const imageDemo = require('./image');
+const transitionDemo = require('./transition');
 const subtitleDemo = require('./subtitle');
-};
 
-const albumDemo = require('./album');
-const albumDemo = require('./album');
 const path = require('path');
 
-const clearAllFiles = () => {
+      },
-const albumDemo = require('./album');
 const colors = require('colors');
+const videoDemo = require('./video');
-  fs.remove(path.join(__dirname, './cache'));
+    .then(runDemo);
 };
 
 initCommand();




diff --git a/lib/animate/effects.js b/lib/animate/effects.js
index e9d8d0cbbe109781f30ae13ff53b6ee662b33fbe..52eb61e2733f67f92c8b61a54838cd142d19066f 100755
--- a/lib/animate/effects.js
+++ b/lib/animate/effects.js
@@ -363,6 +363,26 @@ };
 
 /**
 
+  // Back In Out
+ * @param {string} name - the new effect name
+ * @param {object} valObj - the new effect value
+ * @public
+ */
+Effects.createEffect = function(name, valObj) {
+  const effect = {
+    // from: {},
+    // to: {},
+    time: 1.2,
+    delay: 0.1,
+    type: 'in',
+    ease: 'Linear.None',
+    ...valObj,
+  };
+  this.effects[name] = effect;
+};
+
+/**
+
  *     fadeOutTopLeft fadeOutTopRight fadeOutBottomRight fadeOutBottomLeft
  * @public
  */




diff --git a/lib/creator.js b/lib/creator.js
index 203af92ddacddb7c128181d88ef00ba7e1ff2f02..fd7f8c4f5699af485036c1cce36a9f27cd56e2fd 100755
--- a/lib/creator.js
+++ b/lib/creator.js
@@ -29,6 +29,8 @@ const FFAudio = require('./audio/audio');
 const FFLogger = require('./utils/logger');
 const FFmpegUtil = require('./utils/ffmpeg');
 
+/**
+
  * ####Example:
 
 class FFCreator extends FFCon {
@@ -145,6 +147,16 @@    * @public
    */
   addVtuber(vtuber) {
     this.vtuber = vtuber;
+  }
+
+  /**
+   * Create new effect and add to effects object
+   * @param {string} name - the new effect name
+   * @param {object} valObj - the new effect value
+   * @public
+   */
+  createEffect(name, valObj) {
+    Effects.createEffect(name, valObj);
   }
 
   /**




diff --git a/lib/utils/utils.js b/lib/utils/utils.js
index 274c25aa91062516f645c52548687dcca81d746d..d2ac4eb4581f85b3d16f58cdd8199363210a6503 100755
--- a/lib/utils/utils.js
+++ b/lib/utils/utils.js
@@ -154,26 +154,6 @@     return path.replace(/\/\//gi, '/');
   },
 
   /**
-   * Format pixels buffer data and convert to base64
-   * @param {buffer} pixels - pixels buffer
-   * @return {string} result base64 string value
-   * @public
-   */
-  bufferFormat({ pixels, width }) {
-    let t = 'data:image/png;base64,';
-    let i, z, l;
-    for (z = pixels.length - width * 4; z >= 0; z -= width * 4) {
-      l = z + width * 4;
-
-      for (i = z; i < l; i += 4) {
-        t += pixels[i] + ' ' + pixels[i + 1] + ' ' + pixels[i + 2] + ' ';
-      }
-    }
-
-    return t;
-  },
-
-  /**
    * toHash - Convert string to hash code
    * @param {string} str - Input string
    * @return {string} result hash string




diff --git a/package.json b/package.json
index 2094d480cdb80a74db3378ae7f39107a37310595..5c85858b1310851b33e6f42f693fd9b307e9d8df 100755
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "ffcreator",
-  "version": "2.0.4",
+  "version": "2.0.6",
   "description": "FFCreator is a lightweight and flexible short video production library",
   "main": "lib/index.js",
   "scripts": {