Como evitar o deadlock entre o bug do FFMPEG 3.3.5 e o recurso necessário?

1

Um projeto requer um recurso opcional do FFMPEG disponível na v3.3.5. Um exemplo de comando é:

ffmpeg -y -i original.mp4 -f lavfi -i color=c=black:s=960x540 \
  -filter_complex "[0:v]scale=-1:540[scaled], \
     [1:v][scaled]overlay=shortest=1:x‌​=(main_w-w)/2:eof_ac‌​tion=endall, \
          format=y‌​uv420p[vid], \
     [vid]dra‌​wtext=fix_bounds=tru‌​e:text='This is a comment':font=bold:x=(w-text_w)/2:y=h-(text_h*1)-40:borderco‌​[email protected]:borde‌​rw=7[out], \
     [0:a]anull‌​[audio]" \
  -map "[out]" -map "[audio]" test.mp4

No entanto, esta versão engasga com um bug introduzido na v3.3.3. Algumas questões relacionadas "resolvem" o problema revertendo para o FFMPEG v3.2.x , mas meu projeto não pode viver com uma v3.3.

Os primeiros feedbacks de Mulvya sugerem alguns problemas com este comando. Alguma solução para esta situação aparentemente sem saída?

    
por Eric Platon 10.01.2018 / 07:00

1 resposta

2

Seu comando original pode ser modificado para

ffmpeg -y -i original.mp4 -f lavfi -i color=c=black:s=960x540=d=1 \
  -filter_complex "[0:v]scale=-1:540[scaled]; \
     [1:v][scaled]overlay=x‌​=(main_w-w)/2:eof_ac‌​tion=endall, \
          format=y‌​uv420p, \
          dra‌​wtext=fix_bounds=tru‌​e:text='This is a comment':font=bold:x=(w-text_w)/2:y=h-(text_h*1)-40:borderco‌​[email protected]:borde‌​rw=7[out]; \
     [0:a]anull‌​[audio]" \
  -map "[out]" -map "[audio]" test.mp4

Alternativamente, isso dá o mesmo resultado,

ffmpeg -y -i original.mp4 \
  -vf "scale=-1:540,pad=960:540:(ow-iw)/2,
          dra‌​wtext=fix_bounds=tru‌​e:text='This is a comment':font=bold:x=(w-text_w)/2:y=h-(text_h*1)-40:borderco‌​[email protected]:borde‌​rw=7"
 test.mp4

Notas:

1) Os filtros separados devem ser separados por ponto-e-vírgula, não por vírgula. Uma cadeia de filtros é distinta quando o seu conjunto de entradas não é idêntico ao conjunto de saídas do filtro anterior, e. escala recebe uma entrada e emite uma saída. overlay leva em duas entradas, daí que faz um novo filterchain. Da mesma forma, a saída de texto com texto não é passada para a anulação, de modo que é uma cadeia de filtros diferente. Por outro lado, se a saída de um filtro for igual à entrada de outro filtro, eles poderão ser separados por uma vírgula e os rótulos não serão necessários nessa junção.

2) Eu mantive o filtro de áudio anull no comando modded, mas não faz nada. É usado para testes por desenvolvedores.

3) o padrão de overlay é yuv420p, então o formato não é necessário.

4) O método alternativo é preferível, pois a sobreposição é sincronizada com a entrada base e descarta os quadros da sobreposição se a taxa de quadros da sobreposição for maior. Pode não ser perceptível na maioria dos casos, no entanto.

    
por 10.01.2018 / 07:30

Tags