¿Cómo aplico un código de tiempo y luego acelero x4 un video con ffmpeg sin perder calidad?

Estoy tratando de crear un archivo .bat para ffmpeg que:

  • Aplica una superposición de código de tiempo (por ejemplo, 00:17:23:02)
  • Acelera el video x4 (pero DESPUÉS de aplicar el código de tiempo)
  • No "toca" la calidad del video original

Esto es lo que conseguí:

for %%a in ("*.avi") do ( ffmpeg.exe -i "%%a" -vf "drawtext=fontfile=C\\:/Windows/Fonts/arial.ttf:timecode='00\:00\:00\:00':rate=5:text='Real \time\:':fontsize=46:fontcolor=white:x=30:y=30: box=1: boxcolor=0x00000000@1" -f avi "%%~na_with-time.avi" )


Funciona pero no puedo acelerar x4 el video y además pierde mucha calidad (muy pixelado al moverse en el video)

Este es el código que podría usar para acelerar x4 el video, pero no puedo obtenerlo en el código anterior (para que funcione):"setpts=0.25*PTS"

También esta es la calidad:

Cómo se ve el video antes:

Después de la conversión con el código ffmpeg .bat anterior:

¿Hay alguna manera de acelerar el video x4 (pero con el código de tiempo normal) y tampoco cambiar la calidad del video exportado)?

Además, ¿hay alguna manera de hacer que el cuadro negro detrás del código de tiempo sea un poco más grande (5 píxeles en todas las direcciones: izquierda, arriba, derecha, abajo)? ¿O tal vez un efecto de trazo en el texto en lugar del cuadro negro?

Respuestas (1)

Utilizar

for %%a in ("*.avi") do (
    ffmpeg.exe -i "%%a" -vf "drawtext=fontfile=C\\:/Windows/Fonts/arial.ttf:timecode='00\:00\:00\:00':rate=5:text='Real \time\:':fontsize=46:fontcolor=white:x=30:y=30:box=1:boxcolor=0x00000000@1:boxborderw=5,setpts=0.25*PTS" -c:v libx264 -f avi "%%~na_with-time.avi"
)

Agregado boxborderw=5para el ancho del borde.

Se agregaron ajustes después del texto de dibujo.

Codificador agregado explícitamente -c:v libx264: su configuración predeterminada debería producir buenas imágenes. También puede seguir con el codificador predeterminado (mpeg4) y simplemente agregarlo -q:v 5para obtener una calidad decente: el valor predeterminado de 200 kbps es demasiado bajo.


Para una cadena de código de tiempo personalizada, eliminetimecode='00\:00\:00\:00':rate=5

y cambiar texta

text='Real \time\: %{eif\:trunc(t/3600)\:d\:2}h %{eif\:trunc(mod(t/60\,60))\:d\:2}m %{eif\:trunc(mod(t\,60))\:d\:2}s'

¡Gracias! ¿Hay alguna manera de reemplazar Real time: 00: 06: 31: 04 con Real time: 00h 06m 31s (para que haya un espacio después del tiempo:, no más: y se eliminan los marcos (últimos dígitos))?
Además, es posible centrar el código de tiempo (horizontalmente) sin verificar qué tan ancho es el video (por lo que no uso 1920/2 = 960). ¿Tal vez algo así como 50% (similar a HTML/CSS 50%)?
Para centrar horizontalmente, agregue x='(W-tw)/2'. Se puede hacer una cadena personalizada, pero es un poco complicada, así que la agregaré mañana.
¡Gracias! Probé el código y hay un problema con el tamaño del texto del código de tiempo, si el video es muy grande (2K/4K), el código de tiempo es muy pequeño. ¿Hay alguna manera de hacer que el código de tiempo sea el 20% del ancho del video?
No directamente. Agregue fontsize=H/10donde H es la altura del video. Pruebe y vea qué expresión da como resultado la huella requerida.
¡Gracias! ¿Hay alguna manera de solucionar este problema? A veces, el video renderizado/convertido es más largo que el tiempo real (por lo que en esta captura de pantalla dice que dura 51 minutos, pero en realidad son 7:59 minutos, no puede pasar de las 7:59) minutos en este reproductor): i.imgur.com/MozuyV4.png
Eso suena como un AVI corrupto. ¿Puede C4D guardar en un formato diferente?
No estoy grabando/guardando desde Cinema 4D. Estoy grabando con Bandicam.