ffmpeg Problema Com setpts / asetpts e / ou select / aselect

2

Como uma continuação da pergunta , estou agora lutando com a edição síncrona do vídeo e do áudio.

Eu ainda tento cortar o vídeo por quadros. Embora os timestamps resultantes pareçam estar corretos no vídeo, o áudio está longe de estar em sincronia. Nem ajuda adicionar um tempo constante a asetpts . Parece mudar com cada intervalo de quadro diferente que eu uso.

Aqui está o que eu tenho (são apenas partes relevantes de um script mais longo):

SET SELECT=select='gte(n\,%4)*lte(n\,%5)'
SET ASELECT=aselect='gte(n\,%4)*lte(n\,%5)'
SET SETPTS=setpts='PTS-STARTPTS'
SET ASETPTS=asetpts='PTS-STARTPTS'
SET SCALE=scale='1280:-1'
SET CROP=%3
:
ffmpeg -y -i %1 -af %ASELECT%,%ASETPTS% -vf %SELECT%,%SETPTS%,%SCALE%,%CROP% ^
-ab 128k -crf 18 -pix_fmt yuv420p "%1 converted.mp4"

Em suma

  • é necessário o material de recorte e os quadros de início / fim como parâmetros
  • o arquivo de origem começa com ~ 1 segundo de áudio antes do início do vídeo sincronizado
  • se eu não usar setpts/asetpts e não select/aselect , o vídeo resultante começará com um segundo de um quadro congelado com áudio e, em seguida, o vídeo será reproduzido em sincronia com o áudio
  • se eu não usar setpts/asetpts , o vídeo resultante começará com um quadro congelado, depois o áudio entrará e, em seguida, começará com o quadro inicial passado o vídeo sendo reproduzido em sincronia com o áudio
  • se eu não usar o select/aselect , o vídeo resultante terá o vídeo e o áudio sendo desativados em aproximadamente um segundo
  • se eu usar tudo, o vídeo resultante terá vídeo e áudio iniciados com o quadro inicial e o áudio sendo desligado por aproximadamente um segundo

Eu acho que o select/aselect está funcionando bem, mas o setpts/asetpts está causando os problemas. Trabalhar apenas com filtros de vídeo ou filtros de áudio torna isso ainda pior.

Obviamente estou fazendo algo errado aqui. Portanto, alguém pode me ajudar aqui? Talvez seja possível explicar como os setpts e asetpts funcionam juntos?

EDIT:
Outras tentativas:

ffmpeg -y -i %1 ^
-filter_complex %ASELECT%,%ASETPTS%;%SELECT%,%SETPTS%,%SCALE%,%CROP% ^
-ab 128k -crf 18 -pix_fmt yuv420p "%1 converted.mp4"

com duas entradas (isso é muito lento):

ffmpeg -y -i %1 -i %1 ^
-filter_complex [1:1]%ASELECT%,%ASETPTS%[aud];[0:0]%SELECT%,%SETPTS%,%SCALE%,%CROP%[vid] ^
-map [vid] -map [aud] ^
-ab 128k -crf 18 -pix_fmt yuv420p "%1 converted.mp4"
    
por sjngm 13.04.2013 / 19:37

1 resposta

2

Para resumir, falhei.

O que estou fazendo agora é converter o número de quadros inicial e final em um registro de data e hora e usar -ss e -t como todos os outros no mundo (* suspiro *). Eu posso fazer isso desde que eu conheço o FPS do clipe.

No que diz respeito à sincronização, uso o truque de um clipe em dois arquivos de entrada.

O comando final agora se parece com:

ffmpeg -y -i %1 -itsoffset %audioDelay% -i %1 -vf %SCALE%,%CROP% ^
-ss %startTime% -t %duration% -r 25 ^
map=-map 0:0 -map 1:1 ^
-ab 128k -crf 18 -pix_fmt yuv420p "%~1 converted.mp4"

Não há mais filtros ...

    
por 19.04.2013 / 22:08