Solução rígida de vídeo H265

Solução difícil, use não CPU para codificação, como GPU de placa gráfica, DSP dedicado, FPGA, chip ASIC, etc. Plataformas atuais de aceleração de GPU convencionais: INTEL, AMD, NVIDIA.

1. Comparação entre codificação suave e codificação rígida

Codificação suave: direta e simples de implementar, fácil de ajustar parâmetros e fácil de atualizar, mas a carga da CPU é pesada, o desempenho é inferior ao da codificação rígida e a qualidade em taxas de bits baixas geralmente é melhor do que a codificação rígida.
Codificação rígida: alto desempenho e a qualidade geralmente é inferior à da codificação suave em baixas taxas de bits, mas alguns produtos transplantaram excelentes algoritmos de codificação suave (como X264) na plataforma de hardware GPU, e a qualidade é basicamente equivalente a suave codificação.

2. A atual estrutura de desenvolvimento da plataforma GPU convencional

CUVID: Estrutura de programação fechada da NVIDIA, através da qual os recursos de computação GPU podem ser invocados, dedicado a N placas.
AMD APP: Um conjunto de estrutura de programação paralela de uso geral proposta pela AMD para sua própria GPU. O padrão é aberto. Ao suportar a estrutura OpenCL na CPU e GPU ao mesmo tempo, a fusão do poder de computação é realizada.
OpenCL: uma linguagem de computação aberta, uma estrutura para escrever programas para plataformas heterogêneas. Plataformas heterogêneas podem incluir CPUs, GPUs e outros processadores de computação. O objetivo é permitir que as mesmas operações suportem aceleração de hardware em plataformas diferentes.
Inel QuickSync: Um módulo de codec de vídeo dedicado integrado na placa gráfica Intel, dedicado ao display principal.
CUDA só pode ser executado em hardware de GPU NVIDIA. No entanto, o objetivo do OpenCL é enfrentar qualquer tipo de processador paralelo. OpenCL é o primeiro padrão de programação de direitos autorais verdadeiramente aberto e livre, adequado para computação geral em sistemas heterogêneos. A plataforma heterogênea pode ser construída por CPU, GPU, DSP, FPGA ou outros tipos de processadores.
DXVA: DXVA é a abreviatura de DirectX Video Acceleration, que se traduz em aceleração de hardware de vídeo em chinês. DXVA é uma especificação de aceleração de vídeo especialmente customizada pela Microsoft. Possui duas versões, nomeadamente DXVA 1.0 e DXVA 2.0. Quase todas as placas gráficas possuem recursos de aceleração de hardware.

3. Diferença de processo

Decodificação rígida e edição suave: leitura (ffmpeg) -> decodificador (NVIDIA) -> | Fila -> codificador (ffmpeg) decodificação suave e edição suave: leitura (ffmpeg) -> decodificador (ffmpeg) -> codificador (ffmpeg)
decodificação
e codificação Uma fila é mantida durante o intervalo e o comprimento da fila é definido como 20 (porque a velocidade de decodificação é mais rápida que a velocidade de codificação, os dados são sobrescritos e o quadro é perdido)

4. NVIDIA CUVID, Intel QuickSync e DXVA2, entre os quais DXVA2 é dividido em DXVA2 (copy-back) e DXVA2 (nativo), então qual é a diferença entre esses métodos de decodificação?

NVIDIA CUVID é uma interface de decodificação de hardware dedicada para NVIDIA, que pode permitir o desentrelaçamento de hardware.
Intel QuickSync: interface de decodificação de hardware dedicada para exibição interna da Intel, o uso da CPU é cerca de 5 a 10% maior do que outros modos de decodificação de hardware e o hardware pode ser ativado para processamento de intercalação.
DXVA2 (copy-back): Uma interface de aceleração de hardware desenvolvida para a Microsoft. Placas gráficas AMD, NVIDIA e Intel podem ser usadas. Ela retornará as informações decodificadas para a memória. Devido a múltiplas ações de retorno, o desempenho será menor. é um pouco pior, mas a vantagem é que filtros podem ser adicionados entre o decodificador e o renderizador.
DXVA2 (nativo): Uma interface de aceleração de hardware desenvolvida para a Microsoft. Placas gráficas AMD, NVIDIA e Intel também podem ser usadas. As informações decodificadas não serão transmitidas para a memória e serão renderizadas diretamente, portanto o desempenho é melhor do que copy-back , a desvantagem é que é mais restritivo.
Portanto, o método de decodificação é recomendado: DXVA2 (nativo) > DXVA2 (copy-back) > NVIDIA CUVID ou Intel QuickSync.

5. Solução de codec de hardware NVIDIA

1. Use a interface do codec no SDK

