Convirtiendo 60i a 60p

Hola. He estado grabando programas en Plex desde fuentes OTA, a través de HDHomeRun, y he conseguido que MCEBuddy se active y convierta los archivos de forma fiable. Pero estoy desesperado con una parte concreta de la conversión.

Para los programas que se emiten en 1080i60, MCEBuddy los trata como si tuvieran 29,97 fps (técnicamente es correcto, pero hay 60 campos por segundo, y eso sí afecta a la resolución temporal). Esto significa que, al exportar, obtengo un archivo 1080p30, al parecer sin importar el perfil que use ni el codificador que elija. Es un problema porque debería ser posible obtener un archivo 1080p60 utilizando un desentrelazado tipo bob o yadif, que conservaría la resolución temporal de 60p. De hecho, eso es lo que hacen Plex y mi propio televisor para mostrar los archivos .ts originales a 60p fluido y se ve genial.

Puedo conseguir que la aplicación independiente de Handbrake exporte así, así que definitivamente es posible.

He intentado especificar manualmente 59,94 fps en los Ajustes Expertos, pero incluso eso produce un archivo exportado a 29,97 fps. ¿Hay alguna forma de que MCEBuddy determine la frecuencia de fotogramas de salida basándose en el número de campos por segundo, en lugar del número de fotogramas del archivo de origen? ¿O hay alguna otra solución para conseguir una exportación equivalente? Gracias.

Este es un tema interesante, creo que encontré lo que está pasando.

Creo que el “problema” es que MCEbuddy está eligiendo Handbrake como el programa de codificación y la forma en que MCEbuddy pasa tu framerate (el que especificas en la GUI) a Handbrake es agregando el parámetro de línea de comandos -r 59.94

El uso del parámetro -r por defecto establece el framerate máximo, así que le está diciendo a handbrake que elija un framerate no mayor que (59.94) en lugar de forzarlo. Parece que con esto elige uno en el rango de 29.xx…

Creo que hay algunas formas de evitar esto, entonces:

  1. no usar handbrake (mala opción)
  2. usar un perfil predeterminado donde la prioridad de ffmpeg sea mayor que la de handbrake (mala opción)
  3. agregar -cfr al final de handbrake-general en tu perfil (mejor opción)

es decir, para la opción 3, en profiles.conf el perfil [mp4 normal]:

handbrake-general=--decomb --loose-anamorphic --verbose=2 -f mp4 -O 

se convierte en

handbrake-general=--decomb --loose-anamorphic --verbose=2 -f mp4 -O --cfr

Puedes probar rápidamente que este es el problema usando un perfil donde ffmpeg tenga mayor prioridad. Usa el perfil [DivX AVI Normal] con 59.54 establecido en la gui, usa ffmpeg.
Aquí están mis resultados con eso:

Video
ID                                       : 1
Format                                   : xvid
Codec ID                                 : xvid
Duration                                 : 26 s 994 ms
Bit rate                                 : 1 826 kb/s
Width                                    : 1 920 pixels
Height                                   : 1 072 pixels
Display aspect ratio                     : 16:9
Frame rate                               : 59.940 (60000/1001) FPS
Scan type                                : Progressive
Bits/(Pixel*Frame)                       : 0.015
Stream size                              : 5.87 MiB (87%)

Para la explicación, esto está tomado directamente de la documentación de handbrakecli:

   -r, --rate <float>      Set video framerate
                       (5/10/12/15/20/23.976/24/25/29.97/
                       30/48/50/59.94/60/72/75/90/100/120
                       or a number between 1 and 1000).
                       Be aware that not specifying a framerate lets
                       HandBrake preserve a source's time stamps,
                       potentially creating variable framerate video

--vfr, --cfr, --pfr     Select variable, constant or peak-limited
                       frame rate control. VFR preserves the source
                       timing. CFR makes the output constant rate at
                       the rate given by the -r flag (or the source's
                       average rate if no -r is given). PFR doesn't
                       allow the rate to go over the rate specified
                       with the -r flag but won't change the source
                       timing if it's below that rate.
                       If none of these flags are given, the default
                       is --pfr when -r is given and --vfr otherwise

Finalmente, no estoy exactamente seguro de que duplicar el framerate sea lo que quieres. Si un video es desentrelazado a 30fps, no haces nada al duplicarlo a 60, que puede ser lo que está haciendo establecer el framerate. No estoy exactamente seguro pero creo que quieres duplicar el framerate y modificar la configuración del desentrelazado.

Aquí está lo que pienso basado en mi limitado entendimiento, y no estoy seguro de cómo lo hace plex, lo hace decomb, y cómo difiere yadif:

