Montage vidéo (weizhi:video)
Périmètre
| Fait | Ne fait pas |
|---|---|
probe, extraction d'images/piste audio, exportVideo | Décoder un MP4 entier avec webview_exec |
| v1 remux : rognage début/fin, assemblage sans fondu | Prétendre supporter la conversion desktop (pas de package desktop) |
Protocole de démarrage
- D'abord
load_skill(video-edit) pour lire ce document. - Avant d'écrire
exportVideoou une timeline complexe :find_capsune fois (query contenantexportVideo weizhi:videoou la capacité spécifique), suivre l'exemple d'appel retourné, ne pas deviner les noms de champs. - Placer le script dans
jobs/*.js, l'exécuter avecrun_jsviafile; on peut augmentertimeout_ms(limite 600000). - En cas d'erreur d'API dans le script (ex.
bad argument,unsupported) : refaire unfind_capspour vérifier les signatures puis modifier le script.
Choix de l'API
| Tâche | API |
|---|---|
| Rogner un seul segment, assembler plusieurs segments bout à bout sans réencodage | v1 exportVideo({ clips: [{ path, startMs?, endMs? }], output }) |
| Multicouche, vignette, Ken Burns, fondu enchaîné | v2 exportVideo({ width, height, tracks, output }) |
Timeline v2 (points clés)
- Vignette / image : piste
type: "image",durationMsobligatoire. - Segment mp4 : piste
type: "video",inMs/outMs; ne pas mettre d'image dans une piste video. - Fondu enchaîné (piste image uniquement) : le clip suivant écrit
transition: { type: "crossfade", durationMs: D }, et
startMs_suivant = startMs_précédent + durationMs_précédent - D(chevauchenment exact de D millisecondes). Il n'y a pas de champcrossfadeMs. - Sur une même piste, les clips sans
transitiondéclarée ne peuvent pas se chevaucher ; une erreuroverlapping clipsindique de vérifier la formule ci-dessus et la présence detransition. transitionet les keyframes d'opacité écrites dans le clip ne peuvent pas être utilisés simultanément.- Piste audio : une piste séparée
type: "audio".
Exemple (deux images avec fondu + vidéo) :
import { exportVideo } from "weizhi:video";
const D = 300;
await exportVideo({
width: 720,
height: 1280,
tracks: [
{
type: "image",
clips: [
{ src: "a.jpg", startMs: 0, durationMs: 1000 },
{
src: "b.jpg",
startMs: 1000 - D,
durationMs: 1000,
transition: { type: "crossfade", durationMs: D },
},
],
},
{
type: "video",
clips: [{ src: "clip.mp4", startMs: 1700, inMs: 0, outMs: 5000 }],
},
],
output: "out/final.mp4",
});
Flux recommandé
probela durée et la résolution de la vidéo source.- Si besoin d'une image de couverture :
extractFrame/extractFrames(voirfind_caps). - Pour les montages complexes : on peut d'abord exporter avec v1 des intermédiaires
part1.mp4,part2.mp4, puis les assembler avec v1 ou v2 ; éviter d'empiler des clips sans transition déclarée sur une même piste. - Musique : piste
audioséparée,outMsaligné sur la durée totale de l'image.
Orchestration
- Un seul script
jobs/render.jseffectue en série la détection, l'export et la vérification (on peutprobeà nouveau le résultat). - Ne pas utiliser plusieurs outils externes à la place d'un seul script complet.
Communication avec l'utilisateur
Indiquer le nom du fichier final et sa durée ; utiliser un lien [Fichier final](out/xxx.mp4). Éviter le jargon technique.