Estou executando este comando:
ffmpeg -init_hw_device qsv=hw -filter_hw_device -f rawvideo -pix_fmt yuv420p -s:v 2560x1440 -i normal-desktop-use-1440p.mkv -c:v h264_qsv -
b:v 5M output.mp4
Estou tendo o erro a seguir:
Splitting the commandline.
Reading option '-loglevel' ... matched as option 'loglevel' (set logging level) with argument 'debug'.
Reading option '-init_hw_device' ... matched as option 'init_hw_device' (initialise hardware device) with argument 'qsv=hw'.
Reading option '-filter_hw_device' ... matched as option 'filter_hw_device' (set hardware device used when filtering) with argument 'hw'.
Reading option '-f' ... matched as option 'f' (force format) with argument 'rawvideo'.
Reading option '-pix_fmt' ... matched as option 'pix_fmt' (set pixel format) with argument 'yuv420p'.
Reading option '-s:v' ... matched as option 's' (set frame size (WxH or abbreviation)) with argument '2560x1440'.
Reading option '-i' ... matched as input url with argument 'normal-desktop-use-1440p.mkv'.
Reading option '-vf' ... matched as option 'vf' (set video filters) with argument '-c:v'.
Reading option 'h264_qsv' ... matched as output url.
Reading option '-b:v' ... matched as option 'b' (video bitrate (please use -b:v)) with argument '15M'.
Reading option '-framerate' ... matched as AVOption 'framerate' with argument '30'.
Reading option 'output.mp4' ... matched as output url.
Finished splitting the commandline.
Parsing a group of options: global .
Applying option loglevel (set logging level) with argument debug.
Applying option init_hw_device (initialise hardware device) with argument qsv=hw.
[AVHWDeviceContext @ 0x556f744cf5c0] Cannot open X11 display .
[AVHWDeviceContext @ 0x556f744cf5c0] Opened VA display via DRM device /dev/dri/renderD128.
[AVHWDeviceContext @ 0x556f744cf5c0] libva: VA-API version 1.1.0
[AVHWDeviceContext @ 0x556f744cf5c0] libva: va_getDriverName() returns 0
[AVHWDeviceContext @ 0x556f744cf5c0] libva: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so
[AVHWDeviceContext @ 0x556f744cf5c0] libva: Found init function __vaDriverInit_1_1
[AVHWDeviceContext @ 0x556f744cf5c0] libva: va_openDriver() returns 0
[AVHWDeviceContext @ 0x556f744cf5c0] Initialised VAAPI connection: version 1.1
[AVHWDeviceContext @ 0x556f744cf5c0] Format 0x32315659 -> yuv420p.
[AVHWDeviceContext @ 0x556f744cf5c0] Format 0x30323449 -> yuv420p.
[AVHWDeviceContext @ 0x556f744cf5c0] Format 0x3231564e -> nv12.
[AVHWDeviceContext @ 0x556f744cf5c0] Format 0x32595559 -> yuyv422.
[AVHWDeviceContext @ 0x556f744cf5c0] Format 0x59565955 -> uyvy422.
[AVHWDeviceContext @ 0x556f744cf5c0] Format 0x48323234 -> yuv422p.
[AVHWDeviceContext @ 0x556f744cf5c0] Format 0x58424752 -> rgb0.
[AVHWDeviceContext @ 0x556f744cf5c0] Format 0x58524742 -> bgr0.
[AVHWDeviceContext @ 0x556f744cf5c0] Format 0x30313050 -> p010le.
[AVHWDeviceContext @ 0x556f744cf5c0] VAAPI driver: Intel i965 driver for Intel(R) Skylake - 2.1.0.
[AVHWDeviceContext @ 0x556f744cf5c0] Driver not found in known nonstandard list, using standard behaviour.
[AVHWDeviceContext @ 0x556f744cf140] Error initializing an MFX session: -3.
Device creation failed: -1313558101.
Failed to set value 'qsv=hw' for option 'init_hw_device': Unknown error occurred
Error parsing global options: Unknown error occurred
Eu esperava que o ffmpeg codificasse meu vídeo usando um codificador h264 acelerado por hw via Intel QuickSync.
Informações úteis sobre minha compilação ffmpeg:
ffmpeg version N-93636-g6829c3c Copyright (c) 2000-2019 the FFmpeg developers
built with gcc 7 (Ubuntu 7.3.0-27ubuntu1~18.04)
configuration: --prefix=/root/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/root/ffmpeg_build/include --extra-ldflags=-L/root/ffmpeg_build/lib --extra-libs='-lpthread -lm' --bindir=/root/bin --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libmfx --enable-nonfree
--enable-libmfx
habilitei .
Usando este processador:model name : Intel(R) Xeon(R) CPU E3-1578L v5 @ 2.00GHz
Se eu fizer ffmpeg -encoders | grep qsv
isso, recebo o seguinte:
V..... h264_qsv H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (Intel Quick Sync Video acceleration) (codec h264)
V..... hevc_qsv HEVC (Intel Quick Sync Video acceleration) (codec hevc)
V..... mjpeg_qsv MJPEG (Intel Quick Sync Video acceleration) (codec mjpeg)
V..... mpeg2_qsv MPEG-2 video (Intel Quick Sync Video acceleration) (codec mpeg2video)
Preste atenção na saída do console:
Isso ocorre porque você está usando o driver VAAPI errado para QuickSync. O driver correto deve ser definido como o driver de mídia intel
iHD
, pois você está usando o SDK de mídia para QuickSync e não os codificadores baseados em VAAPI.Vou documentar as etapas necessárias para derivar uma compilação FFmpeg com os recursos necessários (QuickSync) com suporte para codecs extras conforme necessário, com notas extras sobre o uso do driver correto abaixo:
Verifique se a plataforma está atualizada:
Percebi que você está no Ubuntu 18.04 LTS, então estas instruções servirão:
sudo apt update && sudo apt -y upgrade && sudo apt -y dist-upgrade
Instale as dependências da linha de base primeiro:
sudo apt-get -y install autoconf automake build-essential libass-dev libtool pkg-config texinfo zlib1g-dev libva-dev cmake mercurial libdrm-dev libvorbis-dev libogg-dev git libx11-dev libperl-dev libpciaccess-dev libpciaccess0 xorg-dev intel-gpu-tools libwayland-dev xutils-dev libssl-dev
Em seguida, adicione o Oibaf PPA, necessário para instalar os cabeçalhos de desenvolvimento mais recentes para libva:
Para resolver problemas de linker na linha com o Ubuntu 18.04LTS:
Atualização: isso não é mais necessário, mas permanece para referência futura.
Referindo-se a isso: https://forum.openframeworks.cc/t/ubuntu-unable-to-compile-missing-glx-mesa/29367/2
Crie o seguinte link simbólico como mostrado:
Crie a libva mais recente e todos os drivers da fonte:
Ambiente de compilação de configuração:
Inicialização do espaço de trabalho:
Comece com libva:
1. Libva:
Libva é uma implementação para VA-API (API de aceleração de vídeo)
VA-API é uma biblioteca de código aberto e especificação de API, que fornece acesso a recursos de aceleração de hardware gráfico para processamento de vídeo. Ele consiste em uma biblioteca principal e back-ends de aceleração específicos do driver para cada fornecedor de hardware suportado. É um pré-requisito para construir os componentes do driver VAAPI abaixo.
2. Gmmlib:
A biblioteca de gerenciamento de memória gráfica Intel(R) fornece gerenciamento específico de dispositivo e buffer para o Intel(R) Graphics Compute Runtime para OpenCL(TM) e o driver de mídia Intel(R) para VAAPI.
O componente é um pré-requisito para a etapa de compilação do driver Intel Media abaixo.
Para compilar isso, crie um diretório de espaço de trabalho dentro do subdiretório vaapi e execute a compilação:
Em seguida, instale o pacote:
E prossiga.
3. Driver de mídia Intel:
O driver de mídia Intel(R) para VAAPI é um novo driver de modo de usuário VA-API (API de aceleração de vídeo) compatível com decodificação acelerada por hardware, codificação e pós-processamento de vídeo para hardware gráfico baseado em GEN, lançado sob a licença MIT.
Configure o projeto com cmake:
Em seguida, crie o driver de mídia:
Em seguida, instale o projeto:
Adicione-se ao grupo de vídeos:
Observação: o FFmpeg agora pode selecionar o driver QSV correto na inicialização, normalmente
iHD
se estiver instalado e presente nasldconfig
entradas. Você não precisa mais definir o driver correto em todo o sistema/etc/environment
ou por sessão de inicialização no FFmpeg.4. libva-utils:
Este pacote fornece uma coleção de testes para VA-API, como
vainfo
, necessários para validar os recursos com suporte de uma plataforma (codificar, decodificar e atributos pós-procedimento por codec por informações de pontos de entrada VAAPI).Neste ponto, emita uma reinicialização:
Isso é necessário para refletir as alterações feitas acima, como adicionar seu usuário ao grupo de vídeos.
Em seguida, ao retomar, prossiga com as etapas abaixo.
Crie o MSDK da Intel :
Este pacote fornece uma API para acessar a decodificação, codificação e filtragem de vídeo acelerada por hardware em plataformas Intel® com gráficos integrados. Ele é suportado em plataformas para as quais o driver de mídia intel é direcionado.
Para recursos suportados por geração, consulte isto .
Etapas de construção:
(uma). Busque as fontes no diretório de trabalho
~/vaapi
:(b). Configurar a compilação:
O CMake detectará automaticamente a plataforma em que você está e ativará os ganchos específicos da plataforma necessários para uma compilação funcional.
Crie um arquivo de configuração de biblioteca para o iMSDK:
Contente:
Então corra:
Para prosseguir.
Crie um binário FFmpeg utilizável com o iMSDK:
Inclua componentes extras conforme necessário:
(uma). Construir e implantar nasm: Nasm é um montador para otimizações x86 usado por x264 e FFmpeg. Altamente recomendado ou sua compilação resultante pode ser muito lenta.
Observe que agora mudamos de Yasm para nasm, pois este é o montador atual que x265, x264, entre outros, está adotando.
(b). Crie e implemente libx264 estaticamente: esta biblioteca fornece um codificador de vídeo H.264. Consulte o Guia de Codificação H.264 para obter mais informações e exemplos de uso. Isso requer que o ffmpeg seja configurado com
--enable-gpl --enable-libx264
.(c). Construir e configurar libx265: Esta biblioteca fornece um codificador de vídeo H.265/HEVC. Consulte o Guia de Codificação H.265 para obter mais informações e exemplos de uso.
(d). Crie e implemente a biblioteca libfdk-aac: fornece um codificador de áudio AAC. Consulte o Guia de codificação de áudio AAC para obter mais informações e exemplos de uso. Isso requer que o ffmpeg seja configurado com
--enable-libfdk-aac
(e--enable-nonfree
se você também incluiu--enable-gpl
).(e). Crie e configure libvpx:
(f). Construir LibVorbis:
(g). Construir FFmpeg:
Build an FFmpeg binary with the required options:
Now you can launch your FFmpeg binary from
~/bin/ffmpeg
, with the required features.Notes on encoding with the QSV encoders:
Typically, you will need to initialize a hardware device that will be used by both the encoder(s) in use and filtering, as shown in the example below:
See how the hardware device for use with MFX sessions has been initialized (
-init_hw_device qsv=hw
) and mapped as available to filters such ashwupload
(-filter_hw_device hw
). Recommended for further reading: The Advanced Video Options section on FFmpeg wiki.The example above demonstrates the use of the
hevc_qsv
encoders with some private options passed to it, for reference.Another example, showing the use of the
h264_qsv
encoder:Take note that both examples above will use the constant bitrate control (CBR) method in MFX, as shown in the console log:
Rate control, similar to how the VAAPI implementation governs it, is driven by the parameters
-b:v
(target video bitrate) and the-maxrate:v
(maximum video bitrate) passed to the encoder. If they are equal, CBR (constant bitrate control) is used. If maxrate is greater than target bitrate, then VBR, and in effect, look-ahead based control (if so desired) are enabled.Observe how we call up the
hwupload
filter, chained with theformat=qsv
filter to ensure that the MFX runtime receives a supported pixel format. Failure to pass this video filter chain will result in initialization failure, with output similar to this:The error message may seem ambiguous at first, but it stems primarily from mapping invalid options to the underlying MFX library, such as an unsupported pixel format.
The extra argument
extra_hw_frames=64
passed tohwupload
has to do with the MFX runtime requiring a fixed frame pool size to be per-allocated. Use a number suitable to your requirements. Generally, you'll need a larger number (64, or thereabouts) if using features such as look-ahead (LA-ICQ).