Communitygithub.com

businessbaum/vedit

Ensambla el archivo de video final. Se usa cuando el usuario pide el video terminado: "exportier das", "render das fertig", "mach das final", "renderte das Video", "mach den Endexport", "bau das Video zusammen", "mach es fertig für YouTube", "gib mir die MP4", "export the final", "render the final cut", "make the master", "export for TikTok", "give me the mp4". Cubre el renderizado de segmentos con caché, concat protegido, audio de una pasada, normalización de sonoridad y el muxeo único.

¿Qué es vedit?

Esta habilidad para agentes de IA (Claude Code, Cursor, Codex) se activa cuando el usuario solicita la exportación final de un proyecto de video, manejando frases en alemán e inglés. Combina múltiples segmentos de video previamente renderizados en un solo archivo final, utilizando un pipeline optimizado: renderizado por segmentos con caché (solo se re-renderizan los segmentos modificados), concatenación protegida con verificación de compatibilidad para evitar archivos corruptos, audio continuo de una pasada con normalización de sonoridad de dos pasos (evitando el error común de muestreo a 192 kHz), y un único muxeo de video y audio. Soporta segundos entregables para diferentes plataformas (YouTube, TikTok) sin mutar el proyecto original. Está diseñado para ser rápido, fiable y compatible con pipelines de producción profesionales, con validación posterior a la exportación y un flujo claro de fallos y recuperación.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/businessbaum/vedit/tree/HEAD/.agents/skills/export-final

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación


name: export-final description: Esta habilidad se debe usar cuando el usuario pida el archivo de video terminado - "exportier das", "render das fertig", "mach das final", "renderte das Video", "mach den Endexport", "bau das Video zusammen", "mach es fertig für YouTube", "gib mir die MP4", "export the final", "render the final cut", "make the master", "export for TikTok", "give me the mp4". Cubre el renderizado de segmentos con caché, concat protegido, audio de una pasada, normalización de sonoridad y el muxeo único. argument-hint: [slug-del-proyecto] [plataforma] arguments: [project, platform]

export-final

Ensambla el archivo terminado. Argumentos: slug $project, $platform sobrescribe output.platform si el usuario quiere un segundo entregable. Solicitud completa en $ARGUMENTS. Un marcador de posición $ vacío significa que la habilidad se activó automáticamente en lugar de ser invocada con barra: toma el proyecto de PIPELINE_STATE en el contexto de la sesión y di cuál elegiste. Los nombres de los verbos siguen el contrato de construcción; python engine/ve.py --help es la referencia.

La arquitectura de renderizado, que está definida

  • Video: un MP4/MKV en caché por segmento, parámetros de codificación idénticos, cada uno comenzando en un fotograma IDR, luego unidos con -f concat -safe 0 -c copy. Verificado sin pérdida y casi instantáneo.
  • Audio: una pasada continua sobre toda la línea de tiempo en pcm_s24le. Nunca se almacena en caché por segmento.
  • Muxeo único, codificando AAC exactamente una vez.

No rediseñes esto en el momento de la exportación. En particular, no lo "simplifiques" en un único filter_complex sobre todos los segmentos: un grafo de 150 segmentos tiene aproximadamente 19k caracteres y alrededor de 260 segmentos desborda la línea de comandos de Windows, produciendo un proceso que no se puede iniciar en lugar de un error útil. También descarta el caché por segmento, que es la razón por la que una segunda exportación toma segundos.

Los grafos de filtros siempre van a un archivo y se pasan como -/filter_complex fc.txt. Incondicionalmente, no solo cuando se vuelven largos.

Paso 1 - verificación previa

Antes de codificar cualquier cosa:

  1. Ejecuta qc-pass. Una exportación sobre un proyecto que falla el control de calidad desperdicia la operación más larga del pipeline.
  2. Confirma output.platform. Esto determina el objetivo de sonoridad, la resolución y el área segura de subtítulos. Si $platform difiere de output.platform, no mutas silenciosamente el proyecto - renderiza una segunda ruta de salida y di cuál es cuál.
  3. Reporta el plan: cantidad de segmentos, total de fotogramas esperados, duración esperada, códec, y si los subtítulos y gráficos se están quemando en esta pasada.