A Nvidia fornece dois SDKs relacionados para o codec de vídeo
NVENC - responsável pela codificação de hardware
NVCUVID - responsável pela decodificação de hardware
NVENC é um SDK separado, integrado no driver da placa gráfica mais recente, você pode encontrar a biblioteca relevante após instalar o documento do driver mais recente. No Ubuntu 14.04, os arquivos de biblioteca relacionados podem ser encontrados no diretório /usr/lib/nvidia-352/.
NVCUVID é um componente CUDA incluído no CUDA Toolkit mais recente. No entanto, o arquivo da biblioteca libnvcuvid.so pode ser encontrado na biblioteca de classes da placa gráfica. Na versão anterior do driver da placa gráfica, também existe um codificador de hardware chamado NVCUVENC correspondente ao NVCUVID, mas este componente foi substituído pelo NVENC.

2. Use o codificador para empacotar OpenCL e SDK

Este método é o mais ideal que eu pessoalmente acho. O FFMPEG atualmente possui um codificador nvenc que é um pacote para o NVENC da Nvidia. Ao usá-lo, ele pode ser perfeitamente integrado ao FFMPEG. Além disso, também contém o pacote para Intel QSV. A interface relacionada da AMD não encontrou informações relevantes até o momento.
Porém, o FFMPEG possui apenas a interface do NVENC e não há encapsulamento do NVCUVID. Se você precisar implementar decodificadores relacionados, talvez seja necessário implementar você mesmo a interface FFMPEG.
libx264 tem um pacote para OpenCL, mas não tive sucesso quando tentei esta função no Windows.
Há também um conversor de formato de código aberto, HandBrake, que inclui wrappers para Intel QuickSync, alongamento de imagem usando OpenCL e wrappers opencl usando x264. A desvantagem deste projeto é que a documentação não é muito rica e é difícil de estudar.

Para usar o codificador nvenc no FFMPEG, você precisa adicionar a opção enable-nvenc às opções de compilação (a versão antiga, a nova versão é detectada automaticamente e a opção de desabilitar-nvenc é exibida).
Esta opção depende do arquivo de cabeçalho nvEncodeAPI.h. Este arquivo de cabeçalho não está incluído no driver privado. Você precisa baixar o SDK do NVIDIA VIDEO CODEC SDK. Após a descompactação, esse arquivo de cabeçalho está em Samples/common/inc diretório, copie-o para um diretório ao qual possa ser vinculado. Depois disso, a compilação pode ocorrer sem problemas e a biblioteca que contém o codificador nvenc pode ser obtida.

6. O ffmpeg decodifica e desenha vídeo, e a CPU ainda ocupa muito.

O alto uso da CPU ocorre principalmente porque av_hwframe_transfer_data(sw_frame, frame, 0) ocupa a CPU. Não use esta função, você deve usar d3d+dxva2 ou cuda+opengl para renderização rígida.
OpenCL é usado principalmente para computação paralela de uso geral, baseado em estruturas e códigos de dados predefinidos, permitindo que a GPU lide com várias tarefas de computação de uso geral, como processamento de vídeo, modelagem financeira, computação científica e processamento de imagem, etc., fazendo pleno uso de GPUs modernas. Escalabilidade paralela. OpenCL pode ser executado em várias plataformas de hardware, incluindo CPU, GPU e FPGA, e não tem nada a ver com OpenGL, Direct3D e outras APIs, portanto pode interagir com diferentes APIs gráficas.
Embora o OpenGL se concentre no processamento e renderização de gráficos de computador, ele fornece um poderoso pipeline de renderização com amplo suporte e uma ampla variedade de usos. Em jogos e aplicativos de realidade virtual, o OpenGL é usado como API padrão para renderização de gráficos em tempo real. No entanto, o OpenGL não pode realizar tarefas de computação de uso geral, o que exige o uso de outras APIs, como OpenCL ou CUDA.
av_hwframe_transfer_data dados de GPU para dados de CPU
dxva2_retrieve_data_call Obtenha dados e renderize ao mesmo tempo

Sete comandos comuns

1. Como usar o comando ffmpeg para listar os decodificadores de hardware suportados:

ffmpeg -hwaccels


2. Comando de solução difícil ffmpeg:

ffmpeg -i d:\input.mp4 -vcodec libx264  d:\output.mp4


O significado do quadro, fps, q, tamanho, taxa de bits e velocidade de saída durante a transcodificação ffmpeg.
quadro indica o quadro atual do vídeo; fps indica quantos quadros de vídeo são codificados em um segundo; q indica a qualidade da codificação; tamanho indica o tamanho dos dados gravados no arquivo; taxa de bits indica a taxa de bits (a unidade é kbits/s 1000 bits /second); time Indica a duração do local do arquivo de processamento atual; speed indica a velocidade de codificação (quantos segundos de quadros de vídeo/quantos segundos de tempo de processamento do ffmpeg).
De acordo com a velocidade, o tempo gasto pelo ffmpeg pode ser calculado. O tempo para concluir o processamento de um arquivo de vídeo pelo ffmpeg é: duração do vídeo segundos/velocidade.

