Fazer um crossfade entre duas partes do conteúdo de vídeo é realmente bastante complicado no FFmpeg. Não há filtro "crossfade" como existe para o áudio.
Qual é uma maneira eficiente de fazer isso?
ffmpeg
video-editing
Mark Gerolimatos
fonte
fonte
[0:a][1:a] acrossfade=d=1 [audio]
ao filtro e depois-map "[audio]"
ao comando e funcionou. Se quiser, faça um teste e atualize a resposta!Respostas:
Versão TL; DR:
Este exemplo executa apenas vídeo, assumindo que os dois clipes de vídeo tenham a mesma resolução, taxa de quadros etc. Isso criará um desvanecimento de 1 segundo entre fadeoutclip e fadeinclip. Suponha que o fadeoutclip tenha 10 segundos de duração. Observe que isso está formatado para maior clareza: é realmente uma linha de código.
Versão completa:
Aqui está uma explicação do que se tratava:
Especificação de entrada ... óbvio
Criando um
filter_complex
: supondo que você já entenda os complexos de filtro:Primeiro, dividimos os dois fluxos em dois pedaços, cada um usando o filtro de compensação : o conteúdo e a seção de desbotamento cruzado. O desbotamento é dividido em seção de conteúdo e desbotamento, enquanto o desbotamento é cortado na seção e no conteúdo de desbotamento. Total de quatro seções.
Observe que, estritamente falando, não precisamos quebrar as seções de desbotamento cruzado: podemos especificar o desbotamento e o desbotamento nos tempos dos dois videoclipes. No entanto, ao fazer isso, nós:
overlay
do uso do filtroCada uma dessas quatro seções especifica: hora de início (segundos), hora de término (segundos) e o
setpts=PTS-STARTPTS
filtro misterioso , que basicamente faz com que cada subclipe de vídeo inicie em 0 segundos. Isso será vital ao recompô-los.Observe que os
s=0
especificadores são redundantes e osetpts
filtro para essess=0
TAMBÉM é redundante. No entanto, ambos são especificados de forma redundante para permitir que a hora de início seja alterada de 0, sem interromper o complexo do filtro. Além disso, o segundo clipe de conteúdo é executado até o final, portanto ae=
parte (end =) não é especificada.Em seguida, especificamos o desbotamento e desbotamento: primeiro adicionamos um canal alfa (transparência) às duas seções de desbotamento, especificando um formato de pixel de
yuva420p
. Você pode realmente usar qualquer formato que forneça um canal alfa.Em seguida neste filtro subcomplexo temos de especificar um para fade out, e um para fade in. Os
alpha=1
meios que o vídeo em si não vai escurecer, apenas a quantidade transparência "fade".st
significa começar,d
significa duração.O que é isso ?: O
fifo
filtro garante que haja espaço no buffer disponível no complexo de filtros. Surpreendentemente, esse NÃO é o padrão. Se você não fizer isso, o crossfade poderá falhar se a saída do estágio acima substituir o filtro de sobreposição abaixo. Sim, eu sei o que você está pensando agora. É realmente um bug do FFMPEG .Agora, sobreponha as duas seções de desvanecimento: Ao garantir que as duas seções de desvanecimento cruzado sejam do mesmo tamanho, não precisamos nos preocupar com as opções bastante desagradáveis que o filtro de sobreposição utiliza (e, portanto, as ignoramos aqui):
Finalmente, alinhamos nossos três segmentos usando o filtro concat .
E agora, mapeie o painel de saída como sua fonte de vídeo.
NÃO SE ESQUEÇA de definir o formato de pixel PARA O QUE VOCÊ NORMALMENTE usa (normalmente
yuv420p
), pois a seção de crossfade o definiráyuv420
no canal de saída! (como não o especificamos, você pode usar os argumentos de sobreposição) Obviamente, se você QUERyuv420
, então está bem :-)Você pode recombinar o áudio posteriormente (fora do escopo das perguntas e respostas)
fonte
trim=start=0:end=9
(em vez detrim=st=0:e=9,
..Filter setpts has an unconnected output
para o script. Eu já mudei os parâmetros de corte para começar e terminar.