File size: 1,740 Bytes
a65e95e
 
 
 
 
5dfc565
a65e95e
5dfc565
a65e95e
 
 
 
 
 
 
 
 
 
5dfc565
a65e95e
5dfc565
 
7bea24d
5dfc565
 
 
a65e95e
5dfc565
7bea24d
a65e95e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5dfc565
a65e95e
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import path from "node:path"

import { v4 as uuidv4 } from "uuid"
import tmpDir from "temp-dir"
import ffmpeg from "fluent-ffmpeg"
import { moveFileFromTmpToPending } from "../utils/moveFileFromTmpToPending.mts"

export const postInterpolation = async (fileName: string, durationMs: number, nbFrames: number): Promise<string> => {
  return new Promise((resolve,reject) => {

    const tmpFileName = `${uuidv4()}.mp4`

    const filePath = path.join(tmpDir, fileName)
    const tmpFilePath = path.join(tmpDir, tmpFileName)

    ffmpeg.ffprobe(filePath, function(err, metadata) {
      if (err) { reject(err); return; }
      
      const durationInSec = durationMs / 1000

      const currentVideoDurationInSec = metadata.format.duration
      
      console.log(`currentVideoDurationInSec in sec: ${currentVideoDurationInSec}s`)
    
      console.log(`target duration in sec: ${durationInSec}s (${durationMs}ms)`)
    
      // compute a ratio ex. 0.3 = 30% of the total length
      const durationRatio = currentVideoDurationInSec / durationInSec
      console.log(`durationRatio: ${durationRatio}`)

    ffmpeg(filePath)

      // convert to HD
      .size("1280x720")

      .videoFilters([
        `setpts=${durationRatio}*PTS`, // we make the video faster
        //'scale=-1:576:lanczos',
        // 'unsharp=5:5:0.2:5:5:0.2', // not recommended, this make the video more "pixely"
        'noise=c0s=10:c0f=t+u' // add a movie grain noise
      ])
      .outputOptions([
        `-r ${nbFrames}`,
      ])

      .save(tmpFilePath)
      .on("end", async () => {
        await moveFileFromTmpToPending(tmpFileName, fileName)

        resolve(fileName)
      })
      .on("error", (err) => {
        reject(err)
      })
    })
  })
}