Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
Commit
·
6349b58
1
Parent(s):
4cb7ad9
add more logs
Browse files
src/core/exporters/clapWithStoryboardsToVideoFile.mts
CHANGED
@@ -47,6 +47,8 @@ export async function clapWithStoryboardsToVideoFile({
|
|
47 |
s.category === "interface" &&
|
48 |
startOfSegment1IsWithinSegment2(s, segment)
|
49 |
)
|
|
|
|
|
50 |
const interfaceSegment = interfaceSegments.at(0)
|
51 |
if (interfaceSegment) {
|
52 |
// here we are free to use mp4, since this is an internal intermediary format
|
@@ -67,11 +69,15 @@ export async function clapWithStoryboardsToVideoFile({
|
|
67 |
storyboardSegmentVideoFilePath = videoSegmentWithOverlayFilePath
|
68 |
}
|
69 |
|
|
|
70 |
const dialogueSegments = clap.segments.filter(s =>
|
71 |
s.assetUrl.startsWith("data:audio/") &&
|
72 |
s.category === "dialogue" &&
|
73 |
startOfSegment1IsWithinSegment2(s, segment)
|
74 |
)
|
|
|
|
|
|
|
75 |
const dialogueSegment = dialogueSegments.at(0)
|
76 |
if (dialogueSegment) {
|
77 |
extractBase64(dialogueSegment.assetUrl)
|
@@ -103,6 +109,8 @@ export async function clapWithStoryboardsToVideoFile({
|
|
103 |
videoFilePaths.push(storyboardSegmentVideoFilePath)
|
104 |
}
|
105 |
|
|
|
|
|
106 |
return {
|
107 |
outputDir,
|
108 |
videoFilePaths,
|
|
|
47 |
s.category === "interface" &&
|
48 |
startOfSegment1IsWithinSegment2(s, segment)
|
49 |
)
|
50 |
+
console.log(`clapWithStoryboardsToVideoFile: got ${interfaceSegments.length} interface segments for shot ${segment.id} [${segment.startTimeInMs}:${segment.endTimeInMs}]`)
|
51 |
+
|
52 |
const interfaceSegment = interfaceSegments.at(0)
|
53 |
if (interfaceSegment) {
|
54 |
// here we are free to use mp4, since this is an internal intermediary format
|
|
|
69 |
storyboardSegmentVideoFilePath = videoSegmentWithOverlayFilePath
|
70 |
}
|
71 |
|
72 |
+
|
73 |
const dialogueSegments = clap.segments.filter(s =>
|
74 |
s.assetUrl.startsWith("data:audio/") &&
|
75 |
s.category === "dialogue" &&
|
76 |
startOfSegment1IsWithinSegment2(s, segment)
|
77 |
)
|
78 |
+
|
79 |
+
console.log(`clapWithStoryboardsToVideoFile: got ${dialogueSegments.length} dialogue segments for shot ${segment.id} [${segment.startTimeInMs}:${segment.endTimeInMs}]`)
|
80 |
+
|
81 |
const dialogueSegment = dialogueSegments.at(0)
|
82 |
if (dialogueSegment) {
|
83 |
extractBase64(dialogueSegment.assetUrl)
|
|
|
109 |
videoFilePaths.push(storyboardSegmentVideoFilePath)
|
110 |
}
|
111 |
|
112 |
+
console.log(`clapWithStoryboardsToVideoFile: videoFilePaths: ${JSON.stringify(videoFilePaths, null, 2)}`)
|
113 |
+
|
114 |
return {
|
115 |
outputDir,
|
116 |
videoFilePaths,
|
src/core/exporters/clapWithVideosToVideoFile.mts
CHANGED
@@ -101,6 +101,8 @@ export async function clapWithVideosToVideoFile({
|
|
101 |
videoFilePaths.push(videoSegmentFilePath)
|
102 |
}
|
103 |
|
|
|
|
|
104 |
return {
|
105 |
outputDir,
|
106 |
videoFilePaths,
|
|
|
101 |
videoFilePaths.push(videoSegmentFilePath)
|
102 |
}
|
103 |
|
104 |
+
console.log(`clapWithVideosToVideoFile: videoFilePaths: ${JSON.stringify(videoFilePaths, null, 2)}`)
|
105 |
+
|
106 |
return {
|
107 |
outputDir,
|
108 |
videoFilePaths,
|
src/main.mts
CHANGED
@@ -66,17 +66,24 @@ export async function clapToTmpVideoFilePath({
|
|
66 |
throw new Error(`the provided Clap doesn't contain any video or storyboard`)
|
67 |
}
|
68 |
|
|
|
|
|
69 |
const concatenatedVideosNoMusic = await concatenateVideos({
|
70 |
videoFilePaths,
|
71 |
output: join(outputDir, `tmp_asset_concatenated_videos.mp4`)
|
72 |
})
|
73 |
|
|
|
|
|
74 |
const audioTracks: string[] = []
|
75 |
|
76 |
const musicSegments = clap.segments.filter(s =>
|
77 |
s.category === "music" &&
|
78 |
s.assetUrl.startsWith("data:audio/")
|
79 |
)
|
|
|
|
|
|
|
80 |
for (const segment of musicSegments) {
|
81 |
audioTracks.push(
|
82 |
await writeBase64ToFile(
|
@@ -86,12 +93,25 @@ export async function clapToTmpVideoFilePath({
|
|
86 |
)
|
87 |
}
|
88 |
|
|
|
|
|
89 |
const concatenatedAudio = await concatenateAudio({
|
90 |
output: join(outputDir, `tmp_asset_concatenated_audio.wav`),
|
91 |
audioTracks,
|
92 |
crossfadeDurationInSec: 2 // 2 seconds
|
93 |
})
|
94 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
95 |
const finalFilePathOfVideoWithMusic = await concatenateVideosWithAudio({
|
96 |
output: join(outputDir, `final_video.${format}`),
|
97 |
format,
|
@@ -101,12 +121,18 @@ export async function clapToTmpVideoFilePath({
|
|
101 |
videoTracksVolume: 0.85,
|
102 |
audioTrackVolume: 0.15, // let's keep the music volume low
|
103 |
})
|
104 |
-
|
|
|
105 |
if (clearTmpFilesAtEnd) {
|
106 |
// we delete all the temporary assets
|
107 |
await deleteFilesWithName(outputDir, `tmp_asset_`)
|
108 |
}
|
109 |
|
|
|
|
|
|
|
|
|
|
|
110 |
return {
|
111 |
tmpWorkDir: outputDir,
|
112 |
outputFilePath: finalFilePathOfVideoWithMusic
|
|
|
66 |
throw new Error(`the provided Clap doesn't contain any video or storyboard`)
|
67 |
}
|
68 |
|
69 |
+
console.log(`clapToTmpVideoFilePath: calling concatenateVideos over ${videoFilePaths.length} video chunks`)
|
70 |
+
|
71 |
const concatenatedVideosNoMusic = await concatenateVideos({
|
72 |
videoFilePaths,
|
73 |
output: join(outputDir, `tmp_asset_concatenated_videos.mp4`)
|
74 |
})
|
75 |
|
76 |
+
console.log(`clapToTmpVideoFilePath: concatenatedVideosNoMusic`, concatenatedVideosNoMusic)
|
77 |
+
|
78 |
const audioTracks: string[] = []
|
79 |
|
80 |
const musicSegments = clap.segments.filter(s =>
|
81 |
s.category === "music" &&
|
82 |
s.assetUrl.startsWith("data:audio/")
|
83 |
)
|
84 |
+
|
85 |
+
console.log(`clapToTmpVideoFilePath: got ${musicSegments.length} music segments in total`)
|
86 |
+
|
87 |
for (const segment of musicSegments) {
|
88 |
audioTracks.push(
|
89 |
await writeBase64ToFile(
|
|
|
93 |
)
|
94 |
}
|
95 |
|
96 |
+
console.log(`clapToTmpVideoFilePath: calling concatenateAudio over ${audioTracks.length} audio tracks`)
|
97 |
+
|
98 |
const concatenatedAudio = await concatenateAudio({
|
99 |
output: join(outputDir, `tmp_asset_concatenated_audio.wav`),
|
100 |
audioTracks,
|
101 |
crossfadeDurationInSec: 2 // 2 seconds
|
102 |
})
|
103 |
+
console.log(`clapToTmpVideoFilePath: concatenatedAudio = ${concatenatedAudio}`)
|
104 |
+
|
105 |
+
console.log(`clapToTmpVideoFilePath: calling concatenateVideosWithAudio with: ${JSON.stringify({
|
106 |
+
output: join(outputDir, `final_video.${format}`),
|
107 |
+
format,
|
108 |
+
audioFilePath: concatenatedAudio.filepath,
|
109 |
+
videoFilePaths: [concatenatedVideosNoMusic.filepath],
|
110 |
+
// videos are silent, so they can stay at 0
|
111 |
+
videoTracksVolume: 0.85,
|
112 |
+
audioTrackVolume: 0.15, // let's keep the music volume low
|
113 |
+
}, null, 2)}`)
|
114 |
+
|
115 |
const finalFilePathOfVideoWithMusic = await concatenateVideosWithAudio({
|
116 |
output: join(outputDir, `final_video.${format}`),
|
117 |
format,
|
|
|
121 |
videoTracksVolume: 0.85,
|
122 |
audioTrackVolume: 0.15, // let's keep the music volume low
|
123 |
})
|
124 |
+
console.log(`clapToTmpVideoFilePath: finalFilePathOfVideoWithMusic = ${finalFilePathOfVideoWithMusic}`)
|
125 |
+
|
126 |
if (clearTmpFilesAtEnd) {
|
127 |
// we delete all the temporary assets
|
128 |
await deleteFilesWithName(outputDir, `tmp_asset_`)
|
129 |
}
|
130 |
|
131 |
+
console.log(`clapToTmpVideoFilePath: returning ${JSON.stringify( {
|
132 |
+
tmpWorkDir: outputDir,
|
133 |
+
outputFilePath: finalFilePathOfVideoWithMusic
|
134 |
+
}, null, 2)}`)
|
135 |
+
|
136 |
return {
|
137 |
tmpWorkDir: outputDir,
|
138 |
outputFilePath: finalFilePathOfVideoWithMusic
|