Saltar al contenido

¿Cómo usar la GPU para acelerar la velocidad de procesamiento del filtro ffmpeg?

Solución:

Cuando se trata de aceleración de hardware en FFmpeg, puede esperar las siguientes implementaciones por tipo:

1. Codificadores acelerados por hardware: En el caso de NVIDIA, NVENC es compatible e implementado a través de las envolturas h264_nvenc y hevc_nvenc. Vea esta respuesta sobre cómo ajustarlos y las limitaciones que pueda encontrar según la generación de hardware en la que se encuentre.

2. Filtros acelerados por hardware: Los filtros que realizan tareas como el escalado y el posprocesamiento (desentrelazado, etc.) están disponibles en FFmpeg, y algunas implementaciones están aceleradas por hardware. Para NVIDIA, los siguientes filtros pueden aprovechar la aceleración de hardware:

(a). scale_cuda: Este es un filtro de escala análogo al filtro de escala genérico, implementado en CUDA. Su dependencia es el proyecto ffnvcodec, los encabezados necesarios para habilitar también los codificadores basados ​​en NVENC. Cuando los encabezados ffnvcodec están presentes, los filtros respectivos que dependen de ellos (scale_cuda y yadif_cuda) se habilitarán automáticamente. En producción, puede ser conveniente desaprobar este filtro a favor de scale_npp ya que tiene un conjunto de opciones muy limitado.

(B). scale_npp: este es un filtro de escala implementado en las primitivas de rendimiento de NVIDIA. Su dependencia principal es el SDK de CUDA, y debe habilitarse explícitamente pasando --enable-libnpp, --enable-cuda-nvcc y --enable-nonfree banderas a ./configure en tiempo de compilación al construir FFmpeg desde la fuente. Utilice este filtro en lugar de scale_cuda donde sea posible.

(C). yadif_cuda: Este es un desentrelazador, implementado en CUDA. Su dependencia, como se indicó anteriormente, es el paquete de encabezados ffnvcodec.

(D). Todos los filtros basados ​​en OpenCL: Todas las GPU compatibles con NVENC compatibles con el controlador NVIDIA de línea principal y el SDK de CUDA implementan la compatibilidad con OpenCL. Comencé esta sección con esta aclaración porque hay noticias de que NVIDIA desaprobará las GPU Kepler móviles en su controlador de línea principal, relegándolas al estado de soporte heredado. Por esta razón, si está en una plataforma de este tipo, tenga esto en cuenta.

Para habilitar estos filtros, pase --enable-opencl a FFmpeg’s ./configure script en el momento de la compilación. Tenga en cuenta que esto requiere que los encabezados OpenCL estén presentes en su sistema, y ​​su administrador de paquetes puede satisfacerlos de manera segura en cualquier distribución de Linux en la que se encuentre. En otros sistemas operativos, su millaje puede variar.

Para ver todos los filtros basados ​​en OpenCL, ejecute:

ffmpeg -h filters | grep opencl

Algunos ejemplos notables son unsharp_opencl,avgblur_opencl, etc. Consulte esta sección de wiki para obtener más opciones.

(mi). Todos los filtros basados ​​en Vulkan:

Si FFmpeg se construye con soporte para el back-end de Vulkan, habrá nuevos filtros disponibles, que se pueden enumerar a través de:

ffmpeg -filters | grep vulkan

Estos filtros son en su mayoría beneficiosos para la interoperabilidad VAAPI y AMF de AMD, donde los HWContexts compartidos se pueden usar para acelerar enormemente funciones como el escalado, etc. El caso de uso de AMD, en particular, le permite realizar escalado acelerado por hardware con Vulkan, lo cual es crítico para un rendimiento en tiempo real con los codificadores de AMF porque la implementación actual de AMF en FFmpeg carece de filtros de escala. Esto podría cambiar en el futuro a medida que Khronos termine con las extensiones Vulkan para la codificación de video.

A continuación se muestra un ejemplo de un filtro de escala basado en Vulkan con FFmpeg ejecutándose en una GPU NVIDIA con aceleración NVDEC H / W con codificación NVENC:

