~/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": {