ffmpeg version 4.4-full_build-www.gyan.dev Copyright (c) 2000-2021 the FFmpeg developers
  built with gcc 10.2.0 (Rev6, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libzvbi --enable-librav1e --enable-libsvtav1 --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libglslang --enable-vulkan --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Input #0, mpeg, from 'd:\input.mp4':
  Duration: 03:37:39.62, start: 37915.032111, bitrate: 354 kb/s
  Stream #0:0[0x1e0]: Video: hevc (Main), yuvj420p(pc, bt709), 960x576, 50 fps, 25 tbr, 90k tbn, 50 tbc
  Stream #0:1[0x1c0]: Audio: pcm_mulaw, 8000 Hz, mono, s16, 64 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (hevc (hevc_cuvid) -> h264 (h264_nvenc))
Press [q] to stop, [?] for help
Output #0, mp4, to 'd:\ch01_202203302130002-hw3.mp4':
  Metadata:
    encoder         : Lavf58.76.100
  Stream #0:0: Video: h264 (Main) (avc1 / 0x31637661), nv12(pc, bt709, progressive), 960x576 [SAR 1:1 DAR 5:3], q=2-31, 4000 kb/s, 25 fps, 12800 tbn
    Metadata:
      encoder         : Lavc58.134.100 h264_nvenc
    Side data:
      cpb: bitrate max/min/avg: 0/0/4000000 buffer size: 8000000 vbv_delay: N/A
frame=200781 fps=728 q=9.0 size= 3945472kB time=02:13:51.12 bitrate=4024.5kbits/s dup=0 drop=5 speed=29.1x

3. Exiba o comando nvidia-smi
3.1 da placa gráfica nvidia para exibir o status atual da GPU:

nvidia-smi

Explicação detalhada dos parâmetros:
**GPU: **Número da GPU nesta máquina (quando há várias placas gráficas, o número começa em 0) O número da GPU na imagem é: 0 **
Ventilador: **Velocidade do ventilador (0%- 100% ), N/A significa que não há ventoinha, esta velocidade é a velocidade da ventoinha esperada pelo computador, na realidade, se a ventoinha estiver bloqueada, a velocidade exibida pode não ser alcançada.
**Nome: **Tipo de GPU, o tipo de GPU na imagem é: GeForce MX250/RTX 2080Ti
**Temp: **Temperatura da GPU (a temperatura da GPU é muito alta fará com que a frequência da GPU caia)
**Perf: ** Status de desempenho da GPU, de P0 (desempenho máximo) a P12 (desempenho mínimo), o valor é: P0
**Persistência-M: **O status do modo persistente, embora o modo persistente consuma muita energia, custará muita energia quando um novo aplicativo GPU é iniciado Menos tempo, a figura mostra: desligado
**Pwr: Usager/Cap: **Exibição de consumo de energia, Uso: Quanto é usado, quanto é o limite total
**Bus-Id : **Exibição relacionada ao barramento da GPU, domínio: barramento: device.function
**Disp.A: **Display ativo, indicando se a exibição da GPU foi inicializada
**Uso de memória: **Uso de memória de vídeo
**GPU-Util volátil : **Uso de GPU
**Não corrigido ECC : **Sobre ECC, se deve ativar a tecnologia de verificação e correção de erros, 0/desativado, 1/ativado
**Computação M: **Modo de computação, 0/DEFAULT, 1/EXCLUSIVE_PROCESS, 2/PROIBIDO
**Processos: **Exibe o uso de memória de vídeo, número do processo e GPU ocupada por cada processo
**tipo: **Tipo de processo. C significa processo de computação, G significa processo gráfico e C+G significa ambos.
3.2 Atualize o status da memória a cada poucos segundos:

nvidia-smi -l 秒数

3.3 Grave o resultado do monitoramento no arquivo e especifique o campo de monitoramento para gravar no arquivo:

nvidia-smi -l 1 --format=csv --filename=report.csv --query-gpu=timestamp,name,index,utilization.gpu,memory.total,memory.used,power.draw

Referências:
https://tool.4xseo.com/a/169.html
https://www.cnblogs.com/huty/p/8517141.html
https://blog.csdn.net/qq_40594137/article/details / 124959608
https://deepinout.com/opencl/opencl-tutorials/22_difference_between_opencl_and_opengl.html

Acho que você gosta

Origin blog.csdn.net/byxdaz/article/details/132699279
Recomendado
Clasificación