Edición de video (weizhi:video)
Alcance
| Hace | No hace |
|---|---|
probe, extraer fotogramas/pistas de audio, exportVideo exportar | Decodificar mp4 completo con webview_exec |
| v1 remux: recortar inicio/fin, unión sin transiciones | Fingir soporte de transcodificación en escritorio (no hay paquete en escritorio) |
Protocolo de inicio
- Primero,
load_skill(video-edit) para leer este documento. - Antes de escribir
exportVideoo una línea de tiempo compleja: llama afind_capsuna vez (consulta conexportVideo weizhi:videoo la capacidad específica), escribe basándote en el ejemplo de llamada devuelto, no adivines los nombres de campo. - Coloca los scripts en
jobs/*.js, ejecútalos conrun_jsusandofile; puedes aumentartimeout_ms(máximo 600000). - Si la API reporta un error en el script (como
bad argument,unsupported): vuelve afind_capspara verificar la firma y ajusta el script.
Selección de ruta
| Tarea | API |
|---|---|
| Solo recortar un segmento, o unir varios segmentos de extremo a extremo, sin recodificación | v1 exportVideo({ clips: [{ path, startMs?, endMs? }], output }) |
| Múltiples pistas, portada de imagen, Ken Burns, fundido cruzado | v2 exportVideo({ width, height, tracks, output }) |
Línea de tiempo v2 (puntos clave)
- Portada / imagen: pista
type: "image",durationMses obligatorio. - Segmento mp4: pista
type: "video",inMs/outMs; no coloques imágenes en una pista de video. - Fundido cruzado (solo pista de imagen): el clip posterior escribe
transition: { type: "crossfade", durationMs: D }, y
startMs_siguiente = startMs_anterior + durationMs_anterior - D(superposición exactamente de D milisegundos). No existe el campocrossfadeMs. - Los clips en la misma pista que no declaren
transitionno pueden superponerse en el tiempo; si se reporta erroroverlapping clips, revisa la fórmula anterior y la presencia detransition. transitiony las keyframes de opacidad escritas en el clip no pueden usarse simultáneamente.- Pista de audio: una pista separada con
type: "audio".
Ejemplo (fundido entre dos imágenes + video a continuación):
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",
});
Flujo recomendado
probeduración y resolución del video fuente.- Si se necesita un fotograma de portada:
extractFrame/extractFrames(verfind_caps). - Para videos complejos: primero exporta mediante v1 un intermedio
part1.mp4,part2.mp4, luego únelos con v1 o v2; evita superponer clips en una misma pista sin declarar transiciones. - Banda sonora: pista
audioseparada,outMsalineado con la duración total del video.
Orquestación
- Un solo script
jobs/render.jsrealiza en serie la detección, exportación y verificación (puede volver aprobeel archivo final). - No uses múltiples herramientas externas en lugar de un script completo.
Qué decir al usuario
Indica el nombre del archivo final y su duración; usa un enlace [video final](out/xxx.mp4). No acumules jerga técnica.