Gostaria de cortar vídeos usando ffmpeg para aprendizado de máquina.
Como posso garantir que, se eu cortar (por exemplo) 1s de vídeo a 25fps, isso fornecerá exatamente 25 quadros de áudio e vídeo sincronizados?
Vi que o ffmpeg procura quadros-chave na hora do corte, escolhendo o mais próximo. Tive problemas porque ele gerava carimbos de data e hora negativos e preenchia o final do vídeo cortado com quadros copiados.
Entendo que os metadados não exibem fps reais e assim por diante.
Então qual seria o pipeline para obter cortes precisos com a quantidade exata de frames alinhados ao fluxo de áudio?
Obrigado
Responder1
Dependendo do codec e do contêiner do vídeo, isso pode exigir algumas etapas contra-intuitivas: Muitos codecs simplesmente não permitem pontos de entrada e saída aleatórios diretamente.
- Primeiro de tudo, você precisa cortar o vídeo (ignorando o áudio por um momento). É melhor fazer isso usando
-ss inpoint
e-pix_fmt yuv420p -an -f yuv4mpegpipe -frames:v 25
canalizando para umax264
ou outra instância do ffmpeg. Isso provou ser uma maneira confiável de cortar o fluxo de vídeo com precisão de quadro. - Para o áudio, a maneira mais fácil é converter para
-c:a pcm_s16le
e '-f s16le' e, em seguida, manipular o resultado no nível do arquivo para conter o número correto de bytes do deslocamento correto. - Uma última
ffmpeg
passagem pode compactar o áudio, se necessário, ou apenas mixá-lo no vídeo. Como o PCM bruto não contém carimbos de data/hora, não há potencial para assincronidade.
Isto provou ser uma forma confiável de colocar vídeos de fontes duvidosas (ou seja, clipes comerciais de algum anunciante) em um fluxo linear altamente regulamentado (ou seja, um canal de TV) sem introduzir quaisquer artefatos.