Transcodificación de más de 100 archivos de H.264 a H.265

Estoy en un proceso de transcodificación de más de 100 MKV de 720p con tasa de bits de alta calidad que contienen H.264 (x264) a H.265 (x265 / HEVC) .

Hago esto con el software HandBrake bajo Linux Debian 9 en Intel Xeon E3-1225 v3 3.2GHz 4-core .

Siguen varias versiones.

Núcleo:

4.8.0-1-amd64

Freno de mano :

0.10.5 (x86_64)

x265 :

2.1-2
using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX AVX2 FMA3 LZCNT BMI2

Tengo estos ajustes aplicados, según mediainfo :

Encoding settings: wpp / ctu=64 / min-cu-size=8 / max-tu-size=32 / tu-intra-depth=3 / tu-inter-depth=3 / me=3 / subme=4 / merange=57 / rect / amp / max-merge=4 / temporal-mvp / no-early-skip / rskip / rdpenalty=0 / no-tskip / no-tskip-fast / strong-intra-smoothing / no-lossless / no-cu-lossless / no-constrained-intra / no-fast-intra / open-gop / no-temporal-layers / interlace=0 / keyint=240 / min-keyint=24 / scenecut=40 / rc-lookahead=40 / lookahead-slices=0 / bframes=8 / bframe-bias=0 / b-adapt=2 / ref=5 / limit-refs=1 / limit-modes / weightp / weightb / aq-mode=1 / qg-size=32 / aq-strength=1.00 / cbqpoffs=0 / crqpoffs=0 / rd=6 / psy-rd=2.00 / rdoq-level=2 / psy-rdoq=1.00 / log2-max-poc-lsb=8 / no-rd-refine / signhide / deblock=0:0 / sao / no-sao-non-deblock / b-pyramid / cutree / no-intra-refresh / rc=crf / crf=21.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ipratio=1.40 / pbratio=1.30

En resumen, he aplicado Calidad Constante RF21 y un preajuste muy lento .

Los originales tienen un tamaño fijo de 2 GiB. Los tamaños de mis codificaciones difieren (puede deducir cuánto tiempo tomó también de la lista de archivos):

494M Dec  7 07:02 S05E16.mp4
551M Dec  7 00:14 S05E17.mp4
654M Dec  6 16:11 S05E18.mp4
668M Dec  6 08:10 S05E19.mp4

Los archivos originales tienen estos ajustes aplicados:

Encoding settings: cabac=1 / ref=5 / deblock=1:0:0 / analyse=0x3:0x133 / me=umh / subme=7 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=1 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=0 / chroma_qp_offset=-2 / threads=12 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=3 / b_pyramid=2 / b_adapt=1 / b_bias=0 / direct=1 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=23 / scenecut=40 / intra_refresh=0 / rc_lookahead=40 / rc=2pass / mbtree=1 / bitrate=5670 / ratetol=1.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / cplxblur=20.0 / qblur=0.5 / ip_ratio=1.40 / aq=1:1.00

La pregunta es, ¿está bien invertido el tiempo de la CPU ? Quiero decir, ¿puedo hacer optimizaciones obvias para acelerar las cosas sin tener como resultado archivos de menor calidad o más grandes?

EDITAR1 :

Cita de la fuente oficial :

x265 tiene diez opciones predefinidas que optimizan el equilibrio entre la velocidad de codificación (fotogramas codificados por segundo) y la eficiencia de compresión (calidad por bit en el flujo de bits). El preajuste predeterminado es medio. Hace un trabajo razonablemente bueno al encontrar la mejor calidad posible sin gastar ciclos de CPU excesivos buscando la forma más eficiente de lograr esa calidad. Cuando usa ajustes preestablecidos más rápidos, el codificador toma atajos para mejorar el rendimiento a expensas de la calidad y la eficiencia de la compresión. Cuando usa ajustes preestablecidos más lentos, x265 prueba más opciones de codificación, usando más cálculos para lograr la mejor calidad a la velocidad de bits seleccionada (o en el caso del control de velocidad –crf, la velocidad de bits más baja a la calidad seleccionada).

EDIT2 :

Configuración de hardware


Tipo: servidor dedicado mío. Actualmente se usa solo para transcodificar videos.

Procesador : Intel Xeon E3-1225 v3 3,2 GHz de 4 núcleos

GPU: Sin tarjeta dedicada, solo integrada

RAM: 32GB ECC 1600MHz

Discos:

  1. SSD; utilizado para el sistema

  2. HDD en RAID6; utilizado para escribir los videos de salida

  3. Disco RAM de 20 GB; utilizado para leer los videos fuente

