Closed itsgifnotjiff closed 2 years ago
I made this demo where I am currently using GIF.js to create a GIF by adding frame by frame custom canvas elements in a loop that looks like this :
async createGIFHandler ( layer , addAllTitles , quality , delay , range ) { ... var tempGIF = new GIF({ workers: 4, quality: quality, height: this.mapHeight + this.infoCanvas.height, width: this.mapWidth, workerScript: 'gif.worker.js' }); let progressCounter = 1; for ( let i = range[0] ; i < range[1] ; i++, progressCounter++ ) { this.setDateTime( driver , driverDA[i] ); for ( let j = 0 ; j < visibleLayers.length ; j++ ) { if ( visibleLayers[j].get('layerName') !== layer.Name ) { var tempDA = visibleLayers[j].get('layerDateArray'); for ( let k = 0 ; k < tempDA.length ; k++ ) { if ( driverDA[i].getTime() === tempDA[k].getTime() ) { this.setDateTime( visibleLayers[j] , tempDA[k] ); } } } } await new Promise(resolve => this.map.once('rendercomplete', resolve)); await this.composeCanvas( tempGIF , driverDA[i] , visibleLayers , delay , widths ) this.$store.dispatch('Layers/setGIFPercent', Math.round(((progressCounter / gifLength) * 100))) } tempGIF.on('finished', (blob) => { const tempURL = URL.createObjectURL( blob ) this.$store.dispatch( 'Layers/setGIFURL' , tempURL ) console.log('GIF Finished'); }); tempGIF.render(); }, async composeCanvas( gif , timeStep , visibleLayers , delayInput , widths ) { const mapCnv = this.getMapCanvas(); await this.updateInfoCanvas( timeStep , widths ) const composedCnv = await this.stitchCanvases( mapCnv , visibleLayers.length ); await new Promise((resolve) => { gif.addFrame(composedCnv, { delay: delayInput }); resolve(); }) }
My question is, would it be appropriate to use mp4box.js to replace GIF.js and if so how would I let the user set the fps and add the frames asynchronously?
gif.js seems to be an encoder. mp4box.js is not an encoder. It's rather a packager or file reader. You might want to use WebCodecs.
I made this demo where I am currently using GIF.js to create a GIF by adding frame by frame custom canvas elements in a loop that looks like this :
My question is, would it be appropriate to use mp4box.js to replace GIF.js and if so how would I let the user set the fps and add the frames asynchronously?