Colocar dois arquivos de vídeo de ponta a ponta parece ser a operação mais barata do mundo e, por cerca de cinco minutos, acreditei. Então entrei em um clipe de 1280 x 720 em 30fps para um clipe de 640 x 480 a 25fps usando o método mais rápido disponível, que copia os fluxos e não reescreve nada. Produziu um arquivo. O arquivo afirmava ser onze vírgula nove, nove e seis segundos de duração, quando os dois clipes somam onze, o contêiner dizia 1280x720, enquanto a segunda metade do fluxo era 640x480, e o muxer imprimiu um aviso sobre os carimbos de data e hora reescritos para cada quadro do segundo clipe. Tudo sobre a adesão ao vídeo segue do motivo pelo qual isso acontece.
tl;dr: A junção barata só funciona quando ambos os arquivos já concordam com o codec, resolução, taxa de quadros e base de tempo, que nunca o fazem. A rota honesta decodifica os dois e codifica um novo arquivo, que é mais lento e produz algo que é reproduzido. Medido aqui: o método de cópia relatou 11,996 segundos para 11 segundos de filmagem e declarou a resolução errada; o reencodex produziu exatamente 11,000 segundos em um único 1280x720 consistente em 0,63 segundos. Clipes de tamanhos diferentes devem ser encaixados em uma moldura primeiro, ou a junção é recusada completamente. o editor de vídeo Faz tudo isso no navegador, até oito clipes e trinta minutos.
Por que dois clipes não podem ficar presos juntos?
Porque um arquivo de vídeo não é um fluxo de fotos com um cabeçalho. É um contêiner que contém fluxos codificados e a codificação carrega um estado.
H.264 comprime descrevendo a maioria dos quadros como diferenças de outros quadros. Um quadro-chave está sozinho; tudo depois de definido em relação ao que veio antes, até o próximo quadro-chave. O decodificador também precisa dos conjuntos de parâmetros do Stream, que descrevem a resolução, o formato de cor e o perfil, e contém uma base de tempo que converte os números de cada pacote em segundos.
Dois arquivos feitos por dois dispositivos concordam em nada disso. Resolução diferente significa conjuntos de parâmetros diferentes. Taxa de quadros diferente geralmente significa uma base de tempo diferente. Até dois clipes do mesmo telefone, gravados com um ano de diferença, podem variar porque o aplicativo da câmera mudou suas configurações de codificador.
Concatenar os bytes fornece um fluxo cujo decodificador é informado de uma coisa no cabeçalho e entregue outro na metade. Às vezes, um jogador lida. Muitas vezes, mostra o primeiro clipe e para, ou toca o segundo como ruído colorido.
O que o método rápido produz?
Um arquivo, uma pilha de avisos e uma duração que está errada.
FFmpeg's Concat Demuxer Com a cópia do fluxo, todos os "apenas junte-se a eles" A resposta recomendada online é genuinamente a ferramenta certa quando as entradas correspondem. Apontado para meus dois clipes incompatíveis, ele sai com sucesso, e aqui está o que devolve:
| Medir | esperado | produzido |
|---|---|---|
| duração | 11.000 s | 11.996 s |
| Resolução declarada | um valor, correto | 1280x720 para um stream que se torna 640x480 |
| Avisos de carimbo de data/ho | nenhum | Um por quadro do segundo clipe |
Todos os avisos dizem a mesma coisa:
Non-monotonic DTS; previous: 90981, current: 76133; changing to 90982.
This may result in incorrect timestamps in the output file.
Os selos de data e hora do segundo clipe são reiniciados do zero, pois deveriam dentro de seu próprio arquivo, e o muxer não escreverá um fluxo cujos registros de data e hora retrocedem. Portanto, ele inventa novos, um quadro de cada vez, e a diferença acumulada entre o tempo real e o tempo inventado é de onde vem o segundo extra.
FFmmpeg ainda pode decodificar as duas metades depois, porque o FFmpeg é excepcionalmente tolerante. Um navegador não é. Este é o arquivo que funciona bem em sua máquina e mostra um retângulo preto para um visualizador.
O que custa a adesão por meio de um gráfico de filtro e o que ele compra?
Custa uma decodificação completa e codificação. Ele compra um arquivo correto.
Em vez de copiar fluxos, cada entrada é decodificada em quadros, os quadros são cortados e unidos dentro de um gráfico de filtro e um novo fluxo é codificado a partir do resultado. Cada quadro passa por um decodificador e um codificador, o que é um trabalho real.
O que compra é que a saída possui um codec, uma resolução, uma taxa de quadros e um conjunto contínuo de timestamps, porque tudo foi codificado de uma só vez do zero. Nos mesmos dois clipes:
| Medir | Método de cópia | gráfico de filtro |
|---|---|---|
| duração | 11.996 s | 11.000 s |
| Resolução | declarado 1280x720, torna-se 640x480 | 1280x720 em todo |
| quadros | 305 | 305 |
| tempo de exportação | instante | 0,63 s |
| Tamanho | menor | 2.1 Mb |
0,63 segundos de trabalho durante 11 segundos de saída, em uma área de trabalho executando o FFmmEg nativamente. Em uma guia do navegador por meio do WebAssembly, é várias vezes mais lento, que é a negociação honesta e o motivo pelo qual a contagem de clipes é limitada.
Por que cada clipe precisa de seus carimbos de data/hora rebaseados?
Porque a concatenação em um gráfico de filtro ingressa nos fluxos e os timestamps de um fluxo são absolutos.
Os quadros de cada clipe chegam com tempos de transporte medidos desde o início de seu próprio arquivo. Apare uma seção do meio de um clipe e essas molduras ainda dizem "Isso acontece em 42 segundos". Junte-os a um clipe que termina em 6 segundos e você terá um fluxo que salta de 6 para 42, com 36 segundos de nada no meio.
setpts=PTS-STARTPTS Subtrai o início de cada clipe de cada quadro, portanto, cada clipe começa em zero antes de ser unido. O equivalente de áudio é asetpts. Sem eles, a saída reproduz o primeiro clipe, depois um congelamento longo e o segundo. É o erro mais comum nos comandos de join do ffmpeg escritos à mão e é silencioso: o arquivo é válido e a duração é simplesmente errada.
O que acontece quando os clipes são de tamanhos diferentes?
A junção foi recusada e, até recentemente, essa recusa era toda a história aqui.
o filtro concat Compara suas entradas e não será executado se as dimensões do vídeo ou a proporção da amostra discordarem:
Input link in0:v0 parameters (size 640x480, SAR 1:1) do not match the
corresponding output link in0:v0 parameters (1280x720, SAR 1:1)
Failed to configure output pad on Parsed_concat_8
Isso é um aborto, não um aviso: nenhum arquivo é produzido. Dois telefones, ou um clipe de telefone e uma gravação de tela, é exatamente o caso que o aciona, e é a razão comum de alguém ingressar em clipes.
O áudio não precisa de tal ajuda, o que vale a pena saber porque é contra-intuitivo. O mesmo gráfico uniu uma faixa mono de 44,1 kHz a uma estéreo de 48 kHz sem reclamar e produziu um arquivo exato de 11.000 segundos. Apenas o lado do vídeo é estrito.
A solução é acertar um quadro para toda a linha do tempo e encaixar cada clipe antes de ingressar. A altura vem da resolução de saída que você escolheu ou do primeiro clipe quando você mantém a resolução da fonte, e a largura segue essa proporção de aspecto do clipe para que uma linha do tempo da cena do retrato permaneça no retrato. Cada clipe é então escalonado para caber dentro dessa moldura e acolchoado para preenchê-lo:
scale=1280:720:force_original_aspect_ratio=decrease,
pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1
Ajustar em vez de preencher significa que um clipe de uma forma diferente é marcado em uma caixa de correio em vez de esticado, que é o menor de dois males quando um clipe de 4:3 atende a uma linha do tempo de 16:9. setsar=1 Não é decoração: o filtro compara a proporção da amostra e as dimensões dos pixels, portanto, dois clipes podem ter o mesmo tamanho e ainda ser rejeitados.
Ambas as dimensões são arredondadas para números pares, porque H.264 em 4:2:0 armazena a cor em meia resolução em cada direção e não pode codificar uma largura ou altura ímpar.
Por que apenas oito clipes e trinta minutos?
Porque cada clipe custa uma decodificação dentro de uma guia do navegador e a guia tem uma quantidade fixa de memória.
Oito entradas significam oito decodificadores executados em um mesmo filtro gráfico, além do codificador, além de todos os arquivos de origem mantidos na memória, porque não há disco de transmissão. Trinta minutos de saída é o ponto passado que a codificação demora tempo suficiente para que as pessoas suponham que a página tenha travado.
Nenhum dos limites é uma lei do formato. Ambos são a linha que a construção do navegador deixa de ser agradável, e eles são declarados antecipadamente, em vez de serem descobertos quando uma guia trava quarenta minutos em uma exportação. Um clipe menor que um décimo de segundo também é recusado, pois abaixo não contribui com nenhum quadro e erros de FFmpeg em vez de avisar.
Para qualquer coisa maior, esta é a ferramenta errada e um editor de desktop é o correto.
Como o corte aqui é diferente do aparador?
Aparar dentro de uma junção é preciso e preciso, e não custa nada extra.
o dedicado aparador de vídeo Oferece um modo rápido que copia o fluxo e só pode cortar em um quadro-chave, e é por isso que o início de um corte às vezes chega até dez segundos mais cedo. seu guia Abrange o porquê em detalhes.
Esse comércio não existe aqui, porque a exportação está codificando tudo de qualquer maneira. A guarnição acontece dentro do gráfico do filtro, em quadros descodificados, portanto, um corte de 4,3 segundos é um corte em 4,3 segundos. Você obtém a precisão do quadro gratuitamente, como efeito colateral do custo que você já está pagando.
Portanto, se você deseja um clipe cortado e nada mais, o modo rápido do aparador é muito mais rápido. Se você está se juntando a qualquer coisa, apare aqui.
O que uma mudança de velocidade faz com o áudio?
Ele deve ser tratado separadamente, e a aritmética não é a mesma do vídeo.
A velocidade do vídeo é uma operação de carimbo de data/hora: setpts=PTS/2 A metade do tempo de apresentação de cada quadro e as molduras não são tocadas. O áudio não funciona dessa maneira, porque jogar amostras duas vezes mais rápido aumenta o tom de uma oitava. o atempo Em vez disso, filtre reamostras, mantendo o tom e alterando a duração.
atempo Aceito apenas 0,5 a 2,0 em uma única passagem durante a maior parte de sua vida, então uma mudança de 4x é construída em duas passagens de 2x e uma mudança de 0,25x a partir de duas passagens de 0,5x. As compilações atuais elevaram o teto e o FFmpeg 8.1 relata um intervalo de 0,5 a 100. medido em um clipe, um único atempo=4 e um acorrentado atempo=2,atempo=2 Aterrissou 11 milissegundos de intervalo.
A cadeia ainda é construída, porque o núcleo do WebAssembly é buscado em tempo de execução, em vez de fixado a uma versão, e multiplicar passes é correto em todas as compilações que já enviaram o filtro. A faixa de velocidade oferecida, de 0,25 a 4x, é onde o resultado ainda é uma edição, e não uma novidade.
MP4 ou WebM?
MP4 A menos que você tenha um motivo específico, e o motivo é quase sempre uma licença e não um argumento de qualidade.
| mp4 | webm | |
|---|---|---|
| codec de video | H.264 | VP9 |
| codec de áudio | aac | composição |
| joga em | tudo | Navegadores, a maioria dos jogadores modernos |
| Codifique a velocidade em uma guia | mais rápido | consideravelmente mais lento |
| Tamanho com qualidade semelhante | maior | menor |
O VP9 produz arquivos menores para a mesma qualidade percebida, e é livre de direitos, o que é importante para alguns projetos e nada para outros. FFmpeg's propria Guia de codificação VP9 é franco sobre o custo da velocidade. O que não é é rápido. O caminho da WebM aqui é executado em um CRF mais alto com prazo em tempo real e cpu-used 5, que são configurações que uma codificação de desktop consideraria descuidado, porque sem eles uma codificação VP9 em uma guia demora tempo suficiente para parecer quebrada.
O caminho MP4 usa -preset veryfast no CRF 23 com yuv420p, mais -movflags +faststart, que move o índice para a frente do arquivo para que ele seja reproduzido durante o download, em vez de apenas depois.
Qual será o tamanho da exportação e quanto tempo levará?
O tamanho é previsível a partir da resolução. O tempo não é previsível de nada.
Como a exportação sempre recodifica, o tamanho do arquivo de origem informa muito pouco sobre o resultado. A estimativa mostrada vem da altura de saída: aproximadamente 5 Mbps a 1080p, 2,5 a 720p, 1,2 abaixo disso, com WebM pousando em torno de 70% da figura MP4 e áudio adicionando 128 Kbps, a menos que mude.
Essa é uma estimativa e é rotulada como uma só, porque o conteúdo importa mais do que qualquer fórmula. Uma entrevista estática e uma panorâmica de mão através de árvores na mesma resolução e o mesmo CRF difere várias vezes, pois o CRF tem como alvo um nível de qualidade e gasta qualquer taxa de bits que ocorra.
O tempo depende da sua máquina, da resolução, do número de clipes e se a guia tem mais alguma coisa para fazer. A execução nativa do FFmpeg acima gerenciou 11 segundos de saída em 0,63 segundos; espere que o navegador seja várias vezes mais lento do que isso e espere que o WebM seja mais lento novamente.
O que isso não faz
Ele une, apara, reordena, escala, muda a velocidade e solta o áudio. Esse é todo o conjunto de recursos, e vale a pena ser claro sobre o espaço entre ele e um editor de vídeo.
Não há transições, nem títulos, faixas musicais, correção de cores, cortes, volume por clipe, nada com quadro-chave, nenhuma prévia da linha do tempo finalizada. Cada clipe é aparado e colocado, um conjunto de configurações de saída se aplica a todos eles e o resultado é codificado.
Isso abrange um trabalho real e comum: várias gravações que precisam ser um arquivo, cortadas nas partes úteis, na ordem certa, em um tamanho que algo aceitará. Para qualquer coisa que envolva uma decisão criativa, use um editor.
Em que ordem os clipes entram e você pode alterá-lo?
A ordem que você os adicionou e sim, com os botões UP e DOWN em cada clipe.
Reordenar é uma operação de lista em vez de uma de vídeo: mover um clipe muda, que o índice de entrada ocupa no gráfico do filtro e nada é relido ou decodificado até que a exportação seja executada. Portanto, uma mudança é instantânea, por mais grandes que sejam os arquivos, e você pode reorganizar uma linha do tempo quantas vezes quiser gratuitamente.
Botões em vez de arrastar e soltar é uma escolha deliberada para uma lista de no máximo oito itens. Cada um carrega uma etiqueta nomeando o clipe que ele se move, de modo que a ordem é alterada por teclado e legível por um leitor de tela, nenhuma das quais uma alça de arrasto oferece sem muito trabalho extra.
A coisa que vale a pena verificar antes de exportar é a direção da sequência. Várias gravações do mesmo evento geralmente vêm de um seletor de arquivos em ordem alfabética, que é a ordem em que os nomes de arquivos de uma câmera produzem e nem sempre a ordem em que as gravações foram feitas.
Por que isso funciona no navegador?
Porque a filmagem geralmente é do tipo que você prefere não fazer upload e o trabalho não precisa de servidor.
Todas as operações aqui são FFmpeg e FFmpeg Compila para WebAssembly. Os arquivos são lidos do disco para a guia, decodificados lá, ali, codificados ali, codificados ali e devolvidos como download. Nada é carregado, nenhuma fila contém suas filmagens e não há cópia em uma máquina que você não controla.
Os clipes que as pessoas participam são entrevistas, consultas, gravações familiares, capturas de tela de software interno, rascunhos embargo. A alternativa usual carrega várias centenas de megabytes para um serviço gratuito, converte-o em hardware sobre o qual você não sabe nada e o mantém em termos que ninguém lê.
Os custos são os oito tetos e os tetos de trinta minutos e uma codificação mais lenta que uma desktop. Ambos são indicados antes de você começar, que é o comércio que vale a pena fazer.