ffmpeg -threads 1 -loglevel info -nostdin -y 
   -fflags +genpts-fastseek 
   -init_hw_device cuda=cuda:0 -filter_hw_device cuda 
   -hwaccel nvdec -hwaccel_output_format cuda -extra_hw_frames 3 
   -reinit_filter 1 -vsync 1 -async 1 -filter_threads 2 -filter_complex_threads 2 
   -i input.mp4 -filter_complex 
  "[0:v]hwupload=derive_device=vulkan,split=2[s0][s1]; 
   [s0]scale_vulkan=w=1920:h=1080:scaler=0,hwupload=derive_device=cuda[v0]; 
   [s1]scale_vulkan=w=1280:h=720:scaler=0,hwupload=derive_device=cuda[v1]" 
  -map "[v0]" -b:v:0 5800k -minrate:v:0 5800k -maxrate:v:0 5800k -bufsize:v:0 5800k -c:v:0 h264_nvenc -r:v:0 ntsc 
  -profile:v:0 high -preset:v:0 llhp -rc:v:0 cbr_ld_hq -g:v:0 60 -gpu:v:0 0 -strict_gop:v:0 1 -bf:v:0 0 
  -map "[v1]"  -b:v:1 4000k -minrate:v:1 4000k -maxrate:v:1 4000k -bufsize:v:1 4000k -c:v:1 h264_nvenc -r:v:1 ntsc 
  -profile:v:1 high -preset:v:1 llhp -rc:v:1 cbr_ld_hq -g:v:1 60 -gpu:v:1 0 -strict_gop:v:1 1 -bf:v:1 0 
  -map 0:a -c:a libfdk_aac -ac 2 -ar 48000 -b:a 128k 
  -flags +global_header+cgop 
  -max_muxing_queue_size 9000000 -f tee  
  "[select='v:0,a':f=mp4]'hq.mp4'| 
   [select='v:1,a':f=mp4]'med.mp4'"

Vea cómo el fragmento anterior utiliza la capacidad de derivación de dispositivos del filtro de hwupload para insertar un contexto Vulkan H / W en la compleja cadena de filtros.

Una nota relacionada con el rendimiento con filtros basados ​​en OpenCL y Vulkan: Tenga en cuenta los gastos generales que los mecanismos introducidos por las cadenas de filtros como hwupload y hwdownload puede introducirse en su canalización, ya que la carga de texturas hacia y desde la memoria del sistema y el acelerador en cuestión afectará el rendimiento, y también formateará las operaciones de conversión (a través de la format filtro) donde sea necesario / requerido. En este caso, puede resultar beneficioso aprovechar las hwmap filtrar y derivar contextos cuando corresponda. Por ejemplo, VAAPI tiene un mecanismo que permite la derivación del dispositivo OpenCL y el mapeo inverso a través de hwmap, Si el cl_intel_va_api_media_sharing La extensión OpenCL está presente. Por lo general, esto lo proporciona el ICD de Beignet y está ausente en otros, como el controlador Neo OpenCL más nuevo.

3. Decodificadores acelerados por hardware (y sus envoltorios asociados): Dependiendo de su fuente de entrada y las capacidades de su GPU NVIDIA, según la generación, también puede aprovechar las aceleraciones de hardware basadas en CUVID o NVDEC. Estos métodos difieren en cómo manejan las texturas en vuelo en el acelerador, y es aconsejable evaluar otros factores, como la utilización de VRAM, cuando están en uso. Normalmente, puede aprovechar las hwaccels basadas en CUVID para operaciones como el desentrelazado, si así lo desea. Vea su uso a través de:

ffmpeg -h decoder=h264_cuvid
ffmpeg -h decoder=hevc_cuvid
ffmpeg -h decoder=mpeg2_cuvid

Sin embargo, tenga en cuenta que no es recomendable manejar contenido codificado en MBAFF con estos decodificadores, donde se requiere un desentrelazado doble, ya que NVIDIA aún no ha implementado el soporte MBAFF en el backend. Eche un vistazo a este hilo para obtener más información sobre el mismo.