Ejemplo
60i fps, frames en 3 segundos de video:

ABCDEFGH

30p fps, frames en 3 segundos de video:

ACEG

60p fps, frames en 3 segundos de video, después de duplicar el framerate al establecer
-r 59.94 -cfr :

AACCEEGG

En lo anterior, ¿30p y 60p deberían verse igual para un humano, no? El “framerate” se duplicó pero los frames son los mismos así que no hay diferencia visual?

Realmente lo que quieres es
60i fps, frames en 3 segundos de video:

ABCDEFGH

60p fps, frames en 3 segundos de video:

ABCDEFGH

Y para lograr este efecto deseado creo que necesitas modificar tu configuración de desentrelazado.
Mira esto: Yadif deinterlace

Estas son las configuraciones en MCEbuddy para yadif, que nunca cambian:

yadif=0:-1:1 

MCEbuddy Handbrake por otro lado usa

--decomb (default decomb settings / no preset)

De los docs:

    --decomb[=string]   Deinterlace video using a combination of yadif,
                       blend, cubic, or EEDI2 interpolation.

                       Presets:
                           bob
                           eedi2
                           eedi2bob

Puedes ver por qué decomb es bueno, primero calcula si necesita desentrelazar (mantiene los frames si no hay combing y si necesita desentrelazar, usa una mezcla de métodos de desentrelazado (que calcula cuál sería el mejor para usar en ese momento del video).

Entonces, estoy seguro de que decomb se beneficiaría en su estado predeterminado al duplicar el framerate, pero no estoy seguro de si el beneficio real que buscas requiere

--decomb=bob 

¿en cambio? Y establecer esto requeriría un perfil personalizado y podría verse afectado en MCEbuddy al cambiar la detección automática de int.

Una buena prueba sería forzar el framerate en la GUI de handbrake usando decomb predeterminado y decomb BOB, avísame si puedes notar una diferencia

Muchísimas gracias. Vi tu mensaje anterior y básicamente llegué a la misma conclusión que tú. El truco para lograr una reproducción fluida desde la interfaz gráfica de Handbrake es, efectivamente, activar Decomb y configurarlo en Bob. Ni siquiera necesito especificar una tasa de fotogramas; simplemente resuelve el problema.

Acabo de modificar el perfil «MKV Normal» y añadirle decomb=bob:

handbrake-general=--decomb=bob --detelecine --loose-anamorphic --verbose=2 -O

En realidad espero no tener que añadirle -cfr, porque en la versión gráfica no es necesario. En un mundo ideal, este preset también desentrelazaría programas grabados, por ejemplo, a 24 fps, así que estoy intentando conseguir que con un único perfil MCEBuddy siempre genere un archivo que coincida con el material original.

Ya lo estoy ejecutando sobre un archivo de prueba y volveré a comentar cuando termine. Gracias de nuevo.

¡Excelente! Por tu publicación parecía que estabas muy cerca de la respuesta y me confundí, pero después de mirarlo era un poco más matizado.

¿Notas una diferencia entre
1080i60 → 1080p30
y
1080i60 → 1080p60 --decomb / --decomb bob?

Me pregunto, quizá le eche un vistazo, nunca lo había considerado.

Acabo de terminar la prueba y se ve fantástico. Definitivamente noto una diferencia con --decomb activado; el movimiento es muchísimo más fluido que en 1080p30. La salida ahora es visualmente indistinguible del archivo de entrada. (También puede ser porque es el doble del tamaño del archivo, así que la tasa de bits/calidad es el próximo problema a abordar…)

Me alegra que lo hayas resuelto, ya que yo también me estoy encontrando con esto. ¿Todavía necesitas especificar 59.94 fps en la Configuración Avanzada con este método?

He intentado usar handbrake-general=--decomb=bob --detelecine --loose-anamorphic --verbose=2 -O sin éxito.

Termino con una tasa de fotogramas entrecortada de 30fps. También he abandonado la idea de desentrelazar mi video y simplemente usar MCEBuddy para recortar los comerciales, pero ahora ni siquiera puedo hacer que eso funcione.

  1. Ninguna combinación de AutoDeinterlace=false, ffmpeg-VideoOptimized=true, handbrake-VideoOptimized=true con ningún perfil predeterminado está preservando mi video entrelazado de 60 campos por segundo.

  2. Usar MP4 Sin Procesar tampoco preserva los campos por segundo y termino con un video entrecortado 1080i30.

No estoy seguro de qué más hacer en este punto. ¡Podría usar algunos consejos!