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: - decoding hardware HEVC con "hevc_rkmpp" - encoding hardware H.264 con "h264_rkmpp" - transcodifica HEVC → H.264 - output HLS - segmenti MPEG-TS - audio AAC - 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. --- 1. Hardware e software Hardware utilizzato: Orange Pi 5 Plus Rockchip RK3588 ARM64 / aarch64 La libreria Rockchip MPP supporta la famiglia RK3588. Il progetto "ffmpeg-rockchip" è una fork di FFmpeg pensata per la pipeline hardware Rockchip MPP/RGA e include decoder ed encoder hardware. Il progetto è indirizzato in particolare a piattaforme RK3588/RK3588S. Repository: - MPP: https://github.com/rockchip-linux/mpp - FFmpeg-Rockchip: https://github.com/nyanmisaka/ffmpeg-rockchip - Wiki FFmpeg-Rockchip: https://github.com/nyanmisaka/ffmpeg-rockchip/wiki --- 2. Controllo iniziale del sistema Controllare l'architettura: uname -m Atteso: aarch64 Controllare il kernel: uname -a Controllare la distribuzione: cat /etc/os-release --- 3. Controllo dei device Rockchip 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 /dev/vpu-service /dev/hevc_service /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 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 \ cmake \ pkg-config \ yasm \ nasm \ libdrm-dev \ libdrm2 \ 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. --- 6. Installazione Rockchip MPP 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. --- 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 mpp_buffer_test mpp_mem_test mpp_runtime_test 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 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 \ --enable-version3 \ --enable-libdrm \ --enable-rkmpp \ --enable-rkrga \ --enable-shared \ --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. --- 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 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 --- 16. Verificare i filtri RGA Se RGA è stato compilato: /usr/local/bin/ffmpeg \ -hide_banner \ -filters | grep rkrga Possibili filtri: scale_rkrga vpp_rkrga overlay_rkrga Il progetto documenta "scale_rkrga" per scaling/conversione formato e "vpp_rkrga" per operazioni come scaling, crop e transpose. --- 17. Primo test: decoder HEVC 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 e: hevc_rkmpp --- 18. Test HEVC → H.264 Testare contemporaneamente decoder e encoder hardware: /usr/local/bin/ffmpeg \ -hide_banner \ -loglevel verbose \ -y \ -c:v hevc_rkmpp \ -i input.mp4 \ -map 0:v:0 \ -c:v h264_rkmpp \ -rc_mode CBR \ -b:v 5000k \ -maxrate 6000k \ -bufsize 12000k \ -r 30 \ -g 90 \ -keyint_min 90 \ output.mp4 Controllare: /usr/local/bin/ffprobe \ -hide_banner \ output.mp4 --- 19. Test con il video Xiaomi 13T Pro Il file utilizzato nei test: VID_20260221_095917.mp4 Directory: cd /home/nvme/dockerdata/prove/s120js Il file presenta: Video: HEVC 1920x1080 ~30 fps yuv420p e: Audio: AAC 48000 Hz 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 Il file contiene nei metadata: Display Matrix: rotation of -90.00 degrees Durante il test FFmpeg ha rilevato automaticamente la rotazione. Nel log è comparso: [transpose] w:1920 h:1080 dir:1 -> w:1080 h:1920 Quindi l'output corretto è: 1080x1920 Non è stato necessario aggiungere manualmente: -vf transpose=... Questo è importante. Per il file Xiaomi testato la pipeline ha quindi fatto: Input: 1920x1080 HEVC rotation -90° ↓ hevc_rkmpp ↓ transpose automatico ↓ 1080x1920 ↓ h264_rkmpp ↓ HLS MPEG-TS --- 21. Pipeline HLS funzionante 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 \ -y \ -probesize 5000000 \ -analyzeduration 10000000 \ -c:v hevc_rkmpp \ -i VID_20260221_095917.mp4 \ -map 0:v:0 \ -map 0:a:0? \ -c:v h264_rkmpp \ -rc_mode CBR \ -b:v 5000k \ -maxrate 6000k \ -bufsize 12000k \ -r 30 \ -g 90 \ -keyint_min 90 \ -c:a aac \ -b:a 160k \ -ac 2 \ -ar 48000 \ -f hls \ -hls_time 3 \ -hls_list_size 0 \ -hls_playlist_type vod \ -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 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-PLAYLIST-TYPE:VOD #EXTINF:3.000000, segment_00000.ts #EXTINF:2.466667, segment_00001.ts #EXT-X-ENDLIST La durata totale è circa: 5.47 secondi --- 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 e: Audio: aac 48000 Hz stereo Quindi: HEVC input ↓ hevc_rkmpp ↓ h264_rkmpp ↓ HLS MPEG-TS 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. --- 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'); if (useRkmpp) { return [ '-hide_banner', '-loglevel', 'verbose', '-y', // Input probing '-probesize', '5000000', '-analyzeduration', '10000000', // Rockchip HEVC hardware decoder '-c:v', 'hevc_rkmpp', '-i', inputPath, // Streams '-map', '0:v:0', '-map', '0:a:0?', // Rockchip H.264 hardware encoder '-c:v', 'h264_rkmpp', '-rc_mode', 'CBR', '-b:v', '5000k', '-maxrate', '6000k', '-bufsize', '12000k', // Output framerate '-r', '30', // 90 frames = 3 seconds at 30 fps '-g', '90', '-keyint_min', '90', // Audio '-c:a', 'aac', '-b:a', '160k', '-ac', '2', '-ar', '48000', // HLS '-f', 'hls', '-hls_time', '3', '-hls_list_size', '0', '-hls_playlist_type', 'vod', '-hls_segment_type', 'mpegts', '-hls_segment_filename', segPattern, master ]; } } Questa è la configurazione da mantenere come riferimento per la pipeline che abbiamo testato. --- 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. --- 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. --- 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. --- 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. --- 32. Test completo automatico Dopo una reinstallazione è possibile eseguire questo controllo: cd /home/nvme/dockerdata/prove/s120js rm -rf /tmp/hls_test mkdir -p /tmp/hls_test /usr/local/bin/ffmpeg \ -hide_banner \ -loglevel verbose \ -y \ -probesize 5000000 \ -analyzeduration 10000000 \ -c:v hevc_rkmpp \ -i VID_20260221_095917.mp4 \ -map 0:v:0 \ -map 0:a:0? \ -c:v h264_rkmpp \ -rc_mode CBR \ -b:v 5000k \ -maxrate 6000k \ -bufsize 12000k \ -r 30 \ -g 90 \ -keyint_min 90 \ -c:a aac \ -b:a 160k \ -ac 2 \ -ar 48000 \ -f hls \ -hls_time 3 \ -hls_list_size 0 \ -hls_playlist_type vod \ -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 echo "=== PLAYLIST ===" cat /tmp/hls_test/master.m3u8 echo echo "=== SEGMENTI ===" ls -lh /tmp/hls_test/segment_*.ts echo 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. --- 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: 1. exit code di FFmpeg 2. presenza dei segmenti 3. validità della playlist 4. output di "ffprobe" 5. qualità visiva del video --- 35. Errori da evitare 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. --- 35.3 Aggiungere manualmente "transpose" 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. --- 36. Pipeline finale La configurazione verificata può essere riassunta così: MP4 Xiaomi │ │ ▼ HEVC / H.265 1920x1080 ~30 fps │ ▼ hevc_rkmpp │ │ RK3588 hardware │ ▼ rotazione metadata │ ▼ 1080x1920 │ ▼ h264_rkmpp │ CBR 5000 kbps │ ▼ H.264 │ ┌──────────┴──────────┐ │ │ ▼ ▼ Video AAC H.264 160 kbps │ │ └──────────┬──────────┘ │ ▼ HLS │ ▼ MPEG-TS segments │ ┌──────────┴──────────┐ ▼ ▼ segment_00000.ts segment_00001.ts │ │ └──────────┬──────────┘ ▼ 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 - [ ] 30 fps - [ ] GOP 90 - [ ] audio AAC 160k - [ ] 48 kHz stereo HLS - [ ] "master.m3u8" - [ ] "segment_00000.ts" - [ ] "segment_00001.ts" - [ ] playlist VOD - [ ] 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 echo echo "=== FFmpeg Rockchip ===" cd /usr/local/src/ffmpeg-rockchip git rev-parse HEAD echo echo "=== FFmpeg ===" /usr/local/bin/ffmpeg -hide_banner -version | head -n 3 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: kernel MPP FFmpeg-Rockchip era stata utilizzata nella configurazione funzionante. --- 39. Riferimenti ufficiali 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. --- 40. Configurazione di riferimento La configurazione da considerare come baseline funzionante è: SoC: RK3588 Decoder: hevc_rkmpp Encoder: h264_rkmpp Video: CBR 5000 kbps maxrate 6000 kbps bufsize 12000 kbps 30 fps GOP 90 Audio: AAC 160 kbps 48 kHz stereo HLS: 3 secondi VOD playlist completa MPEG-TS segment_%05d.ts Questa è la configurazione utilizzata nei test che hanno prodotto HLS valido e video senza artefatti.