@omnimedia/omnitool
Version:
open source video processing tools
82 lines (72 loc) • 2.42 kB
text/typescript
import {Driver} from "../../driver/driver.js"
import {Datafile, defaultTranscriberSpec, Item, makeTranscriber, Omni} from "../../timeline/index.js"
export async function TimelineSchemaTest(driver: Driver, file: File) {
const transcriber = await makeTranscriber({
driver,
spec: defaultTranscriberSpec(),
workerUrl: new URL("/features/speech/transcribe/worker.bundle.min.js", import.meta.url),
onLoading: loading => console.log("transcriber loading", loading),
})
const omni = new Omni(driver)
const {videoA} = await omni.load({videoA: Datafile.make(file)})
const transcript = await transcriber.transcribe({
source: file,
language: "english",
onReport: report => console.log("transcriber report", report),
onTranscription: text => console.log("transcribing", text),
})
const timeline = omni.timeline(o => {
const text = o.text("content", {duration: 3000})
const fade = o.animate.opacity.make("easeIn", [
[0, 0],
[700, 1],
[2200, 1],
[3000, 0.35],
])
const style = o.textStyle({fill: "green", fontSize: 100})
const videoSpatial = o.spatial(
o.transform({
position: [240, 160],
scale: [1.4, 1.4],
rotation: 0.08,
}),
[0.15, 0.1, 0.05, 0.2],
)
const textSpatial = o.spatial()
const textMotion = o.animate.transform.make("linear", [
[0, o.transform({position: [-320, 80], scale: [0.7, 0.7]})],
[1000, o.transform({position: [120, 80], scale: [1, 1]})],
[2000, o.transform({position: [200, 40], scale: [1.35, 1.35], rotation: 8})],
[3000, o.transform({position: [320, 0], scale: [1.15, 1.15], rotation: 0})],
])
const video = o.video(videoA, {duration: 6000, start: 3000})
o.set<Item.Text>(text.id, {styleId: style.id, spatialId: textSpatial.id, animationIds: [fade.id, textMotion.id]})
o.set<Item.Video>(video.id, {spatialId: videoSpatial.id})
const visual = o.sequence(
o.stack(
text,
o.captions(video, transcript, {
maxChars: 34,
maxDuration: 2800,
maxSilence: 450,
styles: {
fontFamily: "Arial",
fontSize: 64,
fill: "#ffffff",
align: "center",
wordWrap: true,
wordWrapWidth: 1280,
stroke: {color: "#000000", width: 6},
},
})
),
o.transition.circle(1500),
o.video(videoA, {duration: 7000, start: 5000})
)
return o.stack(
visual,
o.audio(videoA, {start: 3000, duration: video.duration})
)
})
return {timeline, omni}
}