Decodificando e codificando h264 via hardware (nVidia)

Yep… o ffmpeg suporta!

Para decodificar vídeos usando CUDA, adicione a opção -hwaccel cuvid antes de informar o(s) arquivo(s) de entrada (com a opção -i e, no codec de vídeo, use h264_nvenc. Repare que no processo de codificação aparece um status speed= nx. Essa é a velocidade média de conversão. Com o codec libx264 e a decodificação puramrnte em software, consigo aqui cerca de 0.9x. Com as modificações acima, quase 20x. Ou seja, um vídeo de 1 hora, é convertido em 3 minutos!

No meu caso, minha placa-de-vídeo é bem velha: Uma GT630 (chip Tegra). Em placas mais recentes, com drivers mais recentes (GTX série 1000 ou RTX série 2000), a velocidade pode aumentar um bocado – e essas placas conseguem codificar, por hardware, inclusive, h265!

PS: Infelizmente isso ai em cima só funciona com nVidia. Existe o codec h264_vaapi, que usa recursos de hardware para quem tem vídeo on-board Intel (GPU) e opções audo, vaapi e qsv para usar paralelismo em processadores/GPUs Intel, mas isso depende de instalação de drivers (que, dependendo da distro, podem não suportar)… Pelo menos, não consegui fazer funcionar numa de minhas máquinas…

Suponha que você queira converter um vídeo de 2h, com resolução de 720p @ 30Hz:

$ ffmpeg -hwaccel cuvid -i videoin.mp4 \
   -c:v h264_nvenc -b:v 2M -maxrate 2M -bufsize 2M \
   -c:a ac3 -b:a 128k -ac 2 \
   videoout.mp4

Ahhh… os fatores multiplicativos, nas opções -b:x, -maxrate e -bufsize são sempre maiúsculos (exceto ‘k’, que pode ser minúsculo!). Assim, 2 Mb/s é escrito como 2M (nunca ‘2m’) e eles aceitam valores “quebrados” ou expressões: 980k pode ser escrito como 0.98M, sem problemas…