Para concluir: Es aconsejable evaluar dónde y cuándo la descarga acelerada por hardware (filtrado, codificación y decodificación) ofrece una ventaja o una compensación aceptable (en calidad, soporte de funciones y confiabilidad) en su canal antes de la implementación en producción. Este es un enfoque neutral del proveedor al decidir qué y cuándo descargar partes de su canalización, y lo mismo se aplica a las soluciones de NVIDIA.

Para obtener más información, consulte la entrada de aceleración de hardware en la wiki de FFmpeg.

Advertencia: Asegúrese de reducir el número de subprocesos del decodificador a 1. Estas hwaccels, particularmente cuvid (y el contenedor nvdec) no implementan el soporte de subprocesos. De hecho, le lanzarán advertencias si el número de subprocesos excede 32. Para estos decodificadores, el número de subprocesos asume explícitamente el número de la superficie.

Aprobar -threads 1 para ffmpeg antes de aporte. La posición del argumento de los hilos es importante. En este caso, establece el número de subprocesos para el decodificador en 1. Después de la entrada, establece el número de subprocesos utilizado por los codificadores y muxers de FFmpeg (si se admiten subprocesos) en el valor configurado.

También tenga en cuenta el uso de un nuevo parámetro -extra_hw_frames 3 pasa directamente a FFmpeg cuando se usa NVDEC. Esto se hace para garantizar que el conjunto de superficies asignado a las instancias del decodificador y del codificador sea suficiente, normalmente el caso en el que otros filtros están encadenados, como el desentrelazado con yadif_cuda, scale_npp, etc. Consulte este ticket para obtener más información.

Ejemplos que demuestran el uso de filtrado, codificación y decodificación acelerados por hardware basados ​​en las notas anteriores:

1. Demuestre el uso de la codificación 1: N con NVENC:

Se hace la siguiente suposición: El banco de pruebas solo tiene una GPU con capacidad NVENC presente, una GTX 1070 simple. Por esta razón, estoy limitado a dos sesiones NVENC simultáneas, y eso se tiene en cuenta con los fragmentos a continuación. Tenga en cuenta que los casos que necesiten utilizar varias GPU compatibles con NVENC necesitarán que las líneas de comando se modifiquen según corresponda.

Mis archivos de muestra están en ~/Desktop/src

Trabajaré con un archivo de muestra como se muestra a continuación:

ffprobe -i deint-testfile.mkv -show_format -hide_banner -show_streams

Input #0, matroska,webm, from 'deint-testfile.mkv':
  Metadata:
    encoder         : libebml v1.3.3 + libmatroska v1.4.4
    creation_time   : 2016-03-02T23:20:05.000000Z
  Duration: 00:04:56.97, start: 0.066000, bitrate: 31036 kb/s
    Stream #0:0: Video: h264 (High), yuv420p(tv, bt709, top first), 1920x1080 [SAR 1:1 DAR 16:9], 59.94 fps, 59.94 tbr, 1k tbn, 59.94 tbc (default)
    Metadata:
      BPS             : 29131349
      BPS-eng         : 29131349
      DURATION        : 00:04:56.896000000
      DURATION-eng    : 00:04:56.896000000
      NUMBER_OF_FRAMES: 17598
      NUMBER_OF_FRAMES-eng: 17598
      NUMBER_OF_BYTES : 1081122637
      NUMBER_OF_BYTES-eng: 1081122637
      _STATISTICS_WRITING_APP: mkvmerge v8.9.0 ('Father Daughter') 64bit
      _STATISTICS_WRITING_APP-eng: mkvmerge v8.9.0 ('Father Daughter') 64bit
      _STATISTICS_WRITING_DATE_UTC: 2016-03-02 23:20:05
      _STATISTICS_WRITING_DATE_UTC-eng: 2016-03-02 23:20:05
      _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
      _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
    Stream #0:1: Audio: dts (DTS-HD MA), 48000 Hz, stereo, s32p (24 bit) (default)
    Metadata:
      BPS             : 1907258
      BPS-eng         : 1907258
      DURATION        : 00:04:56.896000000
      DURATION-eng    : 00:04:56.896000000
      NUMBER_OF_FRAMES: 27834
      NUMBER_OF_FRAMES-eng: 27834
      NUMBER_OF_BYTES : 70782196
      NUMBER_OF_BYTES-eng: 70782196
      _STATISTICS_WRITING_APP: mkvmerge v8.9.0 ('Father Daughter') 64bit
      _STATISTICS_WRITING_APP-eng: mkvmerge v8.9.0 ('Father Daughter') 64bit
      _STATISTICS_WRITING_DATE_UTC: 2016-03-02 23:20:05
      _STATISTICS_WRITING_DATE_UTC-eng: 2016-03-02 23:20:05
      _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
      _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
