-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
FAQ FFmpeg
FFmpeg provides a set of command line tools to process audio and video media files.
Commands are located in /usr/local/ffmpeg<version>/bin and libraries are required by
other packages. In DSM 7.0, they are located in /volume1/@appstore/ffmpeg<version>/bin.
Symbolic links are made available thru /usr/local/bin as the following where the latest installed version will become default ffmpeg:
ffmpeg4ffmpeg5ffmpeg6ffmpeg7-
ffmpeg-> Last installed version
Download Fmpeg: https://www.ffmpeg.org/ffmpeg-master-latest-win64-gpl.zip
FFMPEG ultimate guide: https://img.ly/blog/ultimate-guide-to-ffmpeg/
To access video acceleration, said user must be in the videodriver group.
- Access to the video device file is granted on a per application basis. This allows an application such as
tvheadendto be granted access use hardware acceleration when callingffmpeg. - As a default user you must interact with
ffmpegacting as a user who's access was already granted or add your user account to thevideodrivergroup (see below).
# Check current user and groups
$ id $(whoami)
# Output: uid=1026(<username>) gid=100(users) groups=100(users),101(administrators)
# Add yourself to the videodriver group (using Synology's synogroup command)
$ sudo synogroup --member videodriver $(whoami)
# Expected output:
# Group Name: [videodriver]
# Group Type: [AUTH_LOCAL]
# Group ID: [937]
# Group Members:
# 0:[<username>]
# Verify the change took effect
$ id $(whoami)
# Output should now include: groups=100(users),101(administrators),937(videodriver)
# Log out and log back in for all applications to recognize the new group membershipAlternative: Run commands as the ffmpeg service user:
# For FFmpeg7
sudo su -s /bin/bash sc-ffmpeg7 -c 'command'On Intel GPUs, vainfo is used to validate that hardware video acceleration is correctly exposed through VA-API and that the Intel media driver (iHD) is functional.
This output confirms that:
- ✅ The Intel GPU is detected by the kernel
- ✅ The Intel Media Driver (iHD) is correctly installed and loadable
- ✅ VA-API is functional and able to communicate with the GPU
- ✅ Hardware decode, encode and video processing capabilities are exposed
$ /var/packages/synocli-videodriver/target/bin/vainfo
Trying display: drm
libva info: VA-API version 1.22.0
libva info: Trying to open /var/packages/synocli-videodriver/target/lib/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_22
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.22 (libva 2.22.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 24.4.4 (226f50c)
vainfo: Supported profile and entrypoints
VAProfileNone : VAEntrypointVideoProc
VAProfileNone : VAEntrypointStats
VAProfileMPEG2Simple : VAEntrypointVLD
VAProfileMPEG2Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointEncSlice
VAProfileH264Main : VAEntrypointFEI
VAProfileH264Main : VAEntrypointEncSliceLP
VAProfileH264High : VAEntrypointVLD
VAProfileH264High : VAEntrypointEncSlice
VAProfileH264High : VAEntrypointFEI
VAProfileH264High : VAEntrypointEncSliceLP
VAProfileVC1Simple : VAEntrypointVLD
VAProfileVC1Main : VAEntrypointVLD
VAProfileVC1Advanced : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointVLD
VAProfileJPEGBaseline : VAEntrypointEncPicture
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
VAProfileH264ConstrainedBaseline: VAEntrypointFEI
VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
VAProfileVP8Version0_3 : VAEntrypointVLD
VAProfileVP8Version0_3 : VAEntrypointEncSlice
VAProfileHEVCMain : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointEncSlice
VAProfileHEVCMain : VAEntrypointFEI
VAProfileHEVCMain10 : VAEntrypointVLD
VAProfileVP9Profile0 : VAEntrypointVLDNote that older Intel processor will fall-back to legacy i965 driver part of vainfo output:
vainfo: VA-API version: 1.22 (libva 2.22.0)
vainfo: Driver version: Intel i965 driver for Intel(R) CherryView - 2.4.1If access is restricted or non-existant such as on virtual DSM:
$ vainfo
Trying display: drm
error: failed to initialize displayBefore validating individual acceleration paths, confirm that FFmpeg itself was built with hardware acceleration support.
List available hardware acceleration methods
$ ffmpeg7 -hide_banner -hwaccelsExpected output:
Hardware acceleration methods:
vaapi
qsv
drm
openclThis validates that FFmpeg was compiled with support for:
- VA-API (Intel media driver)
- QSV (Intel Quick Sync Video)
- DRM (direct render node access)
- OpenCL (GPU compute filters)
The hardware acceleration frameworks are enabled at build time. If a method is missing here, FFmpeg cannot use it, regardless of driver availability.
| Acceleration | Primary Use Case |
|---|---|
| VA-API | Hardware decode/encode and basic video processing |
| QSV | High-performance Intel video processing and encoding |
| OpenCL | GPU-accelerated image and video compute filters |
| CPU | Fallback / reference / maximum compatibility |
All tests were executed on the same system using FFmpeg 7.0.3, with identical input, duration and output settings.
| Path | FPS | Speed | Real Time (rtime) | User Time (utime) | Max RSS |
|---|---|---|---|---|---|
| CPU | 13 | 0.419x | 23.884 s | 27.069 s | 117 MB |
| VA-API | 17 | 0.559x | 17.902 s | 25.339 s | 125 MB |
| OpenCL | 21 | 0.686x | 14.575 s | 18.663 s | 184 MB |
| QSV | 23 | 0.773x | 12.943 s | 20.941 s | 133 MB |
This test validates that FFmpeg can successfully use VA-API for hardware-accelerated video processing.
Validate available VAAPI filters:
$ ffmpeg7 -hide_banner -filters | grep vaapi
... deinterlace_vaapi V->V Deinterlacing of VAAPI surfaces
... denoise_vaapi V->V VAAPI VPP for de-noise
... hwupload_vaapi V->V Upload a system memory frame to a VAAPI device.
... overlay_vaapi VV->V Overlay one video on top of another
... procamp_vaapi V->V ProcAmp (color balance) adjustments for hue, saturation, brightness, contrast
... scale_vaapi V->V Scale to/from VAAPI surfaces.
... sharpness_vaapi V->V VAAPI VPP for sharpness
... tonemap_vaapi V->V VAAPI VPP for tone-mapping
... transpose_vaapi V->V VAAPI VPP for transpose
... hstack_vaapi N->V "VA-API" hstack
... vstack_vaapi N->V "VA-API" vstack
... xstack_vaapi N->V "VA-API" xstackMinimal VA-API video processing test
$ ffmpeg7 -benchmark \
-init_hw_device vaapi=va:/dev/dri/renderD128 \
-filter_hw_device va \
-f lavfi -i testsrc=duration=10:size=1920x1080:rate=30 \
-vf "format=nv12,hwupload,scale_vaapi=w=1280:h=720,hwdownload,format=nv12" \
-f null -This confirms end-to-end VA-API functionality, not just driver presence, and validates that FFmpeg can:
- Initialize a VA-API hardware device
- Upload frames to the GPU (
hwupload) - Execute a VA-API hardware filter (
scale_vaapi) - Download frames back to system memory (
hwdownload)
This test validates FFmpeg’s QSV path, which is built on top of VA-API but uses Intel’s Media SDK / oneVPL. QSV often provides lower CPU usage and better performance than VA-API for Intel GPUs.
Validate available QSV filters:
$ ffmpeg7 -hide_banner -filters | grep qsv
... deinterlace_qsv V->V Quick Sync Video "deinterlacing"
... overlay_qsv VV->V Quick Sync Video overlay.
... scale_qsv V->V Quick Sync Video "scaling and format conversion"
... vpp_qsv V->V Quick Sync Video "VPP"
... hstack_qsv N->V "Quick Sync Video" hstack
... vstack_qsv N->V "Quick Sync Video" vstack
... xstack_qsv N->V "Quick Sync Video" xstackMinimal QSV video processing test:
$ ffmpeg7 -benchmark \
-init_hw_device qsv=qsv \
-filter_hw_device qsv \
-f lavfi -i testsrc=duration=10:size=1920x1080:rate=30 \
-vf "format=nv12,hwupload=extra_hw_frames=64,scale_qsv=w=1280:h=720,hwdownload,format=nv12" \
-f null -This confirms that Intel QSV acceleration is available and usable and validates FFmpeg can:
- Initialize a QSV hardware context
- Allocate QSV surfaces on the GPU
- Execute a QSV-native filter (
scale_qsv)
This test validates GPU compute acceleration via OpenCL, typically used for image processing filters. OpenCL filters are compute-oriented, not video-codec-oriented, and are complementary to VA-API / QSV.
How to validate OpenCL hardware acceleration (truncated output below - only available on DSM >=7 with more recent Intel processors):
$ /var/packages/synocli-videodriver/target/bin/clinfo
Number of platforms 1
Platform Name Intel(R) OpenCL Graphics
Platform Vendor Intel(R) Corporation
Platform Version OpenCL 3.0
Platform Profile FULL_PROFILE
...
Validate available OpenCL filters:
$ ffmpeg7 -hide_banner -filters | grep opencl
... avgblur_opencl V->V Apply average blur filter
... boxblur_opencl V->V Apply boxblur filter to input video
... colorkey_opencl V->V Turns a certain color into transparency. Operates on RGB colors.
... convolution_opencl V->V Apply convolution mask to input video
... deshake_opencl V->V Feature-point based video stabilization filter
... dilation_opencl V->V Apply dilation effect
... erosion_opencl V->V Apply erosion effect
... nlmeans_opencl V->V Non-local means denoiser through OpenCL
... overlay_opencl VV->V Overlay one video on top of another
... pad_opencl V->V Pad the input video.
... prewitt_opencl V->V Apply prewitt operator
... program_opencl N->V Filter video using an OpenCL program
... remap_opencl VVV->V Remap pixels using OpenCL.
... roberts_opencl V->V Apply roberts operator
... scale_opencl V->V Scale the input video size through OpenCL.
... sobel_opencl V->V Apply sobel operator
... tonemap_opencl V->V Perform HDR to SDR conversion with tonemapping.
... transpose_opencl V->V Transpose input video
... unsharp_opencl V->V Apply unsharp mask to input video
... xfade_opencl VV->V Cross fade one video with another video.
... openclsrc |->V Generate video using an OpenCL programMinimal OpenCL filter test:
$ ffmpeg7 -benchmark \
-init_hw_device opencl=ocl \
-filter_hw_device ocl \
-f lavfi -i testsrc=duration=10:size=1920x1080:rate=30 \
-vf "format=nv12,hwupload,boxblur_opencl,hwdownload,format=nv12" \
-f null -This Confirms OpenCL runtime and GPU compute path are operational and validates that FFmpeg can:
- Initialize an OpenCL compute device
- Upload frames to GPU memory
- Execute OpenCL-based filters
- Download frames back to system memory
Ref: https://dev.to/drsensor/list-of-helpful-ffmpeg-command-for-checking-capabilities-1110
How to list all filter options:
$ ffmpeg7 -hide_banner -filters
Filters:
T.. = Timeline support
.S. = Slice threading
..C = Command support
A = Audio input/output
V = Video input/output
N = Dynamic number and/or type of input/output
| = Source or sink filter
T.. adelay A->A Delay one or more audio channels.
... aecho A->A Add echoing to the audio.
...How to validate ffmpeg OpenCL acceleration (only available on DSM >=7 with more recent Intel processors):
$ ffmpeg7 -hide_banner -filters | grep opencl
... avgblur_opencl V->V Apply average blur filter
... boxblur_opencl V->V Apply boxblur filter to input video
... colorkey_opencl V->V Turns a certain color into transparency. Operates on RGB colors.
... convolution_opencl V->V Apply convolution mask to input video
... deshake_opencl V->V Feature-point based video stabilization filter
... dilation_opencl V->V Apply dilation effect
... erosion_opencl V->V Apply erosion effect
... nlmeans_opencl V->V Non-local means denoiser through OpenCL
... overlay_opencl VV->V Overlay one video on top of another
... pad_opencl V->V Pad the input video.
... prewitt_opencl V->V Apply prewitt operator
... program_opencl N->V Filter video using an OpenCL program
... remap_opencl VVV->V Remap pixels using OpenCL.
... roberts_opencl V->V Apply roberts operator
... scale_opencl V->V Scale the input video size through OpenCL.
... sobel_opencl V->V Apply sobel operator
... tonemap_opencl V->V Perform HDR to SDR conversion with tonemapping.
... transpose_opencl V->V Transpose input video
... unsharp_opencl V->V Apply unsharp mask to input video
... xfade_opencl VV->V Cross fade one video with another video.
... openclsrc |->V Generate video using an OpenCL program
How to list encoders|decoders|codecs
$ ffmpeg7 -hide_banner -encoders
$ ffmpeg7 -hide_banner -decoders
$ ffmpeg7 -hide_banner -codecs
How to list details of a specific encoder|decoder|codec
$ ffmpeg7 -hide_banner -h encoder=<encoder>
$ ffmpeg7 -hide_banner -h decoder=<decoder>
Example for HEVC:
$ ffmpeg7 -hide_banner -h decoder=hevc
Decoder hevc [HEVC (High Efficiency Video Coding)]:
General capabilities: dr1 delay threads
Threading capabilities: frame and slice
Supported hardware devices: vaapi
HEVC decoder AVOptions:
-apply_defdispwin <boolean> .D.V....... Apply default display window from VUI (default false)
-strict-displaywin <boolean> .D.V....... stricly apply default display window size (default false)
Example for VVC (new with ffmpeg7):
$ ffmpeg7 -hide_banner -h decoder=vvc
Decoder vvc [VVC (Versatile Video Coding)]:
General capabilities: dr1 delay exp threads
Threading capabilities: other
For a specific feature like 10bits support in HEVC:
$ /var/packages/ffmpeg7/target/bin/x265 -V -D10
x265 [info]: HEVC encoder version 3.6+1-aa7f602f7
x265 [info]: build info [Linux][GCC 8.5.0][64 bit] 10bit
x265 [info]: using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2
The following command-line assumes that your user has been added to the videodriver group (see above for details).
$ ffmpeg7 -hide_banner -hwaccel qsv -i input.mp4 -c:v hevc_qsv -preset faster -global_quality 25 -tag:v hvc1 -map_metadata 0 output.mp4
Explanation of relevant options:
| Option | Notes |
|---|---|
-hwaccel qsv |
This is what requests hardware acceleration via the Intel QSV driver |
-c:v hevc_qsv |
This selects the HEVC encoder that is QSV accelerated. You can look for other encoders that are accelerated (those ending in _qsv). |
-global_quality 25 |
The quality setting for HEVC (for others it might be called -crf) |
-tag:v hvc1 |
This adds a tag to the output that makes the resulting MP4 file more compatible with MacOS (e.g. without it Quicktime pretends that it cannot read the file). This is specific to HEVC encoded files. |
-map_metadata 0 |
This is completely optional, but it copies the meta-data from the original file over to the transcoded file (things like camera info, GPS data (if present) etc.) |
Note: If you haven't added your user to the videodriver group, you can adapt the above su call. In general, you have to issue commands like this: sudo su -s /bin/bash sc-ffmpeg7 -c 'COMMAND_TO_RUN'. This essentially runs COMMAND_TO_RUN with sc-ffmpeg7 permissions. Specifically, the full command from above would look like: sudo su -s /bin/bash sc-ffmpeg7 -c 'ffmpeg7 -hide_banner -hwaccel qsv -i input.mp4 -c:v hevc_qsv -preset faster -global_quality 25 -tag:v hvc1 -map_metadata 0 output.mp4'.
- Home
- Packages
- Concepts
- Development
- Resources