export-final
Monta o arquivo final. Argumentos: slug $project, $platform substitui
output.platform se o usuário quiser uma segunda entrega. Requisição completa em $ARGUMENTS. Um
placeholder vazio $ significa que o skill foi acionado automaticamente em vez de ser invocado por barra: pegue
o projeto de PIPELINE_STATE no contexto da sessão e informe qual foi selecionado. Os nomes
dos verbos seguem o contrato de build; python engine/ve.py --help vence.
A arquitetura de renderização, que está definida
- Vídeo: um MP4/MKV por segmento, em cache, com parâmetros de codificação idênticos, cada um começando em um
quadro IDR, depois unidos com
-f concat -safe 0 -c copy. Verificado sem perdas e quase instantâneo. - Áudio: uma passagem contínua sobre toda a linha do tempo em
pcm_s24le. Nunca armazenado em cache por segmento. - Multiplexa uma vez, codificando AAC exatamente uma vez.
Não redesenhe isso no momento da exportação. Em particular, não "simplifique" em um único
filter_complex sobre todos os segmentos: um gráfico de 150 segmentos tem cerca de 19 mil caracteres e cerca de
260 segmentos estouram a linha de comando do Windows, produzindo um processo que não pode ser iniciado em vez de
um erro útil. Também descarta o cache por segmento, que é a razão pela qual uma segunda exportação
leva segundos.
Gráficos de filtro sempre vão para um arquivo e são passados como -/filter_complex fc.txt.
Incondicionalmente, não apenas quando ficam longos.
Etapa 1 - pré-verificação
Antes de codificar qualquer coisa:
- Execute qc-pass. Uma exportação em um projeto que falha no QC desperdiça a operação mais longa do pipeline.
- Confirme
output.platform. Isso define o alvo de loudness, a resolução e a área segura de legendas. Se$platformdiferir deoutput.platform, não mude o projeto silenciosamente - renderize um segundo caminho de saída e informe qual é qual. - Reporte o plano: número de segmentos, total de quadros esperado, duração esperada, codec, e se legendas e gráficos estão sendo queimados nesta passagem.
Etapa 2 - renderizar segmentos
python engine/ve.py render $project
Armazenado em cache por segmento em .cache/seg/, chaveado pela chave forte da fonte, quadros in/out,
filtros, codec e versões das ferramentas. Apenas segmentos alterados são re-renderizados. --only seg_0012
renderiza um para inspeção.
Padrões do codificador: h264_nvenc, cq 20, preset p6. NVENC nesta placa Ada está em paridade
aproximada de VMAF com libx264 - atrás por 0,19 VMAF a 2 Mbps, à frente por 0,06 a 8 Mbps - enquanto executa
2 a 4 vezes mais rápido. É o padrão certo para prévias e defensável para finais. Mude para
libx264 apenas se o usuário pedir máxima qualidade por bit e estiver disposto a esperar.
Ambos os codificadores foram reproduzíveis byte a byte, execução após execução, nesta máquina, o que torna o armazenamento em cache de segmentos baseado em conteúdo seguro.
Etapa 3 - concatenar, mas proteger primeiro
concat_compatible() é executado antes de toda concatenação com -c copy, sem exceção. Em uma
disparidade de parâmetros, o demuxer concat entrega um arquivo corrompido com exit 0 - sem aviso,
sem erro, um arquivo que roda por dez segundos e depois desmorona. A verificação de QC (c) é esta
verificação.
Ela compara resolução, formato de pixel, codec, perfil, nível, base de tempo, taxa de amostragem e layout de canal em todos os segmentos. Uma disparidade significa que um segmento foi renderizado com parâmetros diferentes - geralmente uma entrada de cache obsoleta de antes de uma configuração do codificador ser alterada. Re-renderize os infratores em vez de forçar a concatenação.
Etapa 4 - áudio e loudness
python engine/ve.py render $project
Em seguida, loudnorm em duas passagens para o alvo da plataforma a partir de output.loudnorm (YouTube: I
-14, TP -1.5, LRA 11; outras plataformas diferem e estão em presets/formats/).
A passagem 2 deve carregar um -ar 48000 explícito. Sem ele, a saída é silenciosamente 192 kHz -
a taxa interna do loudnorm vaza para a saída, o arquivo é quatro vezes maior que o esperado,
e alguns players o reamostram mal. Esta é a flag mais esquecida em toda a cadeia.
Duas passagens, não uma passagem única: loudnorm de passagem única é uma estimativa dinâmica e erra o alvo por um decibel ou mais em material com abertura silenciosa, o que é todo vídeo de cabeça falante com fundo.
Etapa 5 - multiplexar uma vez
As etapas 2 a 5 são todas ve render $project: ele renderiza ou reutiliza os segmentos em cache, concatena,
renderiza o áudio em uma passagem, aplica loudnorm e multiplexa AAC 320k exatamente uma vez em
projects/$project/out/final.mp4 de acordo com output.path.
Não recodifique o vídeo na multiplexação. Se algo precisar mudar na imagem, isso muda no nível do segmento e o cache cuida do resto.
Após a multiplexação, ve render compõe as sobreposições renderizadas e então queima o ASS se
captions.burn_in - nessa ordem, para que as legendas fiquem acima dos gráficos. Ambas recodificam o
master, e é por isso que ve gfx e ve captions são coisas que você executa antes de ve render, não
depois. Executá-las depois deixa o master uma versão atrasada e nada avisa.
ve export é uma etapa separada, posterior: executa QC completo, recusa em caso de falha a menos que você passe
--force, então carimba uma cópia de entrega datada e escreve um .manifest.json ao lado dela.
Etapa 6 - verificar a entrega, então entregar
Execute as verificações obrigatórias no arquivo de saída real, não no plano:
- A contagem de quadros é igual à soma de
(out_frame - in_frame)sobre segmentos habilitados. QC (a). - A contagem de amostras de áudio é igual a
frames / fps * 48000. QC (b). - Loudness integrada
ebur128dentro de 0,5 LU do alvo da plataforma, pico verdadeiro abaixo do limite. QC (f). - Contêiner, resolução, taxa de quadros e duração correspondem a
output. - Verifique três quadros: primeiro, um limite de segmento no meio, último. Um quadro preto em um limite significa que um segmento foi renderizado curto.
Em seguida, reporte: caminho de saída, tamanho do arquivo, duração, LUFS medido e pico verdadeiro, contagem de quadros,
contagem de segmentos e quantos segmentos vieram do cache. Defina stage como "export".
Segundas entregas
Um corte vertical não é um recorte do arquivo final. É um output.platform diferente,
o que significa um alvo de loudness diferente, um preset de legenda diferente e uma área
segura diferente, e geralmente uma passagem de história diferente. Diga isso em vez de redimensionar o master 16:9.
Modos de falha
| Sintoma | Causa | Correção |
|---|---|---|
| A saída roda e depois quebra, ffmpeg saiu com 0 | Disparidade de parâmetros na concatenação | concat_compatible() antes de toda concatenação; re-renderize infratores |
| Master está a 192 kHz | Passagem 2 do loudnorm sem -ar 48000 | Adicione e reexecute a passagem 2 |
| Processo de codificação falha ao iniciar | Gráfico de filtro na linha de comando | Sempre escreva fc.txt e passe -/filter_complex |
| Loudness um decibel fora do alvo | loudnorm de passagem única | Duas passagens |
| Exportação é mais lenta a cada vez | Cache invalidado por uma configuração de codificador alterada | Esperado; confirme que a mudança de configuração foi intencional |
| Quadro preto em um corte | Segmento renderizado curto | Re-renderize aquele segmento; verifique QC (a) |
| Voz mais baixa no final do que na prévia | amix sem normalize=0 | Corrija no gráfico de áudio, re-renderize o áudio |