Paso 2 - renderizar segmentos

python engine/ve.py render $project

Almacenado en caché por segmento en .cache/seg/, clave basada en la clave fuerte de la fuente, fotogramas in/out, filtros, codificador y versiones de herramientas. Solo los segmentos modificados se vuelven a renderizar. --only seg_0012 renderiza uno para inspeccionar.

Valores predeterminados del codificador: h264_nvenc, cq 20, preset p6. NVENC en esta tarjeta Ada está en una paridad aproximada de VMAF con libx264 - detrás por 0.19 VMAF a 2 Mbps, adelante por 0.06 a 8 Mbps - mientras se ejecuta 2-4 veces más rápido. Es la opción predeterminada correcta para vistas previas y una defensible para finales. Cambia a libx264 solo si el usuario solicita la máxima calidad por bit y está dispuesto a esperar.

Ambos codificadores fueron byte-reproducibles ejecución tras ejecución en esta máquina, que es lo que hace seguro el almacenamiento en caché segmentado por contenido.

Paso 3 - concat, pero protégelo primero

concat_compatible() se ejecuta antes de cada concat -c copy, sin excepción. En una discrepancia de parámetros, el demuxer concat te entrega un archivo corrupto con exit 0 - sin advertencia, sin error, un archivo que se reproduce durante diez segundos y luego se desmorona. El control de calidad (c) es esta comprobación.

Compara resolución, formato de píxeles, códec, perfil, nivel, base de tiempo, frecuencia de muestreo y disposición de canales en cada segmento. Una discrepancia significa que un segmento se renderizó con parámetros diferentes, generalmente una entrada de caché obsoleta de antes de que cambiara una configuración del codificador. Vuelve a renderizar los infractores en lugar de forzar el concat.

Paso 4 - audio y sonoridad

python engine/ve.py render $project

Luego, loudnorm de dos pasos al objetivo de la plataforma desde output.loudnorm (YouTube: I -14, TP -1.5, LRA 11; otras plataformas difieren y se encuentran en presets/formats/).

El paso 2 debe llevar un -ar 48000 explícito. Sin él, la salida es silenciosamente 192 kHz: la frecuencia interna de loudnorm se filtra en la salida, el archivo es cuatro veces más grande de lo esperado, y algunos reproductores lo remuestrean mal. Esta es la bandera que más se olvida en toda la cadena.

Dos pasos, no un solo paso: loudnorm de un solo paso es una estimación dinámica y acierta un decibelio o más lejos del objetivo en material con una apertura silenciosa, que es cada video de persona hablando con un fondo.

Paso 5 - muxeo único

Los pasos 2 a 5 son todos ve render $project: renderiza o reutiliza los segmentos en caché, los concatena, renderiza el audio en una pasada, lo normaliza y multiplexa AAC 320k exactamente una vez en projects/$project/out/final.mp4 según output.path.

No recodifiques video en el mux. Si algo necesita cambiar en la imagen, cambia a nivel de segmento y el caché se encarga del resto.

Después del mux, ve render compone las superposiciones renderizadas y luego quema el ASS si captions.burn_in - en ese orden, para que los subtítulos estén encima de los gráficos. Ambos recodifican el master, que es por lo que ve gfx y ve captions son cosas que ejecutas antes de ve render, no después. Ejecutarlos después deja un master una versión atrás y nada te advierte.

ve export es un paso separado y posterior: ejecuta el control de calidad completo, se niega en caso de fallo a menos que pases --force, luego sella una copia de entrega fechada y escribe un .manifest.json a su lado.

Paso 6 - verifica el entregable, luego entrégalo

