Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: jarmala - 27.03.23 - klo:18.59
-
Yritän saada Intelin rautakoodekkeja toimimaan ffmpeg:ssä. Ohje neuvoo kloonaamaan tarvittavat softat Githubista ja kääntämään ne. Ongelma on nyt se, että en saa ladatuksi softia, kun en pääse Githubiin, koska siellä ei enää sallita tunnuksella ja salasanalla kirjautumista vaan vaaditaan jotain hiton tokeneita... Luin ohjeet kahteen kertaan, enkä vieläkään ymmärtänyt...
Miksi softien lataaminen on tehty näin vaikeaksi? Olisiko helppiä?
$ cd ~/vaapi
git clone https://github.com/01org/libva
cd libva
./autogen.sh --prefix=/usr --libdir=/usr/lib/x86_64-linux-gnu
time make -j$(nproc) VERBOSE=1
sudo make -j$(nproc) install
sudo ldconfig -vvvv
Cloning into 'libva'...
Username for 'https://github.com': ajarmala
Password for 'https://ajarmala@github.com':
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/01org/libva/'
bash: cd: libva: No such file or directory
bash: ./autogen.sh: No such file or directory
make: *** No targets specified and no makefile found. Stop.
-
Yritän saada Intelin rautakoodekkeja toimimaan ffmpeg:ssä. Ohje neuvoo kloonaamaan tarvittavat softat Githubista ja kääntämään ne. Ongelma on nyt se, että en saa ladatuksi softia, kun en pääse Githubiin, koska siellä ei enää sallita tunnuksella ja salasanalla kirjautumista vaan vaaditaan jotain hiton tokeneita... Luin ohjeet kahteen kertaan, enkä vieläkään ymmärtänyt...
Miksi softien lataaminen on tehty näin vaikeaksi? Olisiko helppiä?
$ cd ~/vaapi
git clone https://github.com/01org/libva
Nykyinen repositorio on https://github.com/intel/libva (https://github.com/intel/libva)
git clone https://github.com/intel/libva
GitHub ei vaadi kirjautumista avoimen lähdekoodin projektien lataamiseen.
Toisaalta et myöskään tarvitse lähdekoodista käännettyä libva-ajuria. Kaikki palikat saa valmiina binääreinä Ubuntun lähteistä. Jos haluat viimeisimmän FFmpeg 6.x-version, voit kääntää sen itse tai ottaa käyttöön sopivan PPA:n (https://launchpad.net/~savoury1/+archive/ubuntu/ffmpeg6).
Uusimmilla Intelin 12. sukupolven integroiduilla näytönohjaimilla paras ajuri videoenkoodaukseen on oneVPL. Sinulla taisi kuitenkin olla vanhempi 10. sukupolven näytönohjain, jolloin oneVPL:n sijaan on käytettävä edellistä iHD + MediaSDK-ajuria eli libmfx:ää.
Katso libmfx:n asennusohje:
https://github.com/Intel-Media-SDK/MediaSDK/wiki/Intel-media-stack-on-Ubuntu
FFmpegin ohje:
https://trac.ffmpeg.org/wiki/Hardware/QuickSync
-
Katso libmfx:n asennusohje:
https://github.com/Intel-Media-SDK/MediaSDK/wiki/Intel-media-stack-on-Ubuntu
FFmpegin ohje:
https://trac.ffmpeg.org/wiki/Hardware/QuickSync
Tein libmfx:n ohjeen mukaan, mutta edes esimerkkikomento ei toimi:
$ /usr/share/mfx/samples/sample_encode h264 -w 176 -h 144 -f 30 -b 3000 -i mot.mkv -o encoded_AUD_MW_E.264
libva info: VA-API version 1.14.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_14
libva info: va_openDriver() returns 0
[ERROR], sts=MFX_ERR_UNSUPPORTED(-3), AllocFrames, Query (for encoder) failed at ./samples/sample_encode/src/pipeline_encode.cpp:966
[ERROR], sts=MFX_ERR_UNSUPPORTED(-3), ResetMFXComponents, AllocFrames failed at ./samples/sample_encode/src/pipeline_encode.cpp:2076
[ERROR], sts=MFX_ERR_UNSUPPORTED(-3), Init, ResetMFXComponents failed at ./samples/sample_encode/src/pipeline_encode.cpp:1857
[ERROR], sts=MFX_ERR_UNSUPPORTED(-3), main, pPipeline->Init failed at ./samples/sample_encode/src/sample_encode.cpp:1787
Frame number: 0
Encoding fps: -0
Ja ffmpeg väittää osaavansa qsv:n, mutta ei siltikään suostu toimimaan ohjeessa annetulla esimerkkikomennolla:
$ ffmpeg -hide_banner -encoders | grep -E "h264|hevc"
V..... libx264 libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (codec h264)
V..... libx264rgb libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 RGB (codec h264)
V....D h264_nvenc NVIDIA NVENC H.264 encoder (codec h264)
V..... h264_omx OpenMAX IL H.264 video encoder (codec h264)
V..... h264_qsv H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (Intel Quick Sync Video acceleration) (codec h264)
V..... h264_v4l2m2m V4L2 mem2mem H.264 encoder wrapper (codec h264)
V....D h264_vaapi H.264/AVC (VAAPI) (codec h264)
V..... nvenc NVIDIA NVENC H.264 encoder (codec h264)
V..... nvenc_h264 NVIDIA NVENC H.264 encoder (codec h264)
V..... libx265 libx265 H.265 / HEVC (codec hevc)
V..... nvenc_hevc NVIDIA NVENC hevc encoder (codec hevc)
V....D hevc_nvenc NVIDIA NVENC hevc encoder (codec hevc)
V..... hevc_qsv HEVC (Intel Quick Sync Video acceleration) (codec hevc)
V..... hevc_v4l2m2m V4L2 mem2mem HEVC encoder wrapper (codec hevc)
V....D hevc_vaapi H.265/HEVC (VAAPI) (codec hevc)
$ ffmpeg -init_hw_device qsv=hw -filter_hw_device hw -i mot.mkv -vf hwupload=extra_hw_frames=64,format=qsv -c:v h264_qsv -b:v 5M -maxrate 5M output.mp4
Input #0, matroska,webm, from 'mot.mkv':
Metadata:
ENCODER : Lavf58.76.100
Duration: 00:00:23.94, start: 0.000000, bitrate: 2612 kb/s
Stream #0:0: Video: h264 (High), yuv420p(tv, bt709, top coded first (swapped)), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 1k tbn, 50 tbc (default)
Metadata:
ENCODER : Lavc58.134.100 libx264
DURATION : 00:00:23.941000000
Stream #0:1(fin): Audio: aac (LC), 48000 Hz, stereo, fltp (default)
Metadata:
ENCODER : Lavc58.134.100 aac
DURATION : 00:00:23.029000000
File 'output.mp4' already exists. Overwrite? [y/N] y
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> h264 (h264_qsv))
Stream #0:1 -> #0:1 (aac (native) -> aac (native))
Press [q] to stop, [?] for help
[h264_qsv @ 0x55736f32cf40] Selected ratecontrol mode is unsupported
[h264_qsv @ 0x55736f32cf40] Low power mode is unsupported
[h264_qsv @ 0x55736f32cf40] some encoding parameters are not supported by the QSV runtime. Please double check the input parameters.
Error initializing output stream 0:0 -- Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height
[aac @ 0x55736f36dbc0] Qavg: 7619.162
[aac @ 0x55736f36dbc0] 2 frames left in the queue on closing
Conversion failed!
Enpä vaan taida osata tätä rautakoodausta...
-
Tein libmfx:n ohjeen mukaan, mutta edes esimerkkikomento ei toimi:
$ /usr/share/mfx/samples/sample_encode h264 -w 176 -h 144 -f 30 -b 3000 -i mot.mkv -o encoded_AUD_MW_E.264
sample_encode ei osaa purkaa MKV-tiedostoja, vaan hyväksyy vain raakamuotoista videota, oletuksena YUV420-väriavaruudessa. Muitakin väriavaruuksia on mahdollista käyttää, mutta olennaista on, että mikään monimutkaisempi säiliömuoto ei käy, vaan tiedoston täytyy olla raakavideota. Kokeile ohjeen ensimmäisen esimerkin mukaisesti:
export LIBVA_DRIVER_NAME=iHD
wget https://github.com/lu-zero/fate-samples/raw/master/h264-conformance/AUD_MW_E.264
/usr/share/mfx/samples/sample_decode h264 -i AUD_MW_E.264 -o AUD_MW_E.yuv -i420
/usr/share/mfx/samples/sample_encode h264 -w 176 -h 144 -f 30 -cqp -qpi 30 -qpp 30 -qpb 30 -qsv-ff -i AUD_MW_E.yuv -o encoded_AUD_MW_E.264
Voisit myös näyttää vainfon listauksen, niin katsotaan, että ajuri on kunnossa.
vainfo
Tarkka dokumentaatio Media SDK:n sample_encodesta on tässä dokumentissa: https://github.com/Intel-Media-SDK/MediaSDK/blob/master/doc/samples/readme-encode_linux.md
Ja ffmpeg väittää osaavansa qsv:n, mutta ei siltikään suostu toimimaan ohjeessa annetulla esimerkkikomennolla:
$ ffmpeg -init_hw_device qsv=hw -filter_hw_device hw -i mot.mkv -vf hwupload=extra_hw_frames=64,format=qsv -c:v h264_qsv -b:v 5M -maxrate 5M output.mp4
Olennaiset virheet:
[h264_qsv @ 0x55736f32cf40] Selected ratecontrol mode is unsupported
[h264_qsv @ 0x55736f32cf40] Low power mode is unsupported
Ilmeisesti low power mode ei nyt ole käytettävissä. Johtuu mahdollisesti siitä, ettei kernelin ajuri lataa oletuksena tarvittavaa HUC-firmwarea: https://github.com/Intel-Media-SDK/MediaSDK/issues/2970#issuecomment-1205561199
Tuolla suositellaan kytkemään low power mode pois käytöstä, mutta on myös mahdollista pakottaa kernelin ajuri lataamaan HUC-firmware.
Ratecontrol mode is unsupported -virhe saattaa johtua low power mode -virheestä tai päin vastoin. Kokeile seuraavaksi vivulla -low_power 0:
ffmpeg -init_hw_device qsv=hw -filter_hw_device hw -i mot.mkv -vf hwupload=extra_hw_frames=64,format=qsv -low_power 0 -c:v h264_qsv -b:v 5M -maxrate 5M output.mp4
Tässä pyydetään ffmpegiä käyttämään CBR-enkoodausta (vakiobitratea), koska maksimiksi oli asetettu sama 5M kuin keskimääräiseksi bitrateksi (-b:v 5M -maxrate 5M). Se voi myös aiheuttaa osaltaan ongelmia, joten CBR:n sijaan kannattaa kokeilla myös CQP-tilaa (-qscale:v 25):
ffmpeg -init_hw_device qsv=hw -filter_hw_device hw -i mot.mkv -vf hwupload=extra_hw_frames=64,format=qsv -low_power 0 -c:v h264_qsv -qscale:v 25 output.mp4
Jos herjaa taas low power modesta, lisää valitsin -low_power 0
Edit: Myös Ubuntu 22.04:n alkuperäisessä 5.15-sarjan kernelissä taitaa olla bugeja, jotka estävät QSV:n toiminnan osittain tai kokonaan. Varmista, että käytössä on vähintään kernelin versio 5.19 (joka on ollut saatavilla hwe-päivityksenä Ubuntu 22.04.2:n julkaisusta lähtien).
Katso: https://www.reddit.com/r/jellyfin/comments/usiur9/ubuntu_2204_qsv_setup/
Käytössä olevan kernelin version voi tarkistaa komennolla:
uname -r
-
Voisit myös näyttää vainfon listauksen, niin katsotaan, että ajuri on kunnossa.
Ratecontrol mode is unsupported -virhe saattaa johtua low power mode -virheestä tai päin vastoin. Kokeile seuraavaksi vivulla -low_power 0:
ffmpeg -init_hw_device qsv=hw -filter_hw_device hw -i mot.mkv -vf hwupload=extra_hw_frames=64,format=qsv -low_power 0 -c:v h264_qsv -b:v 5M -maxrate 5M output.mp4
Käytössä olevan kernelin version voi tarkistaa komennolla:
Kiitoksia ohjeesta. Nyt toimii h264_qsv. MUtta enpä oikein osaa sanoa, onko se yhtään nopeampi kuin softakoodaus presetillä ultrafast... Voi se olla hieman laadukkaampi kuin tuo ultrafast.
Vielä jos olisi saatavissa hinttiä, miten rautakoodauksen saisi toimimaan myös hevc:illä... Suoraan korvaamalla h264 hevc:llä ei näytä toimivan. Mistä saisi tietää sen kanssa toimivat parametrit? Kun kuitenkin tarkoitukseni on koodata videot hevc:llä, koska sitä on tullut jo käytettyä vuosikausia - tosin softaversiona.
Ja vielä pyydetyt vainfo ja uname -r:
$ vainfo
libva info: VA-API version 1.14.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_14
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.14 (libva 2.12.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 22.3.1 ()
vainfo: Supported profile and entrypoints
VAProfileNone : VAEntrypointVideoProc
VAProfileNone : VAEntrypointStats
VAProfileMPEG2Simple : VAEntrypointVLD
VAProfileMPEG2Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointEncSliceLP
VAProfileH264High : VAEntrypointVLD
VAProfileH264High : VAEntrypointEncSliceLP
VAProfileVC1Simple : VAEntrypointVLD
VAProfileVC1Main : VAEntrypointVLD
VAProfileVC1Advanced : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointEncPicture
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
VAProfileVP8Version0_3 : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointEncSliceLP
VAProfileHEVCMain10 : VAEntrypointVLD
VAProfileHEVCMain10 : VAEntrypointEncSliceLP
VAProfileVP9Profile0 : VAEntrypointVLD
VAProfileVP9Profile1 : VAEntrypointVLD
VAProfileVP9Profile2 : VAEntrypointVLD
VAProfileVP9Profile3 : VAEntrypointVLD
VAProfileHEVCMain422_10 : VAEntrypointVLD
VAProfileHEVCMain444 : VAEntrypointVLD
VAProfileHEVCMain444 : VAEntrypointEncSliceLP
VAProfileHEVCMain444_10 : VAEntrypointVLD
VAProfileHEVCMain444_10 : VAEntrypointEncSliceLP
ari@ari-JL:~/avi$ uname -r
5.19.0-38-generic