[STREAM]
index=0
codec_name=h264
codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
profile=High
codec_type=video
codec_time_base=317/38002
codec_tag_string=[0][0][0][0]
codec_tag=0x0000
width=1920
height=1080
coded_width=1920
coded_height=1088
has_b_frames=1
sample_aspect_ratio=1:1
display_aspect_ratio=16:9
pix_fmt=yuv420p
level=41
color_range=tv
color_space=bt709
color_transfer=bt709
color_primaries=bt709
chroma_location=left
field_order=tt
timecode=N/A
refs=1
is_avc=true
nal_length_size=4
id=N/A
r_frame_rate=19001/317
avg_frame_rate=19001/317
time_base=1/1000
start_pts=66
start_time=0.066000
duration_ts=N/A
duration=N/A
bit_rate=N/A
max_bit_rate=N/A
bits_per_raw_sample=8
nb_frames=N/A
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
TAG:BPS=29131349
TAG:BPS-eng=29131349
TAG:DURATION=00:04:56.896000000
TAG:DURATION-eng=00:04:56.896000000
TAG:NUMBER_OF_FRAMES=17598
TAG:NUMBER_OF_FRAMES-eng=17598
TAG:NUMBER_OF_BYTES=1081122637
TAG:NUMBER_OF_BYTES-eng=1081122637
TAG:_STATISTICS_WRITING_APP=mkvmerge v8.9.0 ('Father Daughter') 64bit
TAG:_STATISTICS_WRITING_APP-eng=mkvmerge v8.9.0 ('Father Daughter') 64bit
TAG:_STATISTICS_WRITING_DATE_UTC=2016-03-02 23:20:05
TAG:_STATISTICS_WRITING_DATE_UTC-eng=2016-03-02 23:20:05
TAG:_STATISTICS_TAGS=BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
TAG:_STATISTICS_TAGS-eng=BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
[/STREAM]
[STREAM]
index=1
codec_name=dts
codec_long_name=DCA (DTS Coherent Acoustics)
profile=DTS-HD MA
codec_type=audio
codec_time_base=1/48000
codec_tag_string=[0][0][0][0]
codec_tag=0x0000
sample_fmt=s32p
sample_rate=48000
channels=2
channel_layout=stereo
bits_per_sample=0
id=N/A
r_frame_rate=0/0
avg_frame_rate=0/0
time_base=1/1000
start_pts=76
start_time=0.076000
duration_ts=N/A
duration=N/A
bit_rate=N/A
max_bit_rate=N/A
bits_per_raw_sample=24
nb_frames=N/A
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=1
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
TAG:BPS=1907258
TAG:BPS-eng=1907258
TAG:DURATION=00:04:56.896000000
TAG:DURATION-eng=00:04:56.896000000
TAG:NUMBER_OF_FRAMES=27834
TAG:NUMBER_OF_FRAMES-eng=27834
TAG:NUMBER_OF_BYTES=70782196
TAG:NUMBER_OF_BYTES-eng=70782196
TAG:_STATISTICS_WRITING_APP=mkvmerge v8.9.0 ('Father Daughter') 64bit
TAG:_STATISTICS_WRITING_APP-eng=mkvmerge v8.9.0 ('Father Daughter') 64bit
TAG:_STATISTICS_WRITING_DATE_UTC=2016-03-02 23:20:05
TAG:_STATISTICS_WRITING_DATE_UTC-eng=2016-03-02 23:20:05
TAG:_STATISTICS_TAGS=BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
TAG:_STATISTICS_TAGS-eng=BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
[/STREAM]
[FORMAT]
filename=deint-testfile.mkv
nb_streams=2
nb_programs=0
format_name=matroska,webm
format_long_name=Matroska / WebM
start_time=0.066000
duration=296.972000
size=1152134036
bit_rate=31036839
probe_score=100
TAG:encoder=libebml v1.3.3 + libmatroska v1.4.4
TAG:creation_time=2016-03-02T23:20:05.000000Z
[/FORMAT]

