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:
- Ejecuta qc-pass. Una exportación sobre un proyecto que falla el control de calidad desperdicia la operación más larga del pipeline.
- Confirma
output.platform. Esto determina el objetivo de sonoridad, la resolución y el área segura de subtítulos. Si$platformdifiere deoutput.platform, no mutas silenciosamente el proyecto - renderiza una segunda ruta de salida y di cuál es cuál. - 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
ebur128dentro 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íntoma | Causa | Solución |
|---|---|---|
| La salida se reproduce y luego se rompe, ffmpeg salió 0 | Discrepancia de parámetros en concat | concat_compatible() antes de cada concat; vuelve a renderizar a los infractores |
| El master es 192 kHz | loudnorm paso 2 sin -ar 48000 | Agrégalo y vuelve a ejecutar el paso 2 |
| El proceso de codificación no se inicia | Grafo de filtros en la línea de comandos | Siempre escribe fc.txt y pasa -/filter_complex |
| La sonoridad está a un decibelio del objetivo | loudnorm de un solo paso | Dos pasos |
| La exportación es más lenta cada vez | Caché invalidado por un cambio en la configuración del codificador | Esperado; confirma que el cambio de configuración fue intencional |
| Fotograma negro en un corte | Segmento renderizado más corto | Vuelve a renderizar ese segmento; verifica el control de calidad (a) |
| Voz más baja en el final que en la vista previa | amix sin normalize=0 | Arregla en el grafo de audio, vuelve a renderizar el audio |