Ejecuta las comprobaciones obligatorias contra el archivo de salida real, no contra el plan:

  • El recuento de fotogramas es igual a la suma de (out_frame - in_frame) sobre los segmentos habilitados. Control de calidad (a).
  • El recuento de muestras de audio es igual a frames / fps * 48000. Control de calidad (b).
  • La sonoridad integrada ebur128 dentro de 0.5 LU del objetivo de la plataforma, pico verdadero por debajo del techo. Control de calidad (f).
  • El contenedor, resolución, velocidad de fotogramas y duración coinciden con output.
  • Comprobación puntual de tres fotogramas: primero, un límite de segmento en el medio, último. Un fotograma negro en un límite significa que un segmento se renderizó más corto.

Luego informa: ruta de salida, tamaño de archivo, duración, LUFS medido y pico verdadero, recuento de fotogramas, recuento de segmentos y cuántos segmentos provinieron del caché. Establece stage en "export".

Segundos entregables

Un corte vertical no es un recorte del archivo terminado. Es un output.platform diferente, lo que significa un objetivo de sonoridad diferente, un preset de subtítulos diferente y un área segura diferente, y generalmente una pasada de historia diferente. Dilo en lugar de escalar el master 16:9.

Modos de fallo

SíntomaCausaSolución
La salida se reproduce y luego se rompe, ffmpeg salió 0Discrepancia de parámetros en concatconcat_compatible() antes de cada concat; vuelve a renderizar a los infractores
El master es 192 kHzloudnorm paso 2 sin -ar 48000Agrégalo y vuelve a ejecutar el paso 2
El proceso de codificación no se iniciaGrafo de filtros en la línea de comandosSiempre escribe fc.txt y pasa -/filter_complex
La sonoridad está a un decibelio del objetivoloudnorm de un solo pasoDos pasos
La exportación es más lenta cada vezCaché invalidado por un cambio en la configuración del codificadorEsperado; confirma que el cambio de configuración fue intencional
Fotograma negro en un corteSegmento renderizado más cortoVuelve a renderizar ese segmento; verifica el control de calidad (a)
Voz más baja en el final que en la vista previaamix sin normalize=0Arregla en el grafo de audio, vuelve a renderizar el audio

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

businessbaum/vedit

This skill should be used when the user asks for subtitles or on-screen text of what is being said - "brenn die Untertitel ein", "mach Untertitel", "Untertitel drauf", "leg Untertitel drüber", "brenn die Subs ein", "mach die Captions", "Wort für Wort Untertitel", "Karaoke-Untertitel", "korrigier den Untertitel-Text", "burn in the captions", "add subtitles", "burn the subs", "word-by-word captions", "fix a caption typo". Covers ASS generation, the pixel-width grouping rule for German, the font table, and burn-in through libass.

businessbaum/vedit

This skill should be used when the user asks for mechanical tightening of material that is already selected - "mach den Rohschnitt", "bau den Rohschnitt", "schneid die Ähms raus", "nimm die Füllwörter raus", "entferne die Pausen", "kürz die Pausen", "schneid die Versprecher raus", "mach den Radioschnitt", "straff das", "build the rough cut", "cut the fillers", "remove the ums", "tighten the pauses", "trim the dead air", "cut the retakes", "radio edit". Turns kept story blocks into enabled segments in project.json. Does not decide what the video is about - that is cut-story.

businessbaum/vedit

This skill should be used when the user asks to decide what the video is actually about before any mechanical cutting - "bau die Story", "was soll ins Video", "was kann raus", "welche Themen bleiben", "kürz das auf 6 Minuten", "mach daraus ein kurzes Video", "wo ist der Hook", "sortier die Themen", "worum geht es hier eigentlich", "build the story", "decide what stays", "structure this", "cut this down to N minutes", "find the hook", "reorder the topics". This is the CONTENT-selection pass that writes the "story" block in project.json; it runs after transcribe and before cut-rough.

Skills relacionados