EDITAR3 :

Con respecto al comentario sobre el intercambio de memoria, he establecido vm.swappiness= 1.

veryslowtoma mucho más tiempo para una mejora marginal. Sugeriría mediumpreestablecer con un CRF más bajo.
Recuerde también que los archivos tendrán la misma calidad independientemente de la configuración de velocidad, usar veryslow solo pasará más tiempo haciéndolo (como dijo Mulvya, marginalmente) más pequeño. Por lo tanto, puede priorizar dos: velocidad, calidad o tamaño del archivo.
¿Has intentado ejecutar más de una codificación en paralelo? Con máquinas multiprocesador, esto a veces puede conducir a una reducción drástica del tiempo total. No estoy seguro si puede ejecutar más de una instancia de Handbrake, pero ciertamente puede hacerlo con ffmpeg. Dos o más codificaciones paralelas significan que mientras una no usa la CPU, por ejemplo, durante la E/S del disco, la otra absorberá los ciclos de repuesto. Siempre que no use toda la memoria de su sistema, porque entonces comenzará a cambiarse al disco y las cosas irán mucho más lentas. Sugeriría monitorear la CPU, la E/S del disco y el uso de la memoria durante las codificaciones para ver.
no, vea la última oración: (o en el caso de control de velocidad –crf, la velocidad de bits más baja en la calidad seleccionada). IOW, si usa crf, la calidad es constante, solo varía el tamaño o la velocidad de codificación.
Pues entonces hay que priorizar el tamaño en el tiempo, dado que la calidad es constante. Por cierto, ¿de cuánto tiempo estás hablando?
@stib ~ 10 años
Deberías estar en lo cierto con h.265 entonces. Si estuviera hablando de más de 100 años, estaría sugiriendo un códec/contenedor de código abierto.
Puede consultar software.intel.com/en-us/intel-media-server-studio/try-buy si desea un codificador que sea más rápido. No está destinado al usuario final como el freno de mano, pero se envía con un código de ejemplo.
Para el OP, eliminó la cláusula relevante de la oración que puso en negrita " para lograr la mejor calidad a la velocidad de bits seleccionada ". Pero dado que está utilizando el modo CRF, la siguiente parte es la parte relevante real: " o en el caso de control de tasa –crf, la tasa de bits más baja en la calidad seleccionada ". Y con ajustes preestablecidos lentos, la diferencia en la tasa de bits es pequeña, pero el tiempo empleado es mucho mayor.

Respuestas (2)

Todo el día lo dediqué a probar varios escenarios. Lo siguiente se aplica a esta serie en particular en esta calidad en particular, por lo que no digo que se aplique en general . Así que en este caso se aplica lo siguiente:

  • los tamaños de los archivos con la misma configuración con solo mediumy veryslowpreestablecido cambiado varían insignificantemente: ~ -10 MiB en promedio a favor del veryslowpreestablecido

  • la calidad visual en una mirada muy cercana es más bien la misma en cualquiera de los dos mediumo veryslowpreestablecidos

Una cosa solucionada. He cambiado el preajuste a medium.


  • en una mirada muy cercana, los videos de origen no tienen una calidad tan alta como pensaba , eso explica por qué x265 se comprime a casi 1/4 del tamaño original

Otro misterio resuelto.

Siempre que ahora transcodifique a 25 fps, he elevado el RF a 20.


  • RAMDisk no ofrece ningún beneficio en este caso, tanto para preestablecidos mediumcomo para veryslowpreestablecidos; Terminé con RAID6 como fuente y SSD como unidad de salida

Se resolvió el inconveniente de mover archivos a RAMDisk.


Para responder a la pregunta, el tiempo de CPU no se gastó nada bien .

En mi experiencia, los slowajustes preestablecidos -er marcan la diferencia cuando tienes objetos en movimiento en la escena. AFAIK, una de las principales áreas de mejoras en x265 es la "predicción" y la reutilización de información sobre objetos que se mueven en la escena.

Cuanto más poder de cómputo gaste el codificador en encontrar estos objetos en movimiento y la forma de codificarlos, mejor calidad (o menor tasa de bits) obtendrá.

Entonces, la respuesta es: depende del contenido de tus clips y de lo que quieras hacer con el resultado. ¿Necesita una buena calidad de cada fotograma? (Cámara de seguridad) Entonces vale la pena codificar con slowy -qb. ¿Es solo una grabación informativa? Luego ve con mediumy crf 28y -tune film.