Con esa información, podemos decir que el archivo de entrada está desentrelazado, codificado a 59,94 FPS. En los ejemplos siguientes, apuntaré a la misma velocidad de fotogramas, utilizando un GOP cerrado, asumiendo una distancia de fotogramas clave fija de 2 segundos (establecida por -g 120 dónde -r=60).

Puedo ejecutar esta muestra de codificador como se muestra, demostrando dos casos de uso:

  1. Use el decodificador basado en cuvid (h264_cuvid) como desentrelazador (tenga en cuenta que el formato de entrada es H.264 / AVC y, como tal, estamos usando el decodificador correcto):

   ffmpeg -threads 1 -fflags +genpts -y -c:v h264_cuvid -surfaces 8 -deint 2 -drop_second_field 1 -hwaccel_output_format cuda -extra_hw_frames 3 
   -i 'deint-testfile.mkv' -filter_complex 
  "[0:v:0]split=2[a][b]; 
   [a]scale_npp=w=1280:h=720:interp_algo=super[c]; 
   [b]scale_npp=w=640:h=360:interp_algo=super[d]" 
   -bsf:a aac_adtstoasc -c:a aac -ac 2 -ar 48000 -b:a 128k -vsync 1 -async 1 
  -b:v:0 6000k -minrate:v:0 6000k -maxrate:v:0 6000k -bufsize:v:0 400k -c:v:0 h264_nvenc 
  -profile:v:0 high -rc:v:0 cbr_ld_hq -level:v:0 4.2 -r:v:0 59.94 -g:v:0 120 -bf:v:0 3 -strict_gop:v:0 1 
  -b:v:1 4200k -minrate:v:1 4200k -maxrate:v:1 4200k -bufsize:v:1 280k -c:v:1 h264_nvenc 
  -profile:v:1 high -rc:v:1 cbr_ld_hq -level:v:1 4.2 -r:v:1 59.94 -g:v:1 120 -bf:v:1 3 -strict_gop:v:1 1 
  -flags +global_header+cgop 
  -map "[c]" -map "[d]" -map a:0 
  -f tee  
  "[select='v:0,a':f=flv]"/home/brainiarc7/Desktop/src/cheeks0.flv"| 
   [select='v:1,a':f=flv]"/home/brainiarc7/Desktop/src/cheeks1.flv""

2. Utilice nvdec hwaccel emparejado con el desentrelazador yadif_cuda:


   ffmpeg -threads 1 -fflags +genpts -y -hwaccel nvdec -hwaccel_output_format cuda -extra_hw_frames 3 
   -i 'deint-testfile.mkv' -filter_complex 
  "[0:v:0]yadif_cuda=0:-1:1,split=2[a][b]; 
   [a]scale_npp=w=1280:h=720:interp_algo=super[c]; 
   [b]scale_npp=w=640:h=360:interp_algo=super[d]" 
   -c:a aac -ac 2 -ar 48000 -b:a 128k -vsync 1 -async 1 
  -b:v:0 6000k -minrate:v:0 6000k -maxrate:v:0 6000k -bufsize:v:0 400k -c:v:0 h264_nvenc 
  -profile:v:0 high -rc:v:0 cbr_ld_hq -level:v:0 4.2 -r:v:0 59.94 -g:v:0 120 -bf:v:0 3 -strict_gop:v:0 1 
  -b:v:1 4200k -minrate:v:1 4200k -maxrate:v:1 4200k -bufsize:v:1 280k -c:v:1 h264_nvenc 
  -profile:v:1 high -rc:v:1 cbr_ld_hq -level:v:1 4.2 -r:v:1 59.94 -g:v:1 120 -bf:v:1 3 -strict_gop:v:1 1 
  -flags +global_header+cgop 
  -map "[c]" -map "[d]" -map a:0 
  -f tee  
  "[select='v:0,a':f=flv]"/home/brainiarc7/Desktop/src/cheeks0.flv"| 
   [select='v:1,a':f=flv]"/home/brainiarc7/Desktop/src/cheeks1.flv""

