Browse Source

rename to speedFactor

pull/81/head
Mikael Finstad 6 years ago
parent
commit
2fc8e913b1
  1. 10
      audio.js
  2. 2
      ffmpeg.js
  3. 14
      parseConfig.js
  4. 10
      sources/videoFrameSource.js

10
audio.js

@ -39,7 +39,7 @@ module.exports = ({ ffmpegPath, ffprobePath, enableFfmpegLog, verbose }) => {
if (audioLayers.length > 0) { if (audioLayers.length > 0) {
const processedAudioLayersRaw = await pMap(audioLayers, async (audioLayer, j) => { const processedAudioLayersRaw = await pMap(audioLayers, async (audioLayer, j) => {
const { path, cutFrom, audioCutTo, framePtsFactor } = audioLayer;
const { path, cutFrom, audioCutTo, speedFactor } = audioLayer;
const streams = await readFileStreams(ffprobePath, path); const streams = await readFileStreams(ffprobePath, path);
if (!streams.some((s) => s.codec_type === 'audio')) return undefined; if (!streams.some((s) => s.codec_type === 'audio')) return undefined;
@ -48,9 +48,9 @@ module.exports = ({ ffmpegPath, ffprobePath, enableFfmpegLog, verbose }) => {
try { try {
let atempoFilter; let atempoFilter;
if (Math.abs(framePtsFactor - 1) > 0.01) {
if (verbose) console.log('audio framePtsFactor', framePtsFactor);
const atempo = (1 / framePtsFactor);
if (Math.abs(speedFactor - 1) > 0.01) {
if (verbose) console.log('audio speedFactor', speedFactor);
const atempo = (1 / speedFactor);
if (!(atempo >= 0.5 && atempo <= 100)) { // Required range by ffmpeg if (!(atempo >= 0.5 && atempo <= 100)) { // Required range by ffmpeg
console.warn(`Audio speed ${atempo} is outside accepted range, using silence (clip ${i})`); console.warn(`Audio speed ${atempo} is outside accepted range, using silence (clip ${i})`);
return undefined; return undefined;
@ -58,7 +58,7 @@ module.exports = ({ ffmpegPath, ffprobePath, enableFfmpegLog, verbose }) => {
atempoFilter = `atempo=${atempo}`; atempoFilter = `atempo=${atempo}`;
} }
const cutToArg = (audioCutTo - cutFrom) * framePtsFactor;
const cutToArg = (audioCutTo - cutFrom) * speedFactor;
const args = [ const args = [
...getFfmpegCommonArgs({ enableFfmpegLog }), ...getFfmpegCommonArgs({ enableFfmpegLog }),

2
ffmpeg.js

@ -4,7 +4,7 @@ const getFfmpegCommonArgs = ({ enableFfmpegLog }) => (enableFfmpegLog ? [] : ['-
const getCutFromArgs = ({ cutFrom }) => (cutFrom ? ['-ss', cutFrom] : []); const getCutFromArgs = ({ cutFrom }) => (cutFrom ? ['-ss', cutFrom] : []);
const getCutToArgs = ({ cutTo, cutFrom, framePtsFactor }) => (cutTo ? ['-t', (cutTo - cutFrom) * framePtsFactor] : []);
const getCutToArgs = ({ cutTo, cutFrom, speedFactor }) => (cutTo ? ['-t', (cutTo - cutFrom) * speedFactor] : []);
async function createConcatFile(segments, concatFilePath) { async function createConcatFile(segments, concatFilePath) {
// https://superuser.com/questions/787064/filename-quoting-in-ffmpeg-concat // https://superuser.com/questions/787064/filename-quoting-in-ffmpeg-concat

14
parseConfig.js

@ -154,7 +154,7 @@ async function parseConfig({ defaults: defaultsIn = {}, clips, allowRemoteReques
// This feature allows the user to show another layer overlayed (or replacing) parts of the lower layers (visibleFrom - visibleUntil) // This feature allows the user to show another layer overlayed (or replacing) parts of the lower layers (visibleFrom - visibleUntil)
const visibleDuration = ((visibleUntil || clipDuration) - visibleFrom); const visibleDuration = ((visibleUntil || clipDuration) - visibleFrom);
assert(visibleDuration > 0 && visibleDuration <= clipDuration, `Invalid visibleFrom ${visibleFrom} or visibleUntil ${visibleUntil} (${clipDuration})`); assert(visibleDuration > 0 && visibleDuration <= clipDuration, `Invalid visibleFrom ${visibleFrom} or visibleUntil ${visibleUntil} (${clipDuration})`);
// TODO Also need to handle video layers (framePtsFactor etc)
// TODO Also need to handle video layers (speedFactor etc)
// TODO handle audio in case of visibleFrom/visibleTo // TODO handle audio in case of visibleFrom/visibleTo
const layer = { ...layerIn, visibleFrom, visibleDuration }; const layer = { ...layerIn, visibleFrom, visibleDuration };
@ -176,28 +176,28 @@ async function parseConfig({ defaults: defaultsIn = {}, clips, allowRemoteReques
const inputDuration = cutTo - cutFrom; const inputDuration = cutTo - cutFrom;
const framePtsFactor = clipDuration / inputDuration;
const speedFactor = clipDuration / inputDuration;
// Compensate for transition duration // Compensate for transition duration
const audioCutTo = Math.max(cutFrom, cutTo - transition.duration); const audioCutTo = Math.max(cutFrom, cutTo - transition.duration);
return { ...layer, cutFrom, cutTo, audioCutTo, framePtsFactor };
return { ...layer, cutFrom, cutTo, audioCutTo, speedFactor };
} }
if (layer.type === 'video') { if (layer.type === 'video') {
const { inputDuration } = layer; const { inputDuration } = layer;
let framePtsFactor;
let speedFactor;
// If user explicitly specified duration for clip, it means that should be the output duration of the video // If user explicitly specified duration for clip, it means that should be the output duration of the video
if (userClipDuration) { if (userClipDuration) {
// Later we will speed up or slow down video using this factor // Later we will speed up or slow down video using this factor
framePtsFactor = userClipDuration / inputDuration;
speedFactor = userClipDuration / inputDuration;
} else { } else {
framePtsFactor = 1;
speedFactor = 1;
} }
return { ...layer, framePtsFactor };
return { ...layer, speedFactor };
} }
return layer; return layer;

10
sources/videoFrameSource.js

@ -6,7 +6,7 @@ const { readFileStreams } = require('../util');
const { rgbaToFabricImage, blurImage } = require('./fabric'); const { rgbaToFabricImage, blurImage } = require('./fabric');
module.exports = async ({ width: canvasWidth, height: canvasHeight, channels, framerateStr, verbose, logTimes, ffmpegPath, ffprobePath, enableFfmpegLog, params }) => { module.exports = async ({ width: canvasWidth, height: canvasHeight, channels, framerateStr, verbose, logTimes, ffmpegPath, ffprobePath, enableFfmpegLog, params }) => {
const { path, cutFrom, cutTo, resizeMode = 'contain-blur', framePtsFactor, inputWidth, inputHeight, width: requestedWidthRel, height: requestedHeightRel, left: leftRel = 0, top: topRel = 0, originX = 'left', originY = 'top' } = params;
const { path, cutFrom, cutTo, resizeMode = 'contain-blur', speedFactor, inputWidth, inputHeight, width: requestedWidthRel, height: requestedHeightRel, left: leftRel = 0, top: topRel = 0, originX = 'left', originY = 'top' } = params;
const requestedWidth = requestedWidthRel ? requestedWidthRel * canvasWidth : canvasWidth; const requestedWidth = requestedWidthRel ? requestedWidthRel * canvasWidth : canvasWidth;
const requestedHeight = requestedHeightRel ? requestedHeightRel * canvasHeight : canvasHeight; const requestedHeight = requestedHeightRel ? requestedHeightRel * canvasHeight : canvasHeight;
@ -40,9 +40,9 @@ module.exports = async ({ width: canvasWidth, height: canvasHeight, channels, fr
// let inFrameCount = 0; // let inFrameCount = 0;
let ptsFilter = ''; let ptsFilter = '';
if (framePtsFactor !== 1) {
if (verbose) console.log('framePtsFactor', framePtsFactor);
ptsFilter = `setpts=${framePtsFactor}*PTS,`;
if (speedFactor !== 1) {
if (verbose) console.log('speedFactor', speedFactor);
ptsFilter = `setpts=${speedFactor}*PTS,`;
} }
let scaleFilter; let scaleFilter;
@ -67,7 +67,7 @@ module.exports = async ({ width: canvasWidth, height: canvasHeight, channels, fr
...(inputCodec ? ['-vcodec', inputCodec] : []), ...(inputCodec ? ['-vcodec', inputCodec] : []),
...(cutFrom ? ['-ss', cutFrom] : []), ...(cutFrom ? ['-ss', cutFrom] : []),
'-i', path, '-i', path,
...(cutTo ? ['-t', (cutTo - cutFrom) * framePtsFactor] : []),
...(cutTo ? ['-t', (cutTo - cutFrom) * speedFactor] : []),
'-vf', `${ptsFilter}fps=${framerateStr},${scaleFilter}`, '-vf', `${ptsFilter}fps=${framerateStr},${scaleFilter}`,
'-map', 'v:0', '-map', 'v:0',
'-vcodec', 'rawvideo', '-vcodec', 'rawvideo',

Loading…
Cancel
Save