Yo uso AviDemux, funciona de maravillas y te permite hacer todas esas chanchadas desde GUI
Ffmpeg y el "height not divisible by 2"
Minipost de trivialidades nardogeeks, estaba queriend convertir un video de formato WEBM a MP4, nada del otro mundo ¿Qué uso? Handbrake me tiró un error raro así que pasé al inconfundible ffmpeg, el mejor de todos.
Pero he aquí que me encontré con un error "height not divisible by 2" WTF?
Pues bien, resulta que el formato MP4 requiere que las dimensiones sean pares así se pueden dividir por dos, sí, no tenía idea de esto, pero es lo que es y... a fumarla... ¿O no? Pues no mi ciela, porque ffmpeg es una usina de opciones extrañas que te permiten hacer cualquier cosa con los datos.
Encontré un método genial en StackOverflow (dónde sino?) que implica
Dividir la altura y el ancho original por dos, redondear al pixel más cercano, multiplicar por dos de nuevo (ahora será un número par), agregar píxeles negros donde requiera. Todo esto con un simple comando:
ffmpeg -i gato.webm -vcodec libx264 -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" -r 24 -y -an gato.mp4
Y el resultado es el correcto!
también está la versión cropeadora que es igual:
ffmpeg -i gato.webm -vf "crop=trunc(iw/2)*2:trunc(ih/2)*2" gato.mp4
El video en cuestión:
Re serio lo mío 😁
Otros posts que podrían llegar a gustarte...
Comentarios
-
Llegue tarde, pero este problema te lo vas a encontrar muy seguido. Los muchachos que suelen encodear material, se ve, no la tienen muy clara. Terminan sacando material en resoluciones mas que bizarras con el solo objetivo de achicar el flow de datos (y corrigiendo con DAR y SARs (relaciones de aspecto) mas bizarros aún que muchos reproductores no logran interpretar, estropeando todo)
Como laburo mucho con videos, y ffmpeg es, por lejos, la mejor herramienta para ello, mi approach para solucionar esto es mas preciso.
Basheando, y haciendo el ajuste de 1 línea de píxeles nomás si es que la altura o el ancho, re escalado, da impar.
alto=$(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height ${origen} | grep -m 1 -o -P ´(?<=height=).*´)
ancho=$(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=width ${origen} | grep -m 1 -o -P ´(?<=width=).*´)
anchosalida=$(( ${ancho} / ${factor} ))
altosalida=$(( ${alto} / ${factor} ))
echo "salida alto "$altosalida" ancho "$anchosalida
if (( $altosalida % 2 == 0 )); then ajustealto=0; echo "NO AJUSTANDO ALTO"; else ajustealto=1; ((altosalida++)); echo "AJUSTANDO ALTO a" $altosalida; fi
if (( $anchosalida % 2 == 0 )); then ajusteancho=0; echo "NO AJUSTANDO ANCHO"; else ajusteaancho=1; ((anchosalida++)); echo "AJUSTANDO ANCHO a" $anchosalida; fi
costó armar los IF, pero sin duda, la combinación bash + ffmpeg la rompe
Esto no lo vas a encontar en StackOverflow ;)