Puede utilizar un filtro adicional antes de yadif_cuda desentrelazador, hwupload_cuda en los casos en los que la decodificación acelerada por hardware no sea deseable. Cuando llamas al hwupload_cuda filtro, crea automáticamente un dispositivo tipo cuda, convierte todas las texturas en vuelo al formato cuda y las carga en el contexto de hardware CUDA compartido desde el cual este último filtra yadif_cuda puede operar. Sin embargo, si pasa la opción -hwaccel_output_format cuda puedes saltarte este extra hwupload_cuda filtrar. Este es el método preferido para obtener el máximo rendimiento.

Las opciones especificadas para el yadif_cuda filtro son:

(a). Configure el modo de desentrelazado como enviar un fotograma para cada fotograma.

(B). Establezca la paridad de tipo de imagen asumida como automática.

(C). Para desentrelazar únicamente los fotogramas marcados como desentrelazados.

Puede confirmar esto ejecutando:

ffmpeg -h filter=yadif_cuda

También puede intentar el desentrelazado doble (en el que el desentrelazador envía un fotograma por campo, en lugar de un fotograma por fotograma) aplicando las opciones de desentrelazador a continuación (consulte las opciones de filtro pasadas en yadif_cuda=1:-1:1):


   ffmpeg -fflags +genpts -y -hwaccel nvdec -hwaccel_output_format cuda 
   -threads 1 -extra_hw_frames 3 
   -i 'deint-testfile.mkv' -filter_complex 
  "[0:v:0]yadif_cuda=1:-1:1,split=2[a][b]; 
   [a]scale_npp=w=1280:h=720:interp_algo=lanczos[c]; 
   [b]scale_npp=w=640:h=360:interp_algo=lanczos[d]" 
   -af "aresample=async=1000:min_hard_comp=0.100000" -c:a aac -ac 2 -ar 48000 -b:a 128k -vsync 1 
  -b:v:0 6000k -minrate:v:0 6000k -maxrate:v:0 6000k -bufsize:v:0 400k -c:v:0 h264_nvenc 
  -profile:v:0 high -rc:v:0 cbr_ld_hq -level:v:0 4.2 -r:v:0 59.94 -g:v:0 120 -bf:v:0 3 -strict_gop:v:0 1 
  -b:v:1 4200k -minrate:v:1 4200k -maxrate:v:1 4200k -bufsize:v:1 280k -c:v:1 h264_nvenc 
  -profile:v:1 high -rc:v:1 cbr_ld_hq -level:v:1 4.2 -r:v:1 59.94 -g:v:1 120 -bf:v:1 3 -strict_gop:v:1 1 
  -flags +global_header 
  -map "[c]" -map "[d]" -map a:0 
  -f tee  
  "[select='v:0,a':f=flv]"/home/brainiarc7/Desktop/src/cheeks0.flv"| 
   [select='v:1,a':f=flv]"/home/brainiarc7/Desktop/src/cheeks1.flv""

Sin embargo, tenga cuidado con esta opción, ya que puede fallar en algunas velocidades de cuadro específicas. En mis pruebas, el uso de contenido entrelazado NTSC a 29.970 FPS resultó en un error al intentar un desentrelazado doble. Su experiencia puede ser diferente.

3. Demostrar el uso de un filtro OpenCL con la GPU NVIDIA:

El filtro que usaremos en este caso es el tonemap_opencl, con las siguientes opciones de uso:

ffmpeg -h filter=tonemap_opencl
Filter tonemap_opencl
  perform HDR to SDR conversion with tonemapping
    Inputs:
       #0: default (video)
    Outputs:
       #0: default (video)
