Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
Commit
·
1083ad0
1
Parent(s):
2e5dd3f
debugging
Browse files- src/core/ffmpeg/concatenateVideosWithAudio.mts +7 -5
- src/core/files/deleteFileWithName.mts +1 -0
- src/index.mts +1 -1
- src/main.mts +21 -3
src/core/ffmpeg/concatenateVideosWithAudio.mts
CHANGED
@@ -61,7 +61,7 @@ export const concatenateVideosWithAudio = async ({
|
|
61 |
|
62 |
videoFilePaths = videoFilePaths.filter((video) => existsSync(video))
|
63 |
|
64 |
-
|
65 |
const tempFilePath = await concatenateVideos({
|
66 |
videoFilePaths,
|
67 |
})
|
@@ -72,6 +72,8 @@ export const concatenateVideosWithAudio = async ({
|
|
72 |
|
73 |
const finalOutputFilePath = output || path.join(tempDir, `${uuidv4()}.${format}`);
|
74 |
|
|
|
|
|
75 |
// Begin ffmpeg command configuration
|
76 |
let cmd = ffmpeg();
|
77 |
|
@@ -113,8 +115,8 @@ export const concatenateVideosWithAudio = async ({
|
|
113 |
]);
|
114 |
}
|
115 |
|
116 |
-
|
117 |
-
console.log("DEBUG:", {
|
118 |
videoTracksVolume,
|
119 |
audioTrackVolume,
|
120 |
videoFilePaths,
|
@@ -125,12 +127,12 @@ export const concatenateVideosWithAudio = async ({
|
|
125 |
// additionalAudioVolume,
|
126 |
finalOutputFilePath
|
127 |
})
|
128 |
-
|
129 |
|
130 |
// Set up event handlers for ffmpeg processing
|
131 |
const promise = new Promise<string>((resolve, reject) => {
|
132 |
cmd.on('error', (err) => {
|
133 |
-
console.error(" Error during ffmpeg processing:", err.message);
|
134 |
reject(err);
|
135 |
}).on('end', async () => {
|
136 |
// When ffmpeg finishes processing, resolve the promise with file info
|
|
|
61 |
|
62 |
videoFilePaths = videoFilePaths.filter((video) => existsSync(video))
|
63 |
|
64 |
+
console.log("concatenateVideosWithAudio: concatenating videos (without audio)..")
|
65 |
const tempFilePath = await concatenateVideos({
|
66 |
videoFilePaths,
|
67 |
})
|
|
|
72 |
|
73 |
const finalOutputFilePath = output || path.join(tempDir, `${uuidv4()}.${format}`);
|
74 |
|
75 |
+
console.log(`concatenateVideosWithAudio: finalOutputFilePath = ${finalOutputFilePath}`)
|
76 |
+
|
77 |
// Begin ffmpeg command configuration
|
78 |
let cmd = ffmpeg();
|
79 |
|
|
|
115 |
]);
|
116 |
}
|
117 |
|
118 |
+
|
119 |
+
console.log("concatenateVideosWithAudio: DEBUG:", {
|
120 |
videoTracksVolume,
|
121 |
audioTrackVolume,
|
122 |
videoFilePaths,
|
|
|
127 |
// additionalAudioVolume,
|
128 |
finalOutputFilePath
|
129 |
})
|
130 |
+
|
131 |
|
132 |
// Set up event handlers for ffmpeg processing
|
133 |
const promise = new Promise<string>((resolve, reject) => {
|
134 |
cmd.on('error', (err) => {
|
135 |
+
console.error("concatenateVideosWithAudio: Error during ffmpeg processing:", err.message);
|
136 |
reject(err);
|
137 |
}).on('end', async () => {
|
138 |
// When ffmpeg finishes processing, resolve the promise with file info
|
src/core/files/deleteFileWithName.mts
CHANGED
@@ -3,6 +3,7 @@ import path from "node:path"
|
|
3 |
import { deleteFile } from "./deleteFile.mts"
|
4 |
|
5 |
export const deleteFilesWithName = async (dir: string, name: string, debug?: boolean) => {
|
|
|
6 |
for (const file of await fs.readdir(dir)) {
|
7 |
if (file.includes(name)) {
|
8 |
await deleteFile(path.join(dir, file))
|
|
|
3 |
import { deleteFile } from "./deleteFile.mts"
|
4 |
|
5 |
export const deleteFilesWithName = async (dir: string, name: string, debug?: boolean) => {
|
6 |
+
console.log(`deleteFilesWithName(${dir}, ${name})`)
|
7 |
for (const file of await fs.readdir(dir)) {
|
8 |
if (file.includes(name)) {
|
9 |
await deleteFile(path.join(dir, file))
|
src/index.mts
CHANGED
@@ -2,11 +2,11 @@
|
|
2 |
import { Blob } from "node:buffer"
|
3 |
|
4 |
import express from "express"
|
|
|
5 |
import { parseClap, ClapProject } from "@aitube/clap"
|
6 |
|
7 |
import { clapToTmpVideoFilePath } from "./main.mts"
|
8 |
import { deleteFile } from "./core/files/deleteFile.mts"
|
9 |
-
import queryString from "query-string"
|
10 |
import { defaultExportFormat, SupportedExportFormat } from "./core/ffmpeg/concatenateVideosWithAudio.mts"
|
11 |
|
12 |
const app = express()
|
|
|
2 |
import { Blob } from "node:buffer"
|
3 |
|
4 |
import express from "express"
|
5 |
+
import queryString from "query-string"
|
6 |
import { parseClap, ClapProject } from "@aitube/clap"
|
7 |
|
8 |
import { clapToTmpVideoFilePath } from "./main.mts"
|
9 |
import { deleteFile } from "./core/files/deleteFile.mts"
|
|
|
10 |
import { defaultExportFormat, SupportedExportFormat } from "./core/ffmpeg/concatenateVideosWithAudio.mts"
|
11 |
|
12 |
const app = express()
|
src/main.mts
CHANGED
@@ -37,6 +37,11 @@ export async function clapToTmpVideoFilePath({
|
|
37 |
outputFilePath: string
|
38 |
}> {
|
39 |
|
|
|
|
|
|
|
|
|
|
|
40 |
outputDir = outputDir || (await getRandomDirectory())
|
41 |
|
42 |
const videoSegments = clap.segments.filter(s => s.category === "video" && s.assetUrl.startsWith("data:video/"))
|
@@ -74,7 +79,10 @@ export async function clapToTmpVideoFilePath({
|
|
74 |
throw new Error(`the provided Clap doesn't contain any video or storyboard`)
|
75 |
}
|
76 |
|
77 |
-
console.log(`clapToTmpVideoFilePath: calling concatenateVideos over ${videoFilePaths.length} video chunks: ${JSON.stringify(videoFilePaths, null, 2)}
|
|
|
|
|
|
|
78 |
|
79 |
const concatenatedVideosNoMusic = await concatenateVideos({
|
80 |
videoFilePaths,
|
@@ -114,7 +122,16 @@ export async function clapToTmpVideoFilePath({
|
|
114 |
console.log(`clapToTmpVideoFilePath: concatenatedAudio = ${concatenatedAudio}`)
|
115 |
}
|
116 |
|
117 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
118 |
const finalFilePathOfVideoWithMusic = await concatenateVideosWithAudio({
|
119 |
output: join(outputDir, `final_video.${format}`),
|
120 |
format,
|
@@ -124,7 +141,8 @@ export async function clapToTmpVideoFilePath({
|
|
124 |
videoTracksVolume: concatenatedAudio ? 0.85 : 1.0,
|
125 |
audioTrackVolume: concatenatedAudio ? 0.15 : 0.0, // let's keep the music volume low
|
126 |
})
|
127 |
-
|
|
|
128 |
|
129 |
if (clearTmpFilesAtEnd) {
|
130 |
// we delete all the temporary assets
|
|
|
37 |
outputFilePath: string
|
38 |
}> {
|
39 |
|
40 |
+
// in case we have an issue with the format
|
41 |
+
if (format !== "mp4" && format !== "webm") {
|
42 |
+
format = "mp4"
|
43 |
+
}
|
44 |
+
|
45 |
outputDir = outputDir || (await getRandomDirectory())
|
46 |
|
47 |
const videoSegments = clap.segments.filter(s => s.category === "video" && s.assetUrl.startsWith("data:video/"))
|
|
|
79 |
throw new Error(`the provided Clap doesn't contain any video or storyboard`)
|
80 |
}
|
81 |
|
82 |
+
console.log(`clapToTmpVideoFilePath: calling concatenateVideos over ${videoFilePaths.length} video chunks: ${JSON.stringify(videoFilePaths, null, 2)}\nconcatenateVideos(${JSON.stringify({
|
83 |
+
videoFilePaths,
|
84 |
+
output: join(outputDir, `tmp_asset_concatenated_videos.mp4`)
|
85 |
+
}, null, 2)})`)
|
86 |
|
87 |
const concatenatedVideosNoMusic = await concatenateVideos({
|
88 |
videoFilePaths,
|
|
|
122 |
console.log(`clapToTmpVideoFilePath: concatenatedAudio = ${concatenatedAudio}`)
|
123 |
}
|
124 |
|
125 |
+
console.log(`calling concatenateVideosWithAudio: `, {
|
126 |
+
output: join(outputDir, `final_video.${format}`),
|
127 |
+
format,
|
128 |
+
audioFilePath: concatenatedAudio ? concatenatedAudio?.filepath : undefined,
|
129 |
+
videoFilePaths: [concatenatedVideosNoMusic.filepath],
|
130 |
+
// videos are silent, so they can stay at 0
|
131 |
+
videoTracksVolume: concatenatedAudio ? 0.85 : 1.0,
|
132 |
+
audioTrackVolume: concatenatedAudio ? 0.15 : 0.0, // let's keep the music volume low
|
133 |
+
})
|
134 |
+
|
135 |
const finalFilePathOfVideoWithMusic = await concatenateVideosWithAudio({
|
136 |
output: join(outputDir, `final_video.${format}`),
|
137 |
format,
|
|
|
141 |
videoTracksVolume: concatenatedAudio ? 0.85 : 1.0,
|
142 |
audioTrackVolume: concatenatedAudio ? 0.15 : 0.0, // let's keep the music volume low
|
143 |
})
|
144 |
+
|
145 |
+
console.log(`clapToTmpVideoFilePath: finalFilePathOfVideoWithMusic = ${finalFilePathOfVideoWithMusic}`)
|
146 |
|
147 |
if (clearTmpFilesAtEnd) {
|
148 |
// we delete all the temporary assets
|