diff --git a/README.md b/README.md index f3a1eb6..08e6012 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -Rockchip MPP + FFmpeg su Orange Pi 5 Plus +# Rockchip MPP + FFmpeg su Orange Pi 5 Plus -Guida alla configurazione di Rockchip MPP e FFmpeg-Rockchip su Orange Pi 5 Plus / RK3588, con test di: +### Guida alla configurazione di Rockchip MPP e FFmpeg-Rockchip su Orange Pi 5 Plus / RK3588, con test di: - decoding hardware HEVC con "hevc_rkmpp" - encoding hardware H.264 con "h264_rkmpp" @@ -11,7 +11,7 @@ Guida alla configurazione di Rockchip MPP e FFmpeg-Rockchip su Orange Pi 5 Plus - video verticale con rotazione presente nei metadata MP4 - verifica finale con "ffprobe" -La configurazione riportata è quella verificata durante i test su Orange Pi 5 Plus. +#### La configurazione riportata è quella verificata durante i test su Orange Pi 5 Plus. --- @@ -39,20 +39,21 @@ Repository: Controllare l'architettura: +``` uname -m - +``` Atteso: - +``` aarch64 - +``` Controllare il kernel: - +``` uname -a - +``` Controllare la distribuzione: - +``` cat /etc/os-release - +``` --- 3. Controllo dei device Rockchip @@ -60,14 +61,14 @@ cat /etc/os-release Il supporto FFmpeg-Rockchip richiede che l'utente possa accedere ai device hardware Rockchip. Il progetto indica, tra gli altri: - +``` /dev/dri /dev/dma_heap /dev/rga /dev/mpp_service - +``` e, su alcune configurazioni/kernel: - +``` /dev/iep /dev/mpp-service /dev/vpu_service @@ -76,35 +77,35 @@ e, su alcune configurazioni/kernel: /dev/hevc-service /dev/rkvdec /dev/rkvenc - +``` Controllare: - +``` ls -l /dev/mpp_service - +``` e: - +``` ls -l /dev | grep -Ei 'mpp|rga|rkv|vpu|iep' - +``` Controllare anche: - +``` ls -l /dev/dri - +``` e: - +``` ls -l /dev/dma_heap - +``` --- 4. Permessi utente Aggiungere l'utente ai gruppi normalmente utilizzati per l'accesso ai device video: - +``` sudo usermod -aG video "$USER" - +``` Se sulla distribuzione sono presenti anche gruppi "render": - +``` sudo usermod -aG render "$USER" - +``` Controllare: groups @@ -116,12 +117,12 @@ Dopo la modifica è consigliato effettuare logout/login. 5. Pacchetti necessari Aggiornare il sistema: - +``` sudo apt update sudo apt upgrade -y - +``` Installare gli strumenti di compilazione: - +``` sudo apt install -y \ git \ build-essential \ @@ -134,7 +135,7 @@ sudo apt install -y \ libnuma-dev \ libssl-dev \ zlib1g-dev - +``` Per una build FFmpeg più completa possono essere necessari altri pacchetti a seconda dei codec/librerie che si desidera abilitare. --- @@ -144,36 +145,36 @@ Per una build FFmpeg più completa possono essere necessari altri pacchetti a se 6.1 Directory sorgenti Creare: - +``` sudo mkdir -p /usr/local/src sudo chown "$USER":"$USER" /usr/local/src - +``` Entrare: - +``` cd /usr/local/src - +``` --- 6.2 Clonare MPP Repository ufficiale: - +``` https://github.com/rockchip-linux/mpp - +``` Clonare: - +``` cd /usr/local/src git clone https://github.com/rockchip-linux/mpp.git rockchip-mpp - +``` Entrare nella directory: - +``` cd /usr/local/src/rockchip-mpp - +``` Controllare il commit: - +``` git rev-parse HEAD - +``` È consigliato salvare il commit utilizzato, così una futura reinstallazione può essere riprodotta. MPP utilizza CMake e il progetto raccomanda una build out-of-source. @@ -183,61 +184,61 @@ MPP utilizza CMake e il progetto raccomanda una build out-of-source. 7. Compilazione MPP Creare la directory di build: - +``` cd /usr/local/src/rockchip-mpp mkdir -p build cd build - +``` Configurare: - +``` cmake \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_SHARED_LIBS=ON \ -DBUILD_TEST=OFF \ -DCMAKE_INSTALL_PREFIX=/usr/local \ .. - +``` Compilare: - +``` make -j"$(nproc)" - +``` Installare: - +``` sudo make install - +``` --- 8. Aggiornare il linker Aggiungere "/usr/local/lib" alla configurazione del linker: - +``` echo '/usr/local/lib' | sudo tee /etc/ld.so.conf.d/local.conf - +``` Aggiornare: - +``` sudo ldconfig - +``` Controllare: - +``` ldconfig -p | grep -i mpp - +``` Cercare anche direttamente: - +``` find /usr/local -name 'librockchip_mpp.so*' -print - +``` --- 9. Test della libreria MPP Controllare il device: - +``` ls -l /dev/mpp_service - +``` Controllare la libreria: - +``` ldconfig -p | grep -i rockchip - +``` Se la build di MPP ha installato gli strumenti di test, possono essere disponibili utility come: mpp_info_test @@ -249,9 +250,9 @@ mpp_platform_test La documentazione ufficiale MPP descrive questi strumenti per verificare libreria e ambiente hardware. Cercarli: - +``` find /usr/local -type f -name 'mpp_*_test' -print - +``` --- 10. Installazione FFmpeg-Rockchip @@ -261,53 +262,53 @@ Per la configurazione utilizzata nei test viene utilizzato: ffmpeg-rockchip Repository: - +``` https://github.com/nyanmisaka/ffmpeg-rockchip - +``` Il progetto fornisce supporto hardware MPP/RGA direttamente nella CLI FFmpeg. Entrare nella directory sorgenti: - +``` cd /usr/local/src - +``` Clonare: - +``` git clone https://github.com/nyanmisaka/ffmpeg-rockchip.git - +``` Entrare: - +``` cd /usr/local/src/ffmpeg-rockchip - +``` Controllare il commit: - +``` git rev-parse HEAD - +``` --- 11. Configurazione FFmpeg Prima di compilare verificare che MPP sia visibile a "pkg-config". - +``` pkg-config --modversion rockchip_mpp - +``` Se non viene trovato, cercare il file: - +``` find /usr/local -name 'rockchip_mpp.pc' -print - +``` Impostare eventualmente: - +``` export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/local/share/pkgconfig:$PKG_CONFIG_PATH - +``` Riprovare: - +``` pkg-config --modversion rockchip_mpp - +``` --- 11.1 Configure Configurazione utilizzata: - +``` ./configure \ --prefix=/usr/local \ --enable-gpl \ @@ -319,7 +320,7 @@ Configurazione utilizzata: --disable-static \ --extra-cflags="-I/usr/local/include" \ --extra-ldflags="-L/usr/local/lib" - +``` "ffmpeg-rockchip" include il supporto MPP e RGA e documenta le pipeline hardware per decoder, encoder e filtri. --- @@ -327,47 +328,47 @@ Configurazione utilizzata: 12. Compilazione FFmpeg Compilare: - +``` make -j"$(nproc)" - +``` Installare: - +``` sudo make install - +``` Aggiornare il linker: - +``` sudo ldconfig - +``` --- 13. Verificare il binario FFmpeg Controllare: - +``` which ffmpeg - +``` Il binario che abbiamo utilizzato nei test è: - +``` /usr/local/bin/ffmpeg - +``` Controllare: - +``` /usr/local/bin/ffmpeg -hide_banner -version - +``` Controllare la configurazione: - +``` /usr/local/bin/ffmpeg -hide_banner -buildconf - +``` --- 14. Verificare i decoder RKMPP Eseguire: - +``` /usr/local/bin/ffmpeg \ -hide_banner \ -decoders | grep -i rkmpp - +``` Tra quelli importanti per il nostro test deve esserci: hevc_rkmpp @@ -375,27 +376,27 @@ hevc_rkmpp Il progetto FFmpeg-Rockchip documenta esplicitamente "hevc_rkmpp" come decoder HEVC Rockchip MPP. Controllo diretto: - +``` /usr/local/bin/ffmpeg \ -hide_banner \ -decoders | grep hevc_rkmpp - +``` --- 15. Verificare gli encoder RKMPP Eseguire: - +``` /usr/local/bin/ffmpeg \ -hide_banner \ -encoders | grep -i rkmpp - +``` Controllare direttamente H.264: - +``` /usr/local/bin/ffmpeg \ -hide_banner \ -encoders | grep h264_rkmpp - +``` Deve essere disponibile: h264_rkmpp @@ -405,11 +406,11 @@ h264_rkmpp 16. Verificare i filtri RGA Se RGA è stato compilato: - +``` /usr/local/bin/ffmpeg \ -hide_banner \ -filters | grep rkrga - +``` Possibili filtri: scale_rkrga @@ -425,14 +426,14 @@ Il progetto documenta "scale_rkrga" per scaling/conversione formato e "vpp_rkrga Prima di fare HLS conviene verificare il decoder. Esempio: - +``` /usr/local/bin/ffmpeg \ -hide_banner \ -loglevel verbose \ -c:v hevc_rkmpp \ -i input.mp4 \ -f null - - +``` Nel log deve comparire una sequenza simile: Created a RKMPP hardware device @@ -447,6 +448,7 @@ hevc_rkmpp Testare contemporaneamente decoder e encoder hardware: +``` /usr/local/bin/ffmpeg \ -hide_banner \ -loglevel verbose \ @@ -463,13 +465,14 @@ Testare contemporaneamente decoder e encoder hardware: -g 90 \ -keyint_min 90 \ output.mp4 +``` Controllare: - +``` /usr/local/bin/ffprobe \ -hide_banner \ output.mp4 - +``` --- 19. Test con il video Xiaomi 13T Pro @@ -479,9 +482,9 @@ Il file utilizzato nei test: VID_20260221_095917.mp4 Directory: - +``` cd /home/nvme/dockerdata/prove/s120js - +``` Il file presenta: Video: HEVC @@ -496,23 +499,23 @@ Audio: AAC stereo Controllare il video: - +``` /usr/local/bin/ffprobe \ -hide_banner \ -select_streams v:0 \ -show_entries stream=codec_name,width,height,r_frame_rate,pix_fmt \ -of default=noprint_wrappers=1 \ VID_20260221_095917.mp4 - +``` Controllare l'audio: - +``` /usr/local/bin/ffprobe \ -hide_banner \ -select_streams a:0 \ -show_entries stream=codec_name,sample_rate,channels \ -of default=noprint_wrappers=1 \ VID_20260221_095917.mp4 - +``` --- 20. Rotazione del video Xiaomi @@ -538,7 +541,7 @@ Non è stato necessario aggiungere manualmente: Questo è importante. Per il file Xiaomi testato la pipeline ha quindi fatto: - +``` Input: 1920x1080 HEVC rotation -90° @@ -562,7 +565,7 @@ h264_rkmpp ↓ HLS MPEG-TS - +``` --- 21. Pipeline HLS funzionante @@ -570,12 +573,12 @@ HLS MPEG-TS Questa è la pipeline che abbiamo verificato con successo. Creare la directory: - +``` rm -rf /tmp/hls_xiaomi mkdir -p /tmp/hls_xiaomi - +``` Eseguire: - +``` /usr/local/bin/ffmpeg \ -hide_banner \ -loglevel verbose \ @@ -605,37 +608,37 @@ Eseguire: -hls_segment_type mpegts \ -hls_segment_filename '/tmp/hls_xiaomi/segment_%05d.ts' \ /tmp/hls_xiaomi/master.m3u8 - +``` --- 22. Struttura corretta dell'output Dopo l'esecuzione: - +``` ls -lh /tmp/hls_xiaomi - +``` Atteso: - +``` master.m3u8 segment_00000.ts segment_00001.ts - +``` Nel test reale abbiamo ottenuto circa: - +``` master.m3u8 183 bytes segment_00000.ts ~1.9 MB segment_00001.ts ~1.5 MB - +``` --- 23. Playlist risultante Controllare: - +``` cat /tmp/hls_xiaomi/master.m3u8 - +``` Nel test è risultata: - +``` #EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:3 @@ -646,7 +649,7 @@ segment_00000.ts #EXTINF:2.466667, segment_00001.ts #EXT-X-ENDLIST - +``` La durata totale è circa: 5.47 secondi @@ -656,13 +659,13 @@ La durata totale è circa: 24. Verifica HLS con ffprobe Eseguire: - +``` /usr/local/bin/ffprobe \ -hide_banner \ /tmp/hls_xiaomi/master.m3u8 - +``` Il risultato del test ha mostrato: - +``` Video: h264 1080x1920 30 fps @@ -672,9 +675,9 @@ e: Audio: aac 48000 Hz stereo - +``` Quindi: - +``` HEVC input ↓ hevc_rkmpp @@ -682,7 +685,7 @@ hevc_rkmpp h264_rkmpp ↓ HLS MPEG-TS - +``` ha funzionato correttamente. --- @@ -690,25 +693,25 @@ ha funzionato correttamente. 25. Perché usare "-hls_segment_filename" Questa opzione è importante: - +``` -hls_segment_filename '/tmp/hls_xiaomi/segment_%05d.ts' - +``` La playlist deve essere: - +``` /tmp/hls_xiaomi/master.m3u8 - +``` e i segmenti: - +``` /tmp/hls_xiaomi/segment_00000.ts /tmp/hls_xiaomi/segment_00001.ts - +``` La struttura corretta è: - +``` /tmp/hls_xiaomi/ ├── master.m3u8 ├── segment_00000.ts └── segment_00001.ts - +``` Non bisogna concatenare accidentalmente il pattern dei segmenti al nome della playlist. --- @@ -716,7 +719,7 @@ Non bisogna concatenare accidentalmente il pattern dei segmenti al nome della pl 26. Configurazione Node.js utilizzata dall'applicazione La funzione può essere strutturata così: - +``` function buildFfmpegArgs(inputPath, jobDir, useRkmpp) { const master = path.join(jobDir, 'master.m3u8'); const segPattern = path.join(jobDir, 'segment_%05d.ts'); @@ -812,7 +815,7 @@ function buildFfmpegArgs(inputPath, jobDir, useRkmpp) { ]; } } - +``` Questa è la configurazione da mantenere come riferimento per la pipeline che abbiamo testato. --- @@ -820,17 +823,17 @@ Questa è la configurazione da mantenere come riferimento per la pipeline che ab 27. Significato delle opzioni video Decoder - +``` -c:v hevc_rkmpp - +``` Utilizza il decoder hardware Rockchip MPP per HEVC. --- Encoder - +``` -c:v h264_rkmpp - +``` Utilizza l'encoder hardware Rockchip MPP per H.264. Il progetto FFmpeg-Rockchip espone i codec MPP direttamente alla CLI FFmpeg. @@ -838,51 +841,51 @@ Il progetto FFmpeg-Rockchip espone i codec MPP direttamente alla CLI FFmpeg. --- CBR - +``` -rc_mode CBR - +``` Target: - +``` -b:v 5000k - +``` Massimo: - +``` -maxrate 6000k - +``` Buffer: - +``` -bufsize 12000k - +``` Durante il test il log MPP ha confermato: - +``` mode cbr bps [4687500:5000000:5312500] - +``` --- 28. Framerate - +``` -r 30 - +``` L'output viene forzato a: - +``` 30 fps - +``` --- 29. GOP - +``` -g 90 -keyint_min 90 - +``` A 30 fps: 90 / 30 = 3 secondi Quindi il GOP è coerente con: - +``` -hls_time 3 - +``` Questo è particolarmente utile per una segmentazione HLS regolare. --- @@ -890,23 +893,23 @@ Questo è particolarmente utile per una segmentazione HLS regolare. 30. Audio Configurazione: - +``` -c:a aac -b:a 160k -ac 2 -ar 48000 - +``` Output: - +``` AAC 160 kbps stereo 48000 Hz - +``` Il punto interrogativo: - +``` -map 0:a:0? - +``` rende l'audio opzionale. Se il file non contiene una traccia audio, FFmpeg continua comunque con il video. @@ -916,29 +919,29 @@ Se il file non contiene una traccia audio, FFmpeg continua comunque con il video 31. HLS Configurazione: - +``` -f hls -hls_time 3 -hls_list_size 0 -hls_playlist_type vod -hls_segment_type mpegts - +``` Significato: - +``` -hls_time 3 - +``` segmenti di circa 3 secondi. - +``` -hls_list_size 0 - +``` mantiene tutti i segmenti nella playlist. - +``` -hls_playlist_type vod - +``` crea una playlist VOD. - +``` -hls_segment_type mpegts - +``` forza segmenti MPEG-TS. --- @@ -946,7 +949,7 @@ forza segmenti MPEG-TS. 32. Test completo automatico Dopo una reinstallazione è possibile eseguire questo controllo: - +``` cd /home/nvme/dockerdata/prove/s120js rm -rf /tmp/hls_test @@ -981,11 +984,11 @@ mkdir -p /tmp/hls_test -hls_segment_type mpegts \ -hls_segment_filename '/tmp/hls_test/segment_%05d.ts' \ /tmp/hls_test/master.m3u8 - +``` Controllare: echo "=== FILE ===" - +``` ls -lh /tmp/hls_test echo @@ -1004,36 +1007,36 @@ echo "=== PROBE ===" /usr/local/bin/ffprobe \ -hide_banner \ /tmp/hls_test/master.m3u8 - +``` --- 33. Risultato considerato corretto Il test è da considerarsi riuscito se: - +``` ffmpeg exit code = 0 - +``` e vengono creati: - +``` master.m3u8 segment_00000.ts segment_00001.ts - +``` e "ffprobe" mostra: - +``` Video: h264 - +``` con: - +``` 1080x1920 30 fps - +``` e: - +``` Audio: aac 48000 Hz stereo - +``` Nel test reale il video è risultato senza artefatti. --- @@ -1041,29 +1044,29 @@ Nel test reale il video è risultato senza artefatti. 34. Warning MPP osservati durante i test Durante la transcodifica sono comparsi alcuni messaggi MPP come: - +``` mpp_platform: client 4 driver is not ready! mpp_platform: client 12 driver is not ready! - +``` e: - +``` mpp_buffer: check buffer found NULL pointer from get_packet_async - +``` oltre a: - +``` mpp_mem_pool: mpp_mem_pool_put_f invalid mem pool ptr - +``` Questi messaggi non hanno impedito il funzionamento della pipeline testata. Nel test abbiamo infatti ottenuto: - +``` Exiting with exit code 0 - +``` e: - +``` 164 frames decoded 0 decode errors - +``` seguiti dalla corretta generazione dei segmenti HLS. Quindi non bisogna considerare automaticamente questi warning come un fallimento, ma bisogna sempre verificare: @@ -1081,31 +1084,31 @@ Quindi non bisogna considerare automaticamente questi warning come un fallimento 35.1 Usare un path HLS errato Non fare: - +``` /tmp/hls_test/master.m3u8mp/hls_test/segment_... - +``` Usare invece: - +``` -hls_segment_filename '/tmp/hls_test/segment_%05d.ts' - +``` e: - +``` /tmp/hls_test/master.m3u8 - +``` --- 35.2 Aggiungere inutilmente "-hwaccel rkmpp" La configurazione che abbiamo testato utilizza esplicitamente: - +``` -c:v hevc_rkmpp - +``` per il decoder. Quindi la configurazione applicativa non deve essere modificata aggiungendo: - +``` -hwaccel rkmpp - +``` solo perché si sta usando MPP. Il progetto "ffmpeg-rockchip" documenta anche pipeline basate su "-hwaccel rkmpp", ma quella è una modalità diversa dalla pipeline esplicitamente testata qui. @@ -1119,15 +1122,15 @@ Nel test Xiaomi FFmpeg ha già rilevato: Display Matrix: rotation of -90.00 degrees e ha applicato automaticamente: - +``` 1920x1080 → 1080x1920 - +``` Quindi non aggiungere: - +``` -vf transpose=... - +``` senza prima verificare il comportamento del file specifico. --- @@ -1135,7 +1138,7 @@ senza prima verificare il comportamento del file specifico. 36. Pipeline finale La configurazione verificata può essere riassunta così: - +``` MP4 Xiaomi │ │ @@ -1185,36 +1188,36 @@ La configurazione verificata può essere riassunta così: └──────────┬──────────┘ ▼ master.m3u8 - +``` --- 37. Checklist finale Sistema - +``` - [ ] "uname -m" → "aarch64" - [ ] RK3588 - [ ] "/dev/mpp_service" presente - [ ] "/dev/dri" presente - [ ] "/dev/dma_heap" presente - [ ] permessi utente corretti - +``` MPP - +``` - [ ] repository MPP compilato - [ ] "librockchip_mpp.so" installata - [ ] "ldconfig" aggiornato - [ ] eventuali test MPP funzionanti - +``` FFmpeg - +``` - [ ] "/usr/local/bin/ffmpeg" - [ ] "hevc_rkmpp" disponibile - [ ] "h264_rkmpp" disponibile - [ ] "rkrga" disponibile, se necessario - +``` Transcoding - +``` - [ ] HEVC hardware decode - [ ] H.264 hardware encode - [ ] CBR 5000k @@ -1222,9 +1225,9 @@ Transcoding - [ ] GOP 90 - [ ] audio AAC 160k - [ ] 48 kHz stereo - +``` HLS - +``` - [ ] "master.m3u8" - [ ] "segment_00000.ts" - [ ] "segment_00001.ts" @@ -1232,13 +1235,13 @@ HLS - [ ] segmenti MPEG-TS - [ ] "ffprobe" legge correttamente HLS - [ ] nessun artefatto video - +``` --- 38. Versioni da salvare per riproducibilità Quando la configurazione è funzionante, salvare le versioni: - +``` echo "=== MPP ===" cd /usr/local/src/rockchip-mpp git rev-parse HEAD @@ -1255,7 +1258,7 @@ echo "=== FFmpeg ===" echo echo "=== Kernel ===" uname -a - +``` È consigliato conservare questo output insieme alla guida. In caso di futura reinstallazione, sarà così possibile capire esattamente quale combinazione di: @@ -1273,29 +1276,29 @@ era stata utilizzata nella configurazione funzionante. Rockchip MPP Repository ufficiale: - +``` https://github.com/rockchip-linux/mpp - +``` Documentazione MPP: - +``` https://github.com/rockchip-linux/mpp/blob/develop/doc/Rockchip_Developer_Guide_MPP_EN.md - +``` MPP supporta RK3588 e fornisce API e librerie per encoding, decoding e processing hardware Rockchip. FFmpeg-Rockchip Repository: - +``` https://github.com/nyanmisaka/ffmpeg-rockchip - +``` Wiki: - +``` https://github.com/nyanmisaka/ffmpeg-rockchip/wiki - +``` Transcoding: - +``` https://github.com/nyanmisaka/ffmpeg-rockchip/wiki/Video-Transcode - +``` Il progetto documenta pipeline MPP decode + MPP encode e supporto ai decoder/encoder Rockchip. --- @@ -1303,7 +1306,7 @@ Il progetto documenta pipeline MPP decode + MPP encode e supporto ai decoder/enc 40. Configurazione di riferimento La configurazione da considerare come baseline funzionante è: - +``` SoC: RK3588 @@ -1333,5 +1336,5 @@ VOD playlist completa MPEG-TS segment_%05d.ts - +``` Questa è la configurazione utilizzata nei test che hanno prodotto HLS valido e video senza artefatti.