tonemap_opencl AVOptions:
  tonemap           <int>        ..FV..... tonemap algorithm selection (from 0 to 6) (default none)
     none                         ..FV.....
     linear                       ..FV.....
     gamma                        ..FV.....
     clip                         ..FV.....
     reinhard                     ..FV.....
     hable                        ..FV.....
     mobius                       ..FV.....
  transfer          <int>        ..FV..... set transfer characteristic (from -1 to INT_MAX) (default bt709)
     bt709                        ..FV.....
     bt2020                       ..FV.....
  t                 <int>        ..FV..... set transfer characteristic (from -1 to INT_MAX) (default bt709)
     bt709                        ..FV.....
     bt2020                       ..FV.....
  matrix            <int>        ..FV..... set colorspace matrix (from -1 to INT_MAX) (default -1)
     bt709                        ..FV.....
     bt2020                       ..FV.....
  m                 <int>        ..FV..... set colorspace matrix (from -1 to INT_MAX) (default -1)
     bt709                        ..FV.....
     bt2020                       ..FV.....
  primaries         <int>        ..FV..... set color primaries (from -1 to INT_MAX) (default -1)
     bt709                        ..FV.....
     bt2020                       ..FV.....
  p                 <int>        ..FV..... set color primaries (from -1 to INT_MAX) (default -1)
     bt709                        ..FV.....
     bt2020                       ..FV.....
  range             <int>        ..FV..... set color range (from -1 to INT_MAX) (default -1)
     tv                           ..FV.....
     pc                           ..FV.....
     limited                      ..FV.....
     full                         ..FV.....
  r                 <int>        ..FV..... set color range (from -1 to INT_MAX) (default -1)
     tv                           ..FV.....
     pc                           ..FV.....
     limited                      ..FV.....
     full                         ..FV.....
  format            <pix_fmt>    ..FV..... output pixel format (default none)
  peak              <double>     ..FV..... signal peak override (from 0 to DBL_MAX) (default 0)
  param             <double>     ..FV..... tonemap parameter (from DBL_MIN to DBL_MAX) (default nan)
  desat             <double>     ..FV..... desaturation parameter (from 0 to DBL_MAX) (default 0.5)
  threshold         <double>     ..FV..... scene detection threshold (from 0 to DBL_MAX) (default 0.2)

El archivo de muestra en uso tiene metadatos HDR incrustados y, utilizando los codificadores NVENC, se codificará en un par de salidas con mapeo de tonos aplicado. El archivo de muestra utilizado es de esta URL.

Desde ffprobe:

ffprobe -i lgnyhdrdemo.ts -show_streams -hide_banner -show_format
[mpegts @ 0x55f34f8bbf80] start time for stream 1 is not set in estimate_timings_from_pts
[mpegts @ 0x55f34f8bbf80] Could not find codec parameters for stream 1 (Audio: aac ([15][0][0][0] / 0x000F), 0 channels): unspecified sample format
Consider increasing the value for the 'analyzeduration' and 'probesize' options
Input #0, mpegts, from 'lgnyhdrdemo.ts':
  Duration: 00:01:12.24, start: 0.999989, bitrate: 52032 kb/s
  Program 1 
    Stream #0:0[0x101]: Video: hevc (Main 10) ([36][0][0][0] / 0x0024), yuv420p10le(tv, bt2020nc/bt2020/smpte2084), 3840x2160 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 25 tbc
    Stream #0:1[0x102](und): Audio: aac ([15][0][0][0] / 0x000F), 0 channels
