-
Notifications
You must be signed in to change notification settings - Fork 7
Home
FFmpeg has various compilation options, i will only talk about how to enable RKMPP decoders and encoders here.
To enable rkmpp decoder and encoder you need below extra libraries:
Please use latest versions of those libraries, espcially mpp, and rga which are not very backwards compatible.
To compile the rkmpp you need to configure the ffmpeg with the flag --enable-rkmpp and this will lead the below command with its dependencies
./configure --enable-rkmpp --enable-version3 --enable-libdrm
make
Please note that, for fast memory transfers, mpp
library uses /dev/dma_heap/system-uncached-dma32
device. And on default rockchip vendor kernel based oses, those devices are restricted to video
user group.
This means that if you want to use rkmpp based decoders make sure your user acccount is a member of video
You can check which group membership that the logged in user has with
groups
command, and if the video
group is not there, you can add with
sudo usermod -a -G video accountusername
To transcode to h264
ffmpeg -i input.mp4 -c:v h264 out.mp4
To transcode to h265/hevc
ffmpeg -i input.mp4 -c:v hevc out.mp4
To transcode to vp8
ffmpeg -i input.mp4 -c:v vp8 out.mkv
To capture screen with kmsgrab
sudo ffmpeg -device /dev/dri/card0 -framerate 60 -f kmsgrab -i - -c:v h264 out.mp4
To capture webcam (/dev/video1 is the v4l2 device)
ffmpeg -f v4l2 -i /dev/video1 -framerate 60 -video_size 1920x1080 -c:v h264 out.mp4
To capture Hdmi-in with rk3588
ffmpeg -f v4l2 -i /dev/video0 -framerate 60 -video_size 1920x1080 -c:v h264 out.mp4
To scale to different resolution
ffmpeg -i input.mp4 -c:v h264 -width 1280 -height 720 out.mp4
OBS Usage:
Go to settings->output->recording->type and set it to "Custom Output", set the video encoder to "hevc/h264_rkmpp_encoder". For best performance use the Pipewire Screen capture.
To get h264 encoder configuration options:
$ ffmpeg -h encoder=h264_rkmpp_encoder
ffmpeg version n6.0 Copyright (c) 2000-2023 the FFmpeg developers
Encoder h264_rkmpp_encoder [h264 (rkmpp encoder )]:
General capabilities: delay avoidprobe hardware
Threading capabilities: none
Supported hardware devices:
Supported pixel formats: nv24 yuv444p nv16 yuv422p bgr24 yuyv422 uyvy422 bgra bgr0 nv12 yuv420p drm_prime
rkmpp_h264_encoder AVOptions:
-rc_mode <int> E..V....... Set rate control mode (from 0 to 4) (default CBR)
VBR 0 E..V.......
CBR 1 E..V.......
CQP 2 E..V.......
AVBR 3 E..V.......
-quality_min <int> E..V....... Minimum Quality (from 1 to 100) (default 50)
-quality_max <int> E..V....... Maximum Quality (from 1 to 100) (default 100)
-width <int> E..V....... scale to Width (from 0 to 4096) (default 0)
-height <int> E..V....... scale to Height (from 0 to 4096) (default 0)
-profile <int> E..V....... Set profile restrictions (from -1 to 100) (default high)
baseline 66 E..V.......
main 77 E..V.......
high 100 E..V.......
-level <int> E..V....... Compression Level (from -99 to 255) (default 5.1)
1 10 E..V.......
1.1 11 E..V.......
1.2 12 E..V.......
1.3 13 E..V.......
2 20 E..V.......
2.1 21 E..V.......
2.2 22 E..V.......
3 30 E..V.......
3.1 31 E..V.......
3.2 32 E..V.......
4 40 E..V.......
4.1 41 E..V.......
4.2 42 E..V.......
5 50 E..V.......
5.1 51 E..V.......
5.2 52 E..V.......
6 60 E..V.......
6.1 61 E..V.......
6.2 62 E..V.......
-coder <int> E..V....... Entropy coder type (from 0 to 1) (default cabac) (from 0 to 1) (default cabac)
cavlc 0 E..V.......
cabac 1 E..V.......
-8x8dct <boolean> E..V....... High profile 8x8 transform. (default true)
To get Hevc encoder options:
[alarm@alarm testfiles]$ ffmpeg -h encoder=hevc_rkmpp_encoder
ffmpeg version n6.0 Copyright (c) 2000-2023 the FFmpeg developers
Encoder hevc_rkmpp_encoder [hevc (rkmpp encoder )]:
General capabilities: delay avoidprobe hardware
Threading capabilities: none
Supported hardware devices:
Supported pixel formats: nv24 yuv444p nv16 yuv422p bgr24 yuyv422 uyvy422 bgra bgr0 nv12 yuv420p drm_prime
rkmpp_hevc_encoder AVOptions:
-rc_mode <int> E..V....... Set rate control mode (from 0 to 4) (default CBR)
VBR 0 E..V.......
CBR 1 E..V.......
CQP 2 E..V.......
AVBR 3 E..V.......
-quality_min <int> E..V....... Minimum Quality (from 1 to 100) (default 50)
-quality_max <int> E..V....... Maximum Quality (from 1 to 100) (default 100)
-width <int> E..V....... scale to Width (from 0 to 4096) (default 0)
-height <int> E..V....... scale to Height (from 0 to 4096) (default 0)
-level <int> E..V....... Compression Level (from -99 to 255) (default 8.5)
1 30 E..V.......
2 60 E..V.......
2.1 63 E..V.......
3 90 E..V.......
3.1 93 E..V.......
4 120 E..V.......
4.1 123 E..V.......
5 150 E..V.......
5.1 153 E..V.......
5.2 156 E..V.......
6 180 E..V.......
6.1 183 E..V.......
6.2 186 E..V.......
8.5 255 E..V.......
To get vp8 encoder configuration options
[alarm@alarm testfiles]$ ffmpeg -h encoder=vp8_rkmpp_encoder
Encoder vp8_rkmpp_encoder [vp8 (rkmpp encoder )]:
General capabilities: delay avoidprobe hardware
Threading capabilities: none
Supported hardware devices:
Supported pixel formats: nv16 yuv422p yuyv422 uyvy422 bgra bgr0 nv12 yuv420p drm_prime
rkmpp_vp8_encoder AVOptions:
-rc_mode <int> E..V....... Set rate control mode (from 0 to 4) (default CBR)
VBR 0 E..V.......
CBR 1 E..V.......
CQP 2 E..V.......
AVBR 3 E..V.......
-quality_min <int> E..V....... Minimum Quality (from 1 to 100) (default 50)
-quality_max <int> E..V....... Maximum Quality (from 1 to 100) (default 100)
-width <int> E..V....... scale to Width (from 0 to 4096) (default 0)
-height <int> E..V....... scale to Height (from 0 to 4096) (default 0)
Normally decoder is transparent and does not need any configuration except some environment values:
FFMPEG_RKMPP_LOG_FPS=1 : prints some nice statistics about the decoder, useful to analyze the latency of decoder
FFMPEG_RKMPP_PIXFMT=YUV420P|NV12|DRMPRIME : can be either of 3 possible pixel format. When this is set, the output format is forced regardless of what the api user asks for
FFMPEG_RKMPP_NORGA=1 : When set, the decoder bypasses any librga usage and fallsback to simd based libyuv conversion