Eu estou tentando usar FFmpeg para vídeo dividido com base em alguns start_time
e end_time
insumos, e substituir aqueles com outros arquivos de vídeo. Por exemplo, para entrada 10 15
, precisarei substituir EXACT segundos 10 to 15
por outro vídeo.
ESTÁ BEM. O que me vem à mente é o seguinte:
- Primeiro divida o vídeo (neste caso, 0-10, 10-15 e 15 final)
- Substitua o 10-15 pelo outro vídeo
- Mesclar todos os sub-vídeos de volta
Primeira pergunta: esta é a solução melhor e mais rápida? Temos um comando mais fácil ou outras ferramentas para substituir um período específico no vídeo por outro vídeo?
Segunda pergunta: Supondo que o FFmpeg seja a solução viável, quando eu simplesmente uso o comando ffmpeg -I input.video -ss 10 -t 5 -c copy output.mp4
, meu código de processamento de vídeo não pode ler e processar o arquivo. Usei a mediainfo
ferramenta para comparar os dois arquivos e notei diferenças nos tamanhos dos cabeçalhos, enquanto todo o material relacionado ao codec de vídeo era o mesmo. Notei que o TAMANHO DO CABEÇOTE é diferente, o que aparentemente está causando o problema. Existe alguma maneira de forçar o tamanho do cabeçalho também (além dos codecs) ser o mesmo?
ATUALIZAÇÃO: Aqui está o .mp4
arquivo original que funciona bem no emulador.
.mp4
arquivo original, se necessário.Respostas:
Usando
trim
econcat
- arquivos de origem com diferentes codecsPara isso, verifique se seus arquivos individuais têm a mesma resolução e, idealmente, a mesma taxa de quadros e subamostragem de croma, etc. Isso evitará erros ou falhas durante a concatenação.
Você pode fazer tudo de uma só vez sem dividir o arquivo, usando os filtros
trim
econcat
:Aqui,
trim
é usado para especificar as partes individuais dos fluxos de vídeo de entrada (0:v
,1:v
) que você deseja concatenar mais tarde. Estas peças são nomeadosv0
através dev2
. (Osetpts
filtro redefine os carimbos de data e hora dessas partes individuais para 0, o que é necessário para a concatenação). Mais tarde, concatenamos as três partes.Se você deseja cortar de um determinado registro de data e hora para o final, use em
trim=start=15
vez de especificar o intervalo.Se seus arquivos tiverem áudio, você deverá aparar esses fluxos separadamente:
Observe que vídeo e áudio serão recodificados neste caso - certifique-se de especificar metas de qualidade de saída apropriadas (por exemplo,
-crf
para x264, x265 ou libvpx-vp9). Você pode ler mais sobre isso no Wiki do FFmpeg, por exemplo, para VP9 ou H.264 .Usando segmentos individuais
Se você deseja dividir os clipes e montá-los posteriormente:
Se os arquivos tiverem áudio, use a mesma abordagem acima:
Isso irá recodificar novamente o fluxo de vídeo. É um pouco mais direto, mas, caso contrário, deve ser equivalente ao método acima.
Usando o
concat
desmuxerEm princípio, você também pode tentar concatenar os fluxos de bits sem recodificá-los, usando o desmuxador concat. Crie um arquivo chamado
concat.txt
e adicione as seguintes entradas (correspondentes aos videoclipes criados acima):Em seguida, concatene esses arquivos individuais:
No entanto, isso exige que seus clipes tenham o mesmo codec, resolução, taxa de quadros etc. - para que não funcione com todos os tipos de fontes heterogêneas.
Usando
concat
protocoloO tipo acima de concatenação no nível de arquivo também pode ser alcançado usando o
concat
protocolo, com o mesmo tipo de restrições acima (o mesmo codec, resolução etc.):Para mais informações sobre concatenação, leia a respectiva página Wiki do FFmpeg .
fonte
concat
método lança um erro:[concat @ 00000000025c2560] Line 1: unknown keyword 'part1.mp4 \\ text.txt: Invalid data found when processing input
concat
desmuxador, a sintaxe era diferente. Corrigido agora. Para ir até o final, usetrim=start=15
, consulte a documentação do filtro de apara: ffmpeg.org/ffmpeg-filters.html#trim - quanto a problemas de tempo, isso realmente depende do material de origem. Ainda não houve problemas de concatenação com o clipe que você enviou.