[STREAM]
index=0
codec_name=hevc
codec_long_name=H.265 / HEVC (High Efficiency Video Coding)
profile=Main 10
codec_type=video
codec_time_base=1/25
codec_tag_string=[36][0][0][0]
codec_tag=0x0024
width=3840
height=2160
coded_width=3840
coded_height=2160
has_b_frames=0
sample_aspect_ratio=1:1
display_aspect_ratio=16:9
pix_fmt=yuv420p10le
level=150
color_range=tv
color_space=bt2020nc
color_transfer=smpte2084
color_primaries=bt2020
chroma_location=unspecified
field_order=unknown
timecode=N/A
refs=1
id=0x101
r_frame_rate=25/1
avg_frame_rate=25/1
time_base=1/90000
start_pts=89999
start_time=0.999989
duration_ts=6501600
duration=72.240000
bit_rate=N/A
max_bit_rate=N/A
bits_per_raw_sample=N/A
nb_frames=N/A
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=0
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
[/STREAM]
[STREAM]
index=1
codec_name=aac
codec_long_name=AAC (Advanced Audio Coding)
profile=unknown
codec_type=audio
codec_time_base=1/0
codec_tag_string=[15][0][0][0]
codec_tag=0x000f
sample_fmt=unknown
sample_rate=0
channels=0
channel_layout=unknown
bits_per_sample=0
id=0x102
r_frame_rate=0/0
avg_frame_rate=0/0
time_base=1/90000
start_pts=89999
start_time=0.999989
duration_ts=6501600
duration=72.240000
bit_rate=N/A
max_bit_rate=N/A
bits_per_raw_sample=N/A
nb_frames=N/A
nb_read_frames=N/A
nb_read_packets=N/A
DISPOSITION:default=0
DISPOSITION:dub=0
DISPOSITION:original=0
DISPOSITION:comment=0
DISPOSITION:lyrics=0
DISPOSITION:karaoke=0
DISPOSITION:forced=0
DISPOSITION:hearing_impaired=0
DISPOSITION:visual_impaired=0
DISPOSITION:clean_effects=0
DISPOSITION:attached_pic=0
DISPOSITION:timed_thumbnails=0
TAG:language=und
[/STREAM]
[FORMAT]
filename=lgnyhdrdemo.ts
nb_streams=2
nb_programs=1
format_name=mpegts
format_long_name=MPEG-TS (MPEG-2 Transport Stream)
start_time=0.999989
duration=72.240000
size=469857120
bit_rate=52032903
probe_score=50
[/FORMAT]

Ahora apliquemos el tonemap_opencl filtrar al comando anterior, cambiar al nuevo archivo de entrada y cronometrar el comando:


   time ffmpeg -fflags +genpts -y -hwaccel nvdec -init_hw_device opencl=ocl -filter_hw_device ocl 
   -threads 1 -extra_hw_frames 3 
   -i 'lgnyhdrdemo.ts' -filter_complex 
  "[0:v:0]hwupload,tonemap_opencl=t=bt2020:tonemap=hable:desat=0:format=nv12,hwupload_cuda,split=2[a][b]; 
   [a]scale_npp=w=1280:h=720:interp_algo=lanczos[c]; 
   [b]scale_npp=w=640:h=360:interp_algo=lanczos[d]" 
   -af "aresample=async=1000:min_hard_comp=0.100000" -c:a aac -ac 2 -ar 48000 -b:a 128k -vsync 1 
  -b:v:0 6000k -minrate:v:0 6000k -maxrate:v:0 6000k -bufsize:v:0 480k -c:v:0 h264_nvenc 
  -profile:v:0 high -rc:v:0 cbr_ld_hq -level:v:0 4.2 -r:v:0 25 -g:v:0 50 -bf:v:0 3 -strict_gop:v:0 1 
  -b:v:1 4200k -minrate:v:1 4200k -maxrate:v:1 4200k -bufsize:v:1 672k -c:v:1 h264_nvenc 
  -profile:v:1 high -rc:v:1 cbr_ld_hq -level:v:1 4.2 -r:v:1 25 -g:v:1 50 -bf:v:1 3 -strict_gop:v:1 1 
  -flags +global_header 
  -map "[c]" -map "[d]" -map a:0 
  -f tee  
  "[select='v:0,a':f=flv]"/home/brainiarc7/Desktop/src/tonemapped0.flv"| 
   [select='v:1,a':f=flv]"/home/brainiarc7/Desktop/src/tonemapped1.flv""

Según FFmpeg, eso tomó:

frame= 1806 fps= 37 q=2.0 Lq=2.0 size=N/A time=00:01:12.20 bitrate=N/A speed=1.49x      
video:84533kB audio:1068kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: unknown
[aac @ 0x562e85cc9b00] Qavg: 4252.148

real    0m48.894s
user    0m45.710s
sys 0m17.049s

Para obtener más información sobre el mapeo de tonos, consulte este excelente artículo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *