More precise storyboard
Prefer to have unused black sprites at the end of the image instead of missing sprites of the end of the video
This commit is contained in:
parent
78149322ee
commit
be7bc3a6a9
|
@ -941,7 +941,7 @@ export const ACTOR_IMAGES_SIZE: { [key in ActorImageType_Type]: { width: number,
|
||||||
|
|
||||||
export const STORYBOARD = {
|
export const STORYBOARD = {
|
||||||
SPRITE_MAX_SIZE: 192,
|
SPRITE_MAX_SIZE: 192,
|
||||||
SPRITES_MAX_EDGE_COUNT: 10
|
SPRITES_MAX_EDGE_COUNT: 11
|
||||||
}
|
}
|
||||||
|
|
||||||
export const EMBED_SIZE = {
|
export const EMBED_SIZE = {
|
||||||
|
|
|
@ -73,7 +73,7 @@ async function processGenerateStoryboard (job: Job): Promise<void> {
|
||||||
|
|
||||||
logger.debug(
|
logger.debug(
|
||||||
'Generating storyboard from video of %s to %s', video.uuid, destination,
|
'Generating storyboard from video of %s to %s', video.uuid, destination,
|
||||||
{ ...lTags, spritesCount, spriteDuration, videoDuration: video.duration, spriteHeight, spriteWidth }
|
{ ...lTags, totalSprites, spritesCount, spriteDuration, videoDuration: video.duration, spriteHeight, spriteWidth }
|
||||||
)
|
)
|
||||||
|
|
||||||
await ffmpeg.generateStoryboardFromVideo({
|
await ffmpeg.generateStoryboardFromVideo({
|
||||||
|
@ -148,7 +148,7 @@ function buildSpritesMetadata (options: {
|
||||||
// We can generate a single line so we don't need a prime number
|
// We can generate a single line so we don't need a prime number
|
||||||
if (totalSprites <= STORYBOARD.SPRITES_MAX_EDGE_COUNT) return { spriteDuration, totalSprites }
|
if (totalSprites <= STORYBOARD.SPRITES_MAX_EDGE_COUNT) return { spriteDuration, totalSprites }
|
||||||
|
|
||||||
return { spriteDuration, totalSprites: findNearestGridPrime(totalSprites, STORYBOARD.SPRITES_MAX_EDGE_COUNT) }
|
return { spriteDuration, totalSprites }
|
||||||
}
|
}
|
||||||
|
|
||||||
function findGridSize (options: {
|
function findGridSize (options: {
|
||||||
|
@ -159,27 +159,9 @@ function findGridSize (options: {
|
||||||
|
|
||||||
for (let i = 1; i <= maxEdgeCount; i++) {
|
for (let i = 1; i <= maxEdgeCount; i++) {
|
||||||
for (let j = i; j <= maxEdgeCount; j++) {
|
for (let j = i; j <= maxEdgeCount; j++) {
|
||||||
if (toFind === i * j) return { width: j, height: i }
|
if (toFind <= i * j) return { width: j, height: i }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Error(`Could not find grid size (to find: ${toFind}, max edge count: ${maxEdgeCount}`)
|
throw new Error(`Could not find grid size (to find: ${toFind}, max edge count: ${maxEdgeCount}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
function findNearestGridPrime (value: number, maxMultiplier: number) {
|
|
||||||
for (let i = value; i--; i > 0) {
|
|
||||||
if (!isPrimeWithin(i, maxMultiplier)) return i
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error('Could not find prime number below ' + value)
|
|
||||||
}
|
|
||||||
|
|
||||||
function isPrimeWithin (value: number, maxMultiplier: number) {
|
|
||||||
if (value < 2) return false
|
|
||||||
|
|
||||||
for (let i = 2, end = Math.min(Math.sqrt(value), maxMultiplier); i <= end; i++) {
|
|
||||||
if (value % i === 0 && value / i <= maxMultiplier) return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue