AMD iGPU for HW trancoding in container

Hi -

After a few years of perfect Intel-based HW acceleration by simply passing /dev/dri into the container and it 'just working', I've upgraded my server and now it has an AMD iGPU - a 660M to be precise.

It appears it is no longer 'plug and play' out the box with Debian 14 in a minimal install (no desktop environment), but there are conflicted threads about whether it should work, and if so, how to enable it.

I've poked around for a bit but ended up installing so many other things both outside and inside the container it sort of broke the point of using a container in the first place!

So I've gone back to square one and have a minimal Debian install with firmware-amd-graphics installed from testing (the whole distro is on testing), so should be up to date. I've also tried the current and pre-release of Channels but no difference.

With Intel that seemed to be enough as presumably any other libraries needed are then inside the container ... but I get this error:

h264_amf
fork/exec /channels-dvr/2025.08.01.1845/ffmpeg-dl: no such file or directory
h264_nvenc
fork/exec /channels-dvr/2025.08.01.1845/ffmpeg-dl: no such file or directory
h264_nvenc+deint
fork/exec /channels-dvr/2025.08.01.1845/ffmpeg-dl: no such file or directory
h264_nvenc+scaler
fork/exec /channels-dvr/2025.08.01.1845/ffmpeg-dl: no such file or directory
h264_nvenc+tonemap
fork/exec /channels-dvr/2025.08.01.1845/ffmpeg-dl: no such file or directory
h264_vaapi@/dev/dri/card0
[AVHWDeviceContext @ 0x30f39d40] libva: VA-API version 1.22.0
DRM_IOCTL_I915_GEM_APERTURE failed: Invalid argument
Assuming 131072kB available aperture size.
May lead to reduced performance or incorrect rendering.
get chip id failed: -1 [2]
param: 4, val: 0
i915 does not support EXECBUFER2
DRM_IOCTL_VERSION, unsupported drm device by media driver: amdg
DRM_IOCTL_VERSION, unsupported drm device by media driver: amdg
[AVHWDeviceContext @ 0x30f39d40] libva: driver init failed
[AVHWDeviceContext @ 0x30f39d40] libva: va_openDriver() returns 18
[AVHWDeviceContext @ 0x30f39d40] Failed to initialise VAAPI connection: 18 (invalid parameter).
signal: segmentation fault
h264_vaapi@/dev/dri/renderD128
[AVHWDeviceContext @ 0x2c134d40] libva: VA-API version 1.22.0
DRM_IOCTL_I915_GEM_APERTURE failed: Invalid argument
Assuming 131072kB available aperture size.
May lead to reduced performance or incorrect rendering.
get chip id failed: -1 [2]
param: 4, val: 0
i915 does not support EXECBUFER2
DRM_IOCTL_VERSION, unsupported drm device by media driver: amdg
DRM_IOCTL_VERSION, unsupported drm device by media driver: amdg
[AVHWDeviceContext @ 0x2c134d40] libva: driver init failed
[AVHWDeviceContext @ 0x2c134d40] libva: va_openDriver() returns 18
[AVHWDeviceContext @ 0x2c134d40] Failed to initialise VAAPI connection: 18 (invalid parameter).
signal: segmentation fault
h264_vaapi@/dev/dri/renderD129
no such file or directory
h264_vaapi@/dev/renderD128
no such file or directory

Firstly, I think I had this on Intel so maybe a red herring but why can't it find ffmpeg-dl? I've checked in the container and it is present on the paths mentioned (/channels-dvr/2025.08.01.1845/ffmpeg-dl)

Secondly, is the fact it says amdg instead of amdgpu an issue?

Thirdly and mostly, I'm looking for advice on what extra package I need to install on the host in order to have it work inside the container. I'm presuming it is a host package missing due to reports of it working elsewhere and it being unlikely the solution was to rebuild the image.

I've seen some threads say that I need to map another device, or maybe I need to move to the proprietary drivers ... ?

I'd be happy once this is sorted to write it up for others. I suspect that many others who report this working are running the server on a more featured machine and maybe not in a container so whatever I am missing is there already for them.

It's worth noting that while my GPU is recognised by Plex in it's settings, it is not used for transcoding indicating a similar root cause - though I've not troubleshot that.

Thanks for your help!

OK I got a bit further - inside the container I installed

apk add mesa-va-gallium --no-cache --update-cache

Which then included libva that didn't seem to be installed already despite being used in the Channels View Debug Info. :thinking:

(24/25) Installing libva (2.22.0-r1)

Then I also installed libva-utils to get vainfo which running provides:

Trying display: wayland
error: XDG_RUNTIME_DIR is invalid or not set in the environment.
Trying display: x11
error: can't connect to X server!
Trying display: drm
libva info: VA-API version 1.22.0
libva info: Trying to open /usr/lib/dri/radeonsi_drv_video.so
libva info: Found init function __vaDriverInit_1_22
amdgpu: os_same_file_description couldn't determine if two DRM fds reference the same file description.
If they do, bad things may happen!
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.22 (libva 2.22.0)
vainfo: Driver version: Mesa Gallium driver 24.2.8 for AMD Radeon 660M (radeonsi, rembrandt, LLVM 19.1.4, DRM 3.64, 6.16.12+deb14+1-amd64)
vainfo: Supported profile and entrypoints
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSlice
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSlice
      VAProfileHEVCMain               : VAEntrypointVLD
      VAProfileHEVCMain               : VAEntrypointEncSlice
      VAProfileHEVCMain10             : VAEntrypointVLD
      VAProfileHEVCMain10             : VAEntrypointEncSlice
      VAProfileJPEGBaseline           : VAEntrypointVLD
      VAProfileVP9Profile0            : VAEntrypointVLD
      VAProfileVP9Profile2            : VAEntrypointVLD
      VAProfileAV1Profile0            : VAEntrypointVLD
      VAProfileNone                   : VAEntrypointVideoProc

The start of this output seems to be because I don't have a desktop environment installed, but the latter suggests that VA-API is all installed and ready to go! It seems to be the same version of libva as the debug info from Channels (1.22).

But - if libva wasn't installed in the container, already then how did the Channels debug reference it? Is it using it's own instance? And if so, is that without the Mesa Gallium driver?

The other curious thing is the Trying display: drm in the vainfo log, and then references to an 'unsupported drm device' in the Channel debug.

What is channels actually running when it produces it's debug? That might help me get closer to finding out what is missing.

OK I think I've worked out the reason it is not working, and I'm not sure how this will ever work without Channels changing things, so any other reports of it working seem fishy to me!

I was now able to confirm the use of VAAPI-based HW encode inside the container when only passing in /dev/dri by encoding a file with ffmpeg.

I had forgotten that Channels uses its own ffmpeg and installed it directly (apk add ffmpeg), then ran this command to create a stream of video and then encode using h264.

ffmpeg -v verbose -init_hw_device vaapi=va:/dev/dri/renderD128 -filter_complex 'testsrc=size=1280x720:rate=30,format=nv12,hwupload' -t 5 -c:v h264_vaapi -y /tmp/test_vaapi.mp4

In the output I see:

...
[AVHWDeviceContext @ 0x7fd153e2de00] Initialised VAAPI connection: version 1.22
[AVHWDeviceContext @ 0x7fd153e2de00] VAAPI driver: Mesa Gallium driver 24.2.8 for AMD Radeon 660M (radeonsi, rembrandt, LLVM 19.1.4, DRM 3.64, 6.16.12+deb14+1-amd64).
...
[h264_vaapi @ 0x7fd146460300] Using VAAPI profile VAProfileH264High (7).
[h264_vaapi @ 0x7fd146460300] Using VAAPI entrypoint VAEntrypointEncSlice (6).
[h264_vaapi @ 0x7fd146460300] Using VAAPI render target format YUV420 (0x1).
...

And no errors, demonstrating the use of VAAPI. This shows that I don't need any additional installed packages on the host as I originally though.

Then I remembered that Channels bundles it's own ffmpeg and long story short seems like that is somehow configured to only use Intel VAAPI and so the errors are because it is looking for i915 instead of amdgpu driver libraries.

I can demonstrate this by running the same ffmpeg encoding above but on Channels internal ffmpeg fails and it gives the same errors as originally reported.

Then as further proof, I symlinked the apk ffmpeg to replace the Channels bundled one and lo and behold - it succeeds and Channels report Hardware capable transcoding.

So at this point I feel pretty stuck - the hardware is clearly capable, and it is actually fairly trivial - as long as mesa-va-gallium is installed is should 'just work', but because Channels is using its own ffmpeg that seems to only supports Intel ... failure.

I don't know if any Channels Dev are looking at this but if there is any way to override the ffmpeg in use (at my own risk yada yada), or maybe some environment variable to 'switch' it to radeonsi (e.g. LIBVA_DRIVER_NAME=radeonsi, LIBVA_DRIVERS_PATH=/usr/lib/dri), that would be much appreciated!

Or, if there is a way to 'roll my own' container with my own ffmpeg and Channels that would be fine too?

I went down the path of rolling my own container and have got to the following 'solution'.

I can create a new image starting FROM the official one and install simply mesa-va-gallium and ffmpeg.

Then, I need to replace the bundled ffmpeg in /channels-dvr/latest with the system one in /usr/bin that uses the mesa-va libraries

But due to the way Channels is run I've had to wrap the run.sh with my own script and override the existing CMD.

This does seem to work - Channels is running and hardware transcoding is successful!

The only trouble is that now when Channels does its own auto update, it will overwrite the 'hack' and go back to its own ffmpeg and I won't notice. So need to think of a way to resolve that if I continue with this path.

@tmm1 and @maddox - apologies to tag you direct but was hoping one of you might weigh in on this already. Can you comment on whether AMD GPU support is something you could support directly please? I presume that using a bundled ffmpeg is because then you have more control over what you test?

Here is my revised Dockerfile:

FROM docker.io/fancybits/channels-dvr:latest

RUN apk add mesa-va-gallium ffmpeg --no-cache --update-cache

COPY run-and-update-ffmpeg.sh /

CMD /bin/sh -c ./run-and-update-ffmpeg.sh

And here is the run-and-update-ffmpeg.sh:

#!/bin/sh
set -e

# Run the original run.sh in the background
/run.sh &

# Wait for Channels to be downloaded and `latest` folder to be created
echo "Waiting for folder /channels-dvr/latest to be created ..."
while [ ! -d /channels-dvr/latest ]; do
  sleep 1
done

# Once the folder exists, switch ffmpeg
echo "Folder detected, switching ffmpeg ..."
mv /channels-dvr/latest/ffmpeg /channels-dvr/latest/ffmpeg.non-amd
ln -sf /usr/bin/ffmpeg /channels-dvr/latest/ffmpeg

# Wait for run.sh process to keep container alive
wait

It's a bit gutting that this has got no attention given such a simple 'fix', or at least an explanation of why it isn't and won't be supported. Maybe AMD GPUs are not quite as present as I think they are.

It's not clear why ffmpeg-dl didn't get installed. It should have been able to use h264_amf which is an amd driver separate from vaapi

Wondering what the permissions look like on the files in the container
Mine are all 755 root root

# ls -l /channels-dvr/2025.11.26.2338
-rwxr-xr-x 1 root root  90138552 Nov 27 09:46 channels-dvr
-rwxr-xr-x 1 root root  17928088 Nov 27 09:46 comskip
-rwxr-xr-x 1 root root 147207832 Nov 27 09:46 ffmpeg
-rwxr-xr-x 1 root root  72765378 Nov 27 09:46 ffmpeg-dl
-rwxr-xr-x 1 root root  21416600 Nov 27 09:46 ffprobe
-rwxr-xr-x 1 root root       376 Nov 27 09:46 linux-x86_64.sha256
-rwxr-xr-x 1 root root        15 Nov 27 09:46 prerelease
-rwxr-xr-x 1 root root        15 Nov 27 09:46 version
# uname -sm
Linux x86_64

Thanks for the reply.

Yes, I thought this was odd as a message as well, as it is installed in the sense that it is on disk from the download, but if you try to execute it, it gives you that error - what might cause that?

/channels-dvr/latest # ls -alh
total 333M   
drwxr-xr-x    2 root     root        4.0K Dec  7 09:37 .
drwxrwxr-x    4 root     root        4.0K Dec  7 09:37 ..
-rwxr-xr-x    1 root     root       85.5M Dec  7 09:37 channels-dvr
-rwxr-xr-x    1 root     root       17.1M Dec  7 09:37 comskip
-rwxr-xr-x    1 root     root      140.4M Dec  7 09:37 ffmpeg
-rwxr-xr-x    1 root     root       69.4M Dec  7 09:37 ffmpeg-dl
-rwxr-xr-x    1 root     root       20.4M Dec  7 09:37 ffprobe
-rwxr-xr-x    1 root     root         376 Dec  7 09:37 linux-x86_64.sha256

but

/channels-dvr/latest # ./ffmpeg-dl -h
/bin/sh: ./ffmpeg-dl: not found

and the other ffmpeg works fine:

/channels-dvr/latest # ./ffmpeg -h
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

I think you're suggesting that if ffmpeg-dl was executable/'found' then hardware transcoding would work on AMD?

This is just using the Docker image, not my weird hack workaround.

@chDVRuser what happens if you try to run ffmpeg-dl?

Weird. Can you try without docker

Works for me

# pwd
/channels-dvr/2025.11.26.2338
# ls -l
total 341288
-rwxr-xr-x 1 root root  90138552 Nov 27 09:44 channels-dvr
-rwxr-xr-x 1 root root  17928088 Nov 27 09:44 comskip
-rwxr-xr-x 1 root root 147207832 Nov 27 09:45 ffmpeg
-rwxr-xr-x 1 root root  72765378 Nov 27 09:45 ffmpeg-dl
-rwxr-xr-x 1 root root  21416600 Nov 27 09:45 ffprobe
-rwxr-xr-x 1 root root       376 Nov 27 09:44 linux-x86_64.sha256
-rwxr-xr-x 1 root root        15 Nov 27 09:45 prerelease
-rwxr-xr-x 1 root root        15 Nov 27 09:45 version
# ./ffmpeg-dl -version
ffmpeg version 6.0.2 Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 6.5.0 (Ubuntu 6.5.0-2ubuntu1~14.04.1) 20181026
configuration: --prefix=/home/vagrant/channels-server/ext/dst/linux-x86_64 --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --enable-pic --disable-shared --enable-static --disable-sdl2 --disable-stripping --disable-lzma --disable-xlib --disable-libvpx --disable-indev=dv1394 --disable-hwaccel=vc1_qsv --enable-gray --enable-libmp3lame --extra-cflags=-I/home/vagrant/channels-server/ext/dst/linux-x86_64/include --extra-ldflags=-L/home/vagrant/channels-server/ext/dst/linux-x86_64/lib --enable-libdav1d --extra-libs=-static --extra-cflags=--static --pkg-config-flags=--static --disable-iconv --disable-nvenc --disable-amf --enable-vaapi --enable-nvenc --enable-amf --cc=gcc-6 --enable-chromaprint --disable-encoders --disable-decoders --disable-muxers --disable-demuxers --disable-protocols --disable-filters --disable-parsers --enable-encoder=aac --enable-encoder=aac_at --enable-encoder=ac3 --enable-encoder=ac3_fixed --enable-encoder=apng --enable-encoder=bmp --enable-encoder=flac --enable-encoder=h264_nvenc --enable-encoder=h264_nvmpi --enable-encoder=h264_omx --enable-encoder=h264_qsv --enable-encoder=h264_vaapi --enable-encoder=h264_videotoolbox --enable-encoder=h264_v4l2m2m --enable-encoder=hevc_nvenc --enable-encoder=hevc_qsv --enable-encoder=hevc_nvmpi --enable-encoder=hevc_vaapi --enable-encoder=hevc_v4l2m2m --enable-encoder=hevc_videotoolbox --enable-encoder=jpeg2000 --enable-encoder=libmp3lame --enable-encoder=libopencore_amrnb --enable-encoder=libopenh264 --enable-encoder=libopenjpeg --enable-encoder=libx262 --enable-encoder=libx264 --enable-encoder=libx264rgb --enable-encoder=libx265 --enable-encoder=ljpeg --enable-encoder=mjpeg --enable-encoder=mpeg2_qsv --enable-encoder=mpeg2video --enable-encoder=mpeg4 --enable-encoder=movtext --enable-encoder=pcm_alaw --enable-encoder=pcm_alaw_at --enable-encoder=pcm_f32be --enable-encoder=pcm_f32le --enable-encoder=pcm_f64be --enable-encoder=pcm_f64le --enable-encoder=pcm_mulaw --enable-encoder=pcm_mulaw_at --enable-encoder=pcm_s16be --enable-encoder=pcm_s16be_planar --enable-encoder=pcm_s16le --enable-encoder=pcm_s16le_planar --enable-encoder=pcm_s24be --enable-encoder=pcm_s24daud --enable-encoder=pcm_s24le --enable-encoder=pcm_s24le_planar --enable-encoder=pcm_s32be --enable-encoder=pcm_s32le --enable-encoder=pcm_s32le_planar --enable-encoder=pcm_s64be --enable-encoder=pcm_s64le --enable-encoder=pcm_s8 --enable-encoder=pcm_s8_planar --enable-encoder=pcm_u16be --enable-encoder=pcm_u16le --enable-encoder=pcm_u24be --enable-encoder=pcm_u24le --enable-encoder=pcm_u32be --enable-encoder=pcm_u32le --enable-encoder=pcm_u8 --enable-encoder=png --enable-encoder=ppm --enable-encoder=srt --enable-encoder=ssa --enable-encoder=subrip --enable-encoder=webvtt --enable-encoder=wrapped_avframe --enable-decoder=aac --enable-decoder=aac_at --enable-decoder=aac_fixed --enable-decoder=aac_latm --enable-decoder=ac3 --enable-decoder=ac3_at --enable-decoder=ac3_fixed --enable-decoder=ac4 --enable-decoder=adpcm_ms --enable-decoder=apng --enable-decoder=ass --enable-decoder=av1 --enable-decoder=ccaption --enable-decoder=dca --enable-decoder=dvaudio --enable-decoder=dvvideo --enable-decoder=dvbsub --enable-decoder=dvdsub --enable-decoder=eac3 --enable-decoder=eac3_at --enable-decoder=flac --enable-decoder=h261 --enable-decoder=h263 --enable-decoder=h263_cuvid --enable-decoder=h263i --enable-decoder=h263p --enable-decoder=h264 --enable-decoder=h264_crystalhd --enable-decoder=h264_cuvid --enable-decoder=h264_mediacodec --enable-decoder=h264_mmal --enable-decoder=h264_qsv --enable-decoder=h264_vda --enable-decoder=h264_vdpau --enable-decoder=h264_v4l2m2m --enable-decoder=hevc --enable-decoder=hevc_cuvid --enable-decoder=hevc_mediacodec --enable-decoder=hevc_qsv --enable-decoder=jpeg2000 --enable-decoder=libdav1d --enable-decoder=libopenh264 --enable-decoder=mjpeg --enable-decoder=movtext --enable-decoder=mp1 --enable-decoder=mp1_at --enable-decoder=mp1float --enable-decoder=mp2 --enable-decoder=mp2_at --enable-decoder=mp2float --enable-decoder=mp3 --enable-decoder=mp3_at --enable-decoder=mp3adu --enable-decoder=mp3adufloat --enable-decoder=mp3float --enable-decoder=mp3on4 --enable-decoder=mp3on4float --enable-decoder=mpeg1_cuvid --enable-decoder=mpeg1_vdpau --enable-decoder=mpeg1video --enable-decoder=mpeg2_crystalhd --enable-decoder=mpeg2_cuvid --enable-decoder=mpeg2_mmal --enable-decoder=mpeg2_qsv --enable-decoder=mpeg2_v4l2m2m --enable-decoder=mpeg2video --enable-decoder=mpeg4 --enable-decoder=mpeg4_crystalhd --enable-decoder=mpeg4_cuvid --enable-decoder=mpeg4_mediacodec --enable-decoder=mpeg4_mmal --enable-decoder=mpeg4_vdpau --enable-decoder=mpeg_vdpau --enable-decoder=mpeg_xvmc --enable-decoder=mpegvideo --enable-decoder=msmpeg4v2 --enable-decoder=msmpeg4v3 --enable-decoder=opus --enable-decoder=pcm_alaw --enable-decoder=pcm_alaw_at --enable-decoder=pcm_bluray --enable-decoder=pcm_dvd --enable-decoder=pcm_f32be --enable-decoder=pcm_f32le --enable-decoder=pcm_f64be --enable-decoder=pcm_f64le --enable-decoder=pcm_lxf --enable-decoder=pcm_mulaw --enable-decoder=pcm_mulaw_at --enable-decoder=pcm_s16be --enable-decoder=pcm_s16be_planar --enable-decoder=pcm_s16le --enable-decoder=pcm_s16le_planar --enable-decoder=pcm_s24be --enable-decoder=pcm_s24daud --enable-decoder=pcm_s24le --enable-decoder=pcm_s24le_planar --enable-decoder=pcm_s32be --enable-decoder=pcm_s32le --enable-decoder=pcm_s32le_planar --enable-decoder=pcm_s64be --enable-decoder=pcm_s64le --enable-decoder=pcm_s8 --enable-decoder=pcm_s8_planar --enable-decoder=pcm_u16be --enable-decoder=pcm_u16le --enable-decoder=pcm_u24be --enable-decoder=pcm_u24le --enable-decoder=pcm_u32be --enable-decoder=pcm_u32le --enable-decoder=pcm_u8 --enable-decoder=pcm_zork --enable-decoder=pgssub --enable-decoder=png --enable-decoder=qdm2 --enable-decoder=rawvideo --enable-decoder=srt --enable-decoder=ssa --enable-decoder=stl --enable-decoder=subrip --enable-decoder=teletextsub --enable-decoder=truehd --enable-decoder=vc1 --enable-decoder=vorbis --enable-decoder=vp9 --enable-decoder=webvtt --enable-decoder=wmalossless --enable-decoder=wmapro --enable-decoder=wmav1 --enable-decoder=wmav2 --enable-decoder=wmavoice --enable-decoder=wmv1 --enable-decoder=wmv2 --enable-decoder=wmv3 --enable-decoder=wrapped_avframe --enable-muxer=ac3 --enable-muxer=adts --enable-muxer=ass --enable-muxer=chromaprint --enable-muxer=data --enable-muxer=ffmetadata --enable-muxer=flac --enable-muxer=h261 --enable-muxer=h263 --enable-muxer=h264 --enable-muxer=hevc --enable-muxer=hls --enable-muxer=image2 --enable-muxer=image2pipe --enable-muxer=ipod --enable-muxer=m4v --enable-muxer=matroska --enable-muxer=matroska_audio --enable-muxer=mov --enable-muxer=mp3 --enable-muxer=mp4 --enable-muxer=mpeg1system --enable-muxer=mpeg1vcd --enable-muxer=mpeg1video --enable-muxer=mpeg2dvd --enable-muxer=mpeg2svcd --enable-muxer=mpeg2video --enable-muxer=mpeg2vob --enable-muxer=mpegts --enable-muxer=mpegtsraw --enable-muxer=null --enable-muxer=nut --enable-muxer=pcm_alaw --enable-muxer=pcm_f32be --enable-muxer=pcm_f32le --enable-muxer=pcm_f64be --enable-muxer=pcm_f64le --enable-muxer=pcm_mulaw --enable-muxer=pcm_s16be --enable-muxer=pcm_s16le --enable-muxer=pcm_s24be --enable-muxer=pcm_s24le --enable-muxer=pcm_s32be --enable-muxer=pcm_s32le --enable-muxer=pcm_s8 --enable-muxer=pcm_u16be --enable-muxer=pcm_u16le --enable-muxer=pcm_u24be --enable-muxer=pcm_u24le --enable-muxer=pcm_u32be --enable-muxer=pcm_u32le --enable-muxer=pcm_u8 --enable-muxer=rtp --enable-muxer=rtp_mpegts --enable-muxer=rtsp --enable-muxer=segment --enable-muxer=singlejpeg --enable-muxer=smjpeg --enable-muxer=spdif --enable-muxer=srt --enable-muxer=stream_segment --enable-muxer=wav --enable-muxer=webvtt --enable-demuxer=aac --enable-demuxer=ac3 --enable-demuxer=asf --enable-demuxer=asf_o --enable-demuxer=ass --enable-demuxer=av1 --enable-demuxer=avi --enable-demuxer=concat --enable-demuxer=dvbsub --enable-demuxer=dvbtxt --enable-demuxer=dts --enable-demuxer=dtshd --enable-demuxer=eac3 --enable-demuxer=ffmetadata --enable-demuxer=flac --enable-demuxer=gif --enable-demuxer=h261 --enable-demuxer=h263 --enable-demuxer=h264 --enable-demuxer=hevc --enable-demuxer=hls --enable-demuxer=image2 --enable-demuxer=image2_alias_pix --enable-demuxer=image2_brender_pix --enable-demuxer=image2pipe --enable-demuxer=image_bmp_pipe --enable-demuxer=image_dds_pipe --enable-demuxer=image_dpx_pipe --enable-demuxer=image_exr_pipe --enable-demuxer=image_j2k_pipe --enable-demuxer=image_jpeg_pipe --enable-demuxer=image_jpegls_pipe --enable-demuxer=image_pam_pipe --enable-demuxer=image_pbm_pipe --enable-demuxer=image_pcx_pipe --enable-demuxer=image_pgm_pipe --enable-demuxer=image_pgmyuv_pipe --enable-demuxer=image_pictor_pipe --enable-demuxer=image_png_pipe --enable-demuxer=image_ppm_pipe --enable-demuxer=image_qdraw_pipe --enable-demuxer=image_sgi_pipe --enable-demuxer=image_sunrast_pipe --enable-demuxer=image_tiff_pipe --enable-demuxer=image_webp_pipe --enable-demuxer=loas --enable-demuxer=m4v --enable-demuxer=matroska --enable-demuxer=mjpeg --enable-demuxer=mov --enable-demuxer=mp3 --enable-demuxer=mpegps --enable-demuxer=mpegts --enable-demuxer=mpegtsraw --enable-demuxer=mpegvideo --enable-demuxer=nut --enable-demuxer=pcm_alaw --enable-demuxer=pcm_f32be --enable-demuxer=pcm_f32le --enable-demuxer=pcm_f64be --enable-demuxer=pcm_f64le --enable-demuxer=pcm_mulaw --enable-demuxer=pcm_s16be --enable-demuxer=pcm_s16le --enable-demuxer=pcm_s24be --enable-demuxer=pcm_s24le --enable-demuxer=pcm_s32be --enable-demuxer=pcm_s32le --enable-demuxer=pcm_s8 --enable-demuxer=pcm_u16be --enable-demuxer=pcm_u16le --enable-demuxer=pcm_u24be --enable-demuxer=pcm_u24le --enable-demuxer=pcm_u32be --enable-demuxer=pcm_u32le --enable-demuxer=pcm_u8 --enable-demuxer=rtp --enable-demuxer=rtsp --enable-demuxer=spdif --enable-demuxer=srt --enable-demuxer=truehd --enable-demuxer=vc1 --enable-demuxer=wav --enable-demuxer=wtv --enable-demuxer=xwma --enable-protocol=cache --enable-protocol=concat --enable-protocol=fd --enable-protocol=file --enable-protocol=hls --enable-protocol=http --enable-protocol=httpproxy --enable-protocol=https --enable-protocol=icecast --enable-protocol=librtmp --enable-protocol=librtmpe --enable-protocol=librtmps --enable-protocol=librtmpt --enable-protocol=librtmpte --enable-protocol=libsmbclient --enable-protocol=libssh --enable-protocol=md5 --enable-protocol=mmsh --enable-protocol=mmst --enable-protocol=pipe --enable-protocol=rtmp --enable-protocol=rtmpe --enable-protocol=rtmps --enable-protocol=rtmpt --enable-protocol=rtmpte --enable-protocol=rtmpts --enable-protocol=rtp --enable-protocol=srtp --enable-protocol=subfile --enable-protocol=tcp --enable-protocol=tee --enable-protocol=tls_gnutls --enable-protocol=tls_openssl --enable-protocol=tls_schannel --enable-protocol=tls_securetransport --enable-protocol=udp --enable-protocol=udplite --enable-protocol=unix --enable-filter=afade --enable-filter=ametadata --enable-filter=amovie --enable-filter=anullsink --enable-filter=anullsrc --enable-filter=apad --enable-filter=aresample --enable-filter=asetpts --enable-filter=asplit --enable-filter=astreamselect --enable-filter=avgblur --enable-filter=bbox --enable-filter=blackdetect --enable-filter=blackframe --enable-filter=bwdif --enable-filter=color --enable-filter=colormatrix --enable-filter=colorspace --enable-filter=colorspace_coda --enable-filter=compand --enable-filter=concat --enable-filter=copy --enable-filter=crop --enable-filter=cropdetect --enable-filter=deband --enable-filter=deinterlace_metal --enable-filter=deinterlace_vaapi --enable-filter=drawbox --enable-filter=ebur128 --enable-filter=edgedetect --enable-filter=equalizer --enable-filter=fastdeint --enable-filter=find_rect --enable-filter=floodfill --enable-filter=format --enable-filter=fps --enable-filter=framestep --enable-filter=freezedetect --enable-filter=gblur --enable-filter=hwdownload --enable-filter=hwupload --enable-filter=hwupload_cuda --enable-filter=iccdetect --enable-filter=iccgen --enable-filter=median --enable-filter=metadata --enable-filter=movie --enable-filter=negate --enable-filter=nullsink --enable-filter=nullsrc --enable-filter=overlay --enable-filter=pan --enable-filter=psnr --enable-filter=resample --enable-filter=reverse --enable-filter=rotate --enable-filter=scale --enable-filter=scale2ref --enable-filter=scale_cuda --enable-filter=scale_npp --enable-filter=scale_vaapi --enable-filter=scale_v4l2m2m --enable-filter=scale_videotoolbox --enable-filter=scdet --enable-filter=select --enable-filter=setfield --enable-filter=setpts --enable-filter=showinfo --enable-filter=showspectrum --enable-filter=showspectrumpic --enable-filter=signalstats --enable-filter=silencedetect --enable-filter=smooth --enable-filter=smptebars --enable-filter=smptehdbars --enable-filter=split --enable-filter=ssim --enable-filter=streamselect --enable-filter=testsrc --enable-filter=thumbnail --enable-filter=thumbnail_cuda --enable-filter=tinterlace --enable-filter=tonemap --enable-filter=tonemap_cuda --enable-filter=tonemap_opencl --enable-filter=tonemap_vaapi --enable-filter=transpose_npp --enable-filter=transpose_opencl --enable-filter=transpose_vaapi --enable-filter=transpose_videotoolbox --enable-filter=trim --enable-filter=unsharp --enable-filter=vflip --enable-filter=volume --enable-filter=volumedetect --enable-filter=w3fdif --enable-filter=yadif --enable-filter=yadif_cuda --enable-filter=zoompan --enable-filter=zscale --enable-parser=aac --enable-parser=aac_latm --enable-parser=ac3 --enable-parser=av1 --enable-parser=dvaudio --enable-parser=dvbsub --enable-parser=flac --enable-parser=h261 --enable-parser=h263 --enable-parser=h264 --enable-parser=hevc --enable-parser=mpeg4video --enable-parser=mpegaudio --enable-parser=mpegvideo --enable-parser=opus --enable-parser=png --enable-parser=vorbis --enable-gpl --enable-libx264 --nvcc=/usr/bin/clang-9 --enable-encoder=h264_amf --enable-encoder=hevc_amf --enable-alsa
libavutil      58.  2.100 / 58.  2.100
libavcodec     60.  3.100 / 60.  3.100
libavformat    60.  3.100 / 60.  3.100
libavdevice    60.  1.100 / 60.  1.100
libavfilter     9.  3.100 /  9.  3.100
libswscale      7.  1.100 /  7.  1.100
libswresample   4. 10.100 /  4. 10.100
libpostproc    57.  1.100 / 57.  1.100
# 

what are your docker volume mappings?
Are you using docker commandline or compose?

Weird.
I was using my @bnhf debian version of the Channels DVR docker and it worked.
Screenshot 2025-12-07 at 09-46-38 Channels Settings
Using the regular Channels DVR tve version (Linux Alpine), it doesn't work.
Screenshot 2025-12-07 at 09-46-52 Channels Settings

# pwd
/channels-dvr/2025.11.26.2338
# ls -l
total 341296
-rwxr-xr-x    1 root     root      90138552 Nov 27 09:46 channels-dvr
-rwxr-xr-x    1 root     root      17928088 Nov 27 09:46 comskip
-rwxr-xr-x    1 root     root     147207832 Nov 27 09:46 ffmpeg
-rwxr-xr-x    1 root     root      72765378 Nov 27 09:46 ffmpeg-dl
-rwxr-xr-x    1 root     root      21416600 Nov 27 09:46 ffprobe
-rwxr-xr-x    1 root     root           376 Nov 27 09:46 linux-x86_64.sha256
-rwxr-xr-x    1 root     root            15 Nov 27 09:46 prerelease
-rwxr-xr-x    1 root     root            15 Nov 27 09:46 version
# ./ffmpeg-dl -version
sh: ./ffmpeg-dl: not found

But ffmpeg works

# ./ffmpeg -version
ffmpeg version 6.0.2 Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 6.5.0 (Ubuntu 6.5.0-2ubuntu1~14.04.1) 20181026
configuration: --prefix=/home/vagrant/channels-server/ext/dst/linux-x86_64 --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --enable-pic --disable-shared --enable-static --disable-sdl2 --disable-stripping --disable-lzma --disable-xlib --disable-libvpx --disable-indev=dv1394 --disable-hwaccel=vc1_qsv --enable-gray --enable-libmp3lame --extra-cflags=-I/home/vagrant/channels-server/ext/dst/linux-x86_64/include --extra-ldflags=-L/home/vagrant/channels-server/ext/dst/linux-x86_64/lib --enable-libdav1d --extra-libs=-static --extra-cflags=--static --pkg-config-flags=--static --disable-iconv --disable-nvenc --disable-amf --enable-vaapi --enable-nvenc --enable-amf --cc=gcc-6 --enable-chromaprint --disable-encoders --disable-decoders --disable-muxers --disable-demuxers --disable-protocols --disable-filters --disable-parsers --enable-encoder=aac --enable-encoder=aac_at --enable-encoder=ac3 --enable-encoder=ac3_fixed --enable-encoder=apng --enable-encoder=bmp --enable-encoder=flac --enable-encoder=h264_nvenc --enable-encoder=h264_nvmpi --enable-encoder=h264_omx --enable-encoder=h264_qsv --enable-encoder=h264_vaapi --enable-encoder=h264_videotoolbox --enable-encoder=h264_v4l2m2m --enable-encoder=hevc_nvenc --enable-encoder=hevc_qsv --enable-encoder=hevc_nvmpi --enable-encoder=hevc_vaapi --enable-encoder=hevc_v4l2m2m --enable-encoder=hevc_videotoolbox --enable-encoder=jpeg2000 --enable-encoder=libmp3lame --enable-encoder=libopencore_amrnb --enable-encoder=libopenh264 --enable-encoder=libopenjpeg --enable-encoder=libx262 --enable-encoder=libx264 --enable-encoder=libx264rgb --enable-encoder=libx265 --enable-encoder=ljpeg --enable-encoder=mjpeg --enable-encoder=mpeg2_qsv --enable-encoder=mpeg2video --enable-encoder=mpeg4 --enable-encoder=movtext --enable-encoder=pcm_alaw --enable-encoder=pcm_alaw_at --enable-encoder=pcm_f32be --enable-encoder=pcm_f32le --enable-encoder=pcm_f64be --enable-encoder=pcm_f64le --enable-encoder=pcm_mulaw --enable-encoder=pcm_mulaw_at --enable-encoder=pcm_s16be --enable-encoder=pcm_s16be_planar --enable-encoder=pcm_s16le --enable-encoder=pcm_s16le_planar --enable-encoder=pcm_s24be --enable-encoder=pcm_s24daud --enable-encoder=pcm_s24le --enable-encoder=pcm_s24le_planar --enable-encoder=pcm_s32be --enable-encoder=pcm_s32le --enable-encoder=pcm_s32le_planar --enable-encoder=pcm_s64be --enable-encoder=pcm_s64le --enable-encoder=pcm_s8 --enable-encoder=pcm_s8_planar --enable-encoder=pcm_u16be --enable-encoder=pcm_u16le --enable-encoder=pcm_u24be --enable-encoder=pcm_u24le --enable-encoder=pcm_u32be --enable-encoder=pcm_u32le --enable-encoder=pcm_u8 --enable-encoder=png --enable-encoder=ppm --enable-encoder=srt --enable-encoder=ssa --enable-encoder=subrip --enable-encoder=webvtt --enable-encoder=wrapped_avframe --enable-decoder=aac --enable-decoder=aac_at --enable-decoder=aac_fixed --enable-decoder=aac_latm --enable-decoder=ac3 --enable-decoder=ac3_at --enable-decoder=ac3_fixed --enable-decoder=ac4 --enable-decoder=adpcm_ms --enable-decoder=apng --enable-decoder=ass --enable-decoder=av1 --enable-decoder=ccaption --enable-decoder=dca --enable-decoder=dvaudio --enable-decoder=dvvideo --enable-decoder=dvbsub --enable-decoder=dvdsub --enable-decoder=eac3 --enable-decoder=eac3_at --enable-decoder=flac --enable-decoder=h261 --enable-decoder=h263 --enable-decoder=h263_cuvid --enable-decoder=h263i --enable-decoder=h263p --enable-decoder=h264 --enable-decoder=h264_crystalhd --enable-decoder=h264_cuvid --enable-decoder=h264_mediacodec --enable-decoder=h264_mmal --enable-decoder=h264_qsv --enable-decoder=h264_vda --enable-decoder=h264_vdpau --enable-decoder=h264_v4l2m2m --enable-decoder=hevc --enable-decoder=hevc_cuvid --enable-decoder=hevc_mediacodec --enable-decoder=hevc_qsv --enable-decoder=jpeg2000 --enable-decoder=libdav1d --enable-decoder=libopenh264 --enable-decoder=mjpeg --enable-decoder=movtext --enable-decoder=mp1 --enable-decoder=mp1_at --enable-decoder=mp1float --enable-decoder=mp2 --enable-decoder=mp2_at --enable-decoder=mp2float --enable-decoder=mp3 --enable-decoder=mp3_at --enable-decoder=mp3adu --enable-decoder=mp3adufloat --enable-decoder=mp3float --enable-decoder=mp3on4 --enable-decoder=mp3on4float --enable-decoder=mpeg1_cuvid --enable-decoder=mpeg1_vdpau --enable-decoder=mpeg1video --enable-decoder=mpeg2_crystalhd --enable-decoder=mpeg2_cuvid --enable-decoder=mpeg2_mmal --enable-decoder=mpeg2_qsv --enable-decoder=mpeg2_v4l2m2m --enable-decoder=mpeg2video --enable-decoder=mpeg4 --enable-decoder=mpeg4_crystalhd --enable-decoder=mpeg4_cuvid --enable-decoder=mpeg4_mediacodec --enable-decoder=mpeg4_mmal --enable-decoder=mpeg4_vdpau --enable-decoder=mpeg_vdpau --enable-decoder=mpeg_xvmc --enable-decoder=mpegvideo --enable-decoder=msmpeg4v2 --enable-decoder=msmpeg4v3 --enable-decoder=opus --enable-decoder=pcm_alaw --enable-decoder=pcm_alaw_at --enable-decoder=pcm_bluray --enable-decoder=pcm_dvd --enable-decoder=pcm_f32be --enable-decoder=pcm_f32le --enable-decoder=pcm_f64be --enable-decoder=pcm_f64le --enable-decoder=pcm_lxf --enable-decoder=pcm_mulaw --enable-decoder=pcm_mulaw_at --enable-decoder=pcm_s16be --enable-decoder=pcm_s16be_planar --enable-decoder=pcm_s16le --enable-decoder=pcm_s16le_planar --enable-decoder=pcm_s24be --enable-decoder=pcm_s24daud --enable-decoder=pcm_s24le --enable-decoder=pcm_s24le_planar --enable-decoder=pcm_s32be --enable-decoder=pcm_s32le --enable-decoder=pcm_s32le_planar --enable-decoder=pcm_s64be --enable-decoder=pcm_s64le --enable-decoder=pcm_s8 --enable-decoder=pcm_s8_planar --enable-decoder=pcm_u16be --enable-decoder=pcm_u16le --enable-decoder=pcm_u24be --enable-decoder=pcm_u24le --enable-decoder=pcm_u32be --enable-decoder=pcm_u32le --enable-decoder=pcm_u8 --enable-decoder=pcm_zork --enable-decoder=pgssub --enable-decoder=png --enable-decoder=qdm2 --enable-decoder=rawvideo --enable-decoder=srt --enable-decoder=ssa --enable-decoder=stl --enable-decoder=subrip --enable-decoder=teletextsub --enable-decoder=truehd --enable-decoder=vc1 --enable-decoder=vorbis --enable-decoder=vp9 --enable-decoder=webvtt --enable-decoder=wmalossless --enable-decoder=wmapro --enable-decoder=wmav1 --enable-decoder=wmav2 --enable-decoder=wmavoice --enable-decoder=wmv1 --enable-decoder=wmv2 --enable-decoder=wmv3 --enable-decoder=wrapped_avframe --enable-muxer=ac3 --enable-muxer=adts --enable-muxer=ass --enable-muxer=chromaprint --enable-muxer=data --enable-muxer=ffmetadata --enable-muxer=flac --enable-muxer=h261 --enable-muxer=h263 --enable-muxer=h264 --enable-muxer=hevc --enable-muxer=hls --enable-muxer=image2 --enable-muxer=image2pipe --enable-muxer=ipod --enable-muxer=m4v --enable-muxer=matroska --enable-muxer=matroska_audio --enable-muxer=mov --enable-muxer=mp3 --enable-muxer=mp4 --enable-muxer=mpeg1system --enable-muxer=mpeg1vcd --enable-muxer=mpeg1video --enable-muxer=mpeg2dvd --enable-muxer=mpeg2svcd --enable-muxer=mpeg2video --enable-muxer=mpeg2vob --enable-muxer=mpegts --enable-muxer=mpegtsraw --enable-muxer=null --enable-muxer=nut --enable-muxer=pcm_alaw --enable-muxer=pcm_f32be --enable-muxer=pcm_f32le --enable-muxer=pcm_f64be --enable-muxer=pcm_f64le --enable-muxer=pcm_mulaw --enable-muxer=pcm_s16be --enable-muxer=pcm_s16le --enable-muxer=pcm_s24be --enable-muxer=pcm_s24le --enable-muxer=pcm_s32be --enable-muxer=pcm_s32le --enable-muxer=pcm_s8 --enable-muxer=pcm_u16be --enable-muxer=pcm_u16le --enable-muxer=pcm_u24be --enable-muxer=pcm_u24le --enable-muxer=pcm_u32be --enable-muxer=pcm_u32le --enable-muxer=pcm_u8 --enable-muxer=rtp --enable-muxer=rtp_mpegts --enable-muxer=rtsp --enable-muxer=segment --enable-muxer=singlejpeg --enable-muxer=smjpeg --enable-muxer=spdif --enable-muxer=srt --enable-muxer=stream_segment --enable-muxer=wav --enable-muxer=webvtt --enable-demuxer=aac --enable-demuxer=ac3 --enable-demuxer=asf --enable-demuxer=asf_o --enable-demuxer=ass --enable-demuxer=av1 --enable-demuxer=avi --enable-demuxer=concat --enable-demuxer=dvbsub --enable-demuxer=dvbtxt --enable-demuxer=dts --enable-demuxer=dtshd --enable-demuxer=eac3 --enable-demuxer=ffmetadata --enable-demuxer=flac --enable-demuxer=gif --enable-demuxer=h261 --enable-demuxer=h263 --enable-demuxer=h264 --enable-demuxer=hevc --enable-demuxer=hls --enable-demuxer=image2 --enable-demuxer=image2_alias_pix --enable-demuxer=image2_brender_pix --enable-demuxer=image2pipe --enable-demuxer=image_bmp_pipe --enable-demuxer=image_dds_pipe --enable-demuxer=image_dpx_pipe --enable-demuxer=image_exr_pipe --enable-demuxer=image_j2k_pipe --enable-demuxer=image_jpeg_pipe --enable-demuxer=image_jpegls_pipe --enable-demuxer=image_pam_pipe --enable-demuxer=image_pbm_pipe --enable-demuxer=image_pcx_pipe --enable-demuxer=image_pgm_pipe --enable-demuxer=image_pgmyuv_pipe --enable-demuxer=image_pictor_pipe --enable-demuxer=image_png_pipe --enable-demuxer=image_ppm_pipe --enable-demuxer=image_qdraw_pipe --enable-demuxer=image_sgi_pipe --enable-demuxer=image_sunrast_pipe --enable-demuxer=image_tiff_pipe --enable-demuxer=image_webp_pipe --enable-demuxer=loas --enable-demuxer=m4v --enable-demuxer=matroska --enable-demuxer=mjpeg --enable-demuxer=mov --enable-demuxer=mp3 --enable-demuxer=mpegps --enable-demuxer=mpegts --enable-demuxer=mpegtsraw --enable-demuxer=mpegvideo --enable-demuxer=nut --enable-demuxer=pcm_alaw --enable-demuxer=pcm_f32be --enable-demuxer=pcm_f32le --enable-demuxer=pcm_f64be --enable-demuxer=pcm_f64le --enable-demuxer=pcm_mulaw --enable-demuxer=pcm_s16be --enable-demuxer=pcm_s16le --enable-demuxer=pcm_s24be --enable-demuxer=pcm_s24le --enable-demuxer=pcm_s32be --enable-demuxer=pcm_s32le --enable-demuxer=pcm_s8 --enable-demuxer=pcm_u16be --enable-demuxer=pcm_u16le --enable-demuxer=pcm_u24be --enable-demuxer=pcm_u24le --enable-demuxer=pcm_u32be --enable-demuxer=pcm_u32le --enable-demuxer=pcm_u8 --enable-demuxer=rtp --enable-demuxer=rtsp --enable-demuxer=spdif --enable-demuxer=srt --enable-demuxer=truehd --enable-demuxer=vc1 --enable-demuxer=wav --enable-demuxer=wtv --enable-demuxer=xwma --enable-protocol=cache --enable-protocol=concat --enable-protocol=fd --enable-protocol=file --enable-protocol=hls --enable-protocol=http --enable-protocol=httpproxy --enable-protocol=https --enable-protocol=icecast --enable-protocol=librtmp --enable-protocol=librtmpe --enable-protocol=librtmps --enable-protocol=librtmpt --enable-protocol=librtmpte --enable-protocol=libsmbclient --enable-protocol=libssh --enable-protocol=md5 --enable-protocol=mmsh --enable-protocol=mmst --enable-protocol=pipe --enable-protocol=rtmp --enable-protocol=rtmpe --enable-protocol=rtmps --enable-protocol=rtmpt --enable-protocol=rtmpte --enable-protocol=rtmpts --enable-protocol=rtp --enable-protocol=srtp --enable-protocol=subfile --enable-protocol=tcp --enable-protocol=tee --enable-protocol=tls_gnutls --enable-protocol=tls_openssl --enable-protocol=tls_schannel --enable-protocol=tls_securetransport --enable-protocol=udp --enable-protocol=udplite --enable-protocol=unix --enable-filter=afade --enable-filter=ametadata --enable-filter=amovie --enable-filter=anullsink --enable-filter=anullsrc --enable-filter=apad --enable-filter=aresample --enable-filter=asetpts --enable-filter=asplit --enable-filter=astreamselect --enable-filter=avgblur --enable-filter=bbox --enable-filter=blackdetect --enable-filter=blackframe --enable-filter=bwdif --enable-filter=color --enable-filter=colormatrix --enable-filter=colorspace --enable-filter=colorspace_coda --enable-filter=compand --enable-filter=concat --enable-filter=copy --enable-filter=crop --enable-filter=cropdetect --enable-filter=deband --enable-filter=deinterlace_metal --enable-filter=deinterlace_vaapi --enable-filter=drawbox --enable-filter=ebur128 --enable-filter=edgedetect --enable-filter=equalizer --enable-filter=fastdeint --enable-filter=find_rect --enable-filter=floodfill --enable-filter=format --enable-filter=fps --enable-filter=framestep --enable-filter=freezedetect --enable-filter=gblur --enable-filter=hwdownload --enable-filter=hwupload --enable-filter=hwupload_cuda --enable-filter=iccdetect --enable-filter=iccgen --enable-filter=median --enable-filter=metadata --enable-filter=movie --enable-filter=negate --enable-filter=nullsink --enable-filter=nullsrc --enable-filter=overlay --enable-filter=pan --enable-filter=psnr --enable-filter=resample --enable-filter=reverse --enable-filter=rotate --enable-filter=scale --enable-filter=scale2ref --enable-filter=scale_cuda --enable-filter=scale_npp --enable-filter=scale_vaapi --enable-filter=scale_v4l2m2m --enable-filter=scale_videotoolbox --enable-filter=scdet --enable-filter=select --enable-filter=setfield --enable-filter=setpts --enable-filter=showinfo --enable-filter=showspectrum --enable-filter=showspectrumpic --enable-filter=signalstats --enable-filter=silencedetect --enable-filter=smooth --enable-filter=smptebars --enable-filter=smptehdbars --enable-filter=split --enable-filter=ssim --enable-filter=streamselect --enable-filter=testsrc --enable-filter=thumbnail --enable-filter=thumbnail_cuda --enable-filter=tinterlace --enable-filter=tonemap --enable-filter=tonemap_cuda --enable-filter=tonemap_opencl --enable-filter=tonemap_vaapi --enable-filter=transpose_npp --enable-filter=transpose_opencl --enable-filter=transpose_vaapi --enable-filter=transpose_videotoolbox --enable-filter=trim --enable-filter=unsharp --enable-filter=vflip --enable-filter=volume --enable-filter=volumedetect --enable-filter=w3fdif --enable-filter=yadif --enable-filter=yadif_cuda --enable-filter=zoompan --enable-filter=zscale --enable-parser=aac --enable-parser=aac_latm --enable-parser=ac3 --enable-parser=av1 --enable-parser=dvaudio --enable-parser=dvbsub --enable-parser=flac --enable-parser=h261 --enable-parser=h263 --enable-parser=h264 --enable-parser=hevc --enable-parser=mpeg4video --enable-parser=mpegaudio --enable-parser=mpegvideo --enable-parser=opus --enable-parser=png --enable-parser=vorbis --enable-gpl --enable-libx264 --nvcc=/usr/bin/clang-9 --enable-encoder=h264_amf --enable-encoder=hevc_amf --enable-alsa
libavutil      58.  2.100 / 58.  2.100
libavcodec     60.  3.100 / 60.  3.100
libavformat    60.  3.100 / 60.  3.100
libavdevice    60.  1.100 / 60.  1.100
libavfilter     9.  3.100 /  9.  3.100
libswscale      7.  1.100 /  7.  1.100
libswresample   4. 10.100 /  4. 10.100
libpostproc    57.  1.100 / 57.  1.100

OK I think I've found the reason why the downloaded ffmpeg-dl is showing as 'not found' in the official Docker image and some of the following I understand ...

Essentially the problem is that the ffmpeg-dl binary is linked against glibc, but the Alpine base image is using musl which creates an incompatibility and the error is for some reason 'not found'. Other distros like Debian use glibc by default, hence it executing.

To resolve, either the binary needs to be relinked against MUSL for use in Alpine, he base image needs to change, or a libc compatibility layer needs to be added.

To prove the latter (but not really resolve), we can run apk add gcompat in the container and then when running ./ffmpeg again it will now actually try but show a new error. The new error is then that two C libraries are missing ...

So now run apk add libstdc++ libgcc and run ./ffmpeg again and it will execute, both on the command line and in the server /admin/settings/advanced.

It looks like it is working now, but I don't think this is complete, as checking the binary and some symbols are still not found:

/channels-dvr/2025.10.30.0047 # ldd ./ffmpeg-dl 
        /lib64/ld-linux-x86-64.so.2 (0x7f5b1ac02000)
        libm.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f5b1ac02000)
        libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7f5b1ac02000)
        librt.so.1 => /lib64/ld-linux-x86-64.so.2 (0x7f5b1ac02000)
        libdl.so.2 => /lib64/ld-linux-x86-64.so.2 (0x7f5b1ac02000)
        libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x7f5b1a951000)
        libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x7f5b1a925000)
        libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f5b1ac02000)
Error relocating ./ffmpeg-dl: __printf_chk: symbol not found
Error relocating ./ffmpeg-dl: __pow_finite: symbol not found
Error relocating ./ffmpeg-dl: __strdup: symbol not found
Error relocating ./ffmpeg-dl: __open64_2: symbol not found
Error relocating ./ffmpeg-dl: __finitef: symbol not found
Error relocating ./ffmpeg-dl: __vfprintf_chk: symbol not found
Error relocating ./ffmpeg-dl: __open_2: symbol not found
Error relocating ./ffmpeg-dl: __log10_finite: symbol not found
Error relocating ./ffmpeg-dl: __strncpy_chk: symbol not found
Error relocating ./ffmpeg-dl: __sprintf_chk: symbol not found
Error relocating ./ffmpeg-dl: __snprintf_chk: symbol not found
Error relocating ./ffmpeg-dl: __log_finite: symbol not found
Error relocating ./ffmpeg-dl: __vsnprintf_chk: symbol not found
Error relocating ./ffmpeg-dl: __exp_finite: symbol not found
Error relocating ./ffmpeg-dl: __strcpy_chk: symbol not found
Error relocating ./ffmpeg-dl: __strcat_chk: symbol not found
Error relocating ./ffmpeg-dl: __log2_finite: symbol not found
Error relocating ./ffmpeg-dl: __asprintf_chk: symbol not found
Error relocating ./ffmpeg-dl: __log2f_finite: symbol not found
Error relocating ./ffmpeg-dl: __isnan: symbol not found
Error relocating ./ffmpeg-dl: __memset_chk: symbol not found
Error relocating ./ffmpeg-dl: __finite: symbol not found
Error relocating ./ffmpeg-dl: __strndup: symbol not found
Error relocating ./ffmpeg-dl: __realpath_chk: symbol not found
Error relocating ./ffmpeg-dl: __fprintf_chk: symbol not found
Error relocating ./ffmpeg-dl: __memcpy_chk: symbol not found
Error relocating ./ffmpeg-dl: __vasprintf_chk: symbol not found
Error relocating ./ffmpeg-dl: __powf_finite: symbol not found
Error relocating ./ffmpeg-dl: __poll_chk: symbol not found
Error relocating ./ffmpeg-dl: __isinf: symbol not found

So, I don't know if it will actually fix the AMD encoding yet, but theres clearly a bug here, so I figure let's solve one problem at a time.

I actually recall it being like this ever since I started using Channels Docker on the Intel machine (i.e. that also said 'Not found'), but at that point it didn't matter as encoding was working so I didn't look deeper.

TBH this is getting a bit beyond my understanding, but clearly if the binary works on libc distributions and not on MUSL distributions then that is the error. But it's not clear why only ffmpeg-dl is affected.

@tmm1 I don't know how many people are running Channels in Docker but I think that this is an error for everyone using the official image. But within 'everyone' what is ffmpeg-dl used for as opposed to ffmpeg? Maybe that makes it such a small number it's why its not been picked up.

I wonder if a simple fix here would just be to switch the distro to e.g. debian:slim or similar. :man_shrugging:

1 Like

Just to prove the hypothesis, I recreated the official Docker build with Debian, by updating the Dockerfile to this:

FROM debian:trixie-slim
RUN apt-get update && \
    apt-get install -y --no-install-recommends curl tzdata tini && \
    rm -rf /var/lib/apt/lists/*
RUN mkdir -p /channels-dvr/data /data
COPY run.sh run.sh
VOLUME ["/channels-dvr"]
ENTRYPOINT ["/usr/bin/tini", "--"]
CMD ./run.sh

This does seem to run fine, and it does remove the errors in ffmpeg-dl without any other updates.

It doesn't actually fix the transcoding problem but we can come back to that once @tmm1 gives their opinion on whether/how this error might be fixed.

Yes Debian base prob makes more sense.

This hasn't been required because not many ppl using AMD. Most that do are on Windows.

What is the h264_amf diagnostic output now?

Unfortunately, it still doesn't work, but for different reasons.

h264_amf

[Parsed_testsrc_0 @ 0x14b218c0] size:1280x720 rate:60/1 duration:-1.000000 sar:1/1
Input #0, lavfi, from 'testsrc=size=1280x720:rate=60':
  Duration: N/A, start: 0.000000, bitrate: N/A
  Stream #0:0: Video: wrapped_avframe, 1 reference frame, rgb24, 1280x720 [SAR 1:1 DAR 16:9], 60 fps, 60 tbr, 60 tbn
Stream mapping:
  Stream #0:0 -> #0:0 (wrapped_avframe (native) -> h264 (h264_amf))
Press [q] to stop, [?] for help
[graph 0 input from stream 0:0 @ 0x14b282c0] w:1280 h:720 pixfmt:rgb24 tb:1/60 fr:60/1 sar:1/1
[auto_scale_0 @ 0x14b29e80] w:iw h:ih flags:'' interl:0
[format @ 0x14b28d80] auto-inserting filter 'auto_scale_0' between the filter 'Parsed_null_0' and the filter 'format'
[auto_scale_0 @ 0x14b29e80] w:1280 h:720 fmt:rgb24 sar:1/1 -> w:1280 h:720 fmt:yuv420p sar:1/1 flags:0x00000004
[h264_amf @ 0x14b25ac0] DLL libamfrt64.so.1 failed to open
[vost#0:0/h264_amf @ 0x14b253c0] Error initializing output stream: Error while opening encoder for output stream #0:0 - maybe incorrect parameters such as bit_rate, rate, width or height
Terminating demuxer thread 0
Conversion failed!
exit status 1

This error - DLL libamfrt64.so.1 failed to open suggests that the correct libraries are not installed, which makes sense given that nothing is actually installed inside the container relating to AMF.

I had a quick look around but my god the AMD documentation is confusing! On the one hand it suggests you need to install the ROCm libraries, but elsewhere it says thats only for compute, and elsewhere still it says thats not relevant to iGPU's.

Without Docker this is maybe working more often as whatever is needed will already be installed.

On the other hand, seeing as I had success with VAAPI just by using the mesa libraries, which I think would be supported across discrete and integrated AMD cards, that might be a better solution - but requires using a different ffmpeg to the one bundled.

I'm willing to put a bit of work in here to create a channels-dvr:amd Image like there appears to be an channels-dvr:nvidia image ... but what do you suggest? Or rather how likely is Channels to resolve this?

This is the SDK we build against: GitHub - GPUOpen-LibrariesAndSDKs/AMF: The Advanced Media Framework (AMF) SDK provides developers with optimal access to AMD devices for multimedia processing

On Windows it works automatically if you have AMD drivers installed.

On Linux its basically untested. I had planned to buy an AMD igpu beelink for further testing, but it hasn't been a priority yet.

(Perhaps vaapi is the better solution.. but its recommended to use our provided ffmpeg with the DVR because it has some compatibility changes. Unfortunately that ffmpeg is also currently hard coded to specific intel drivers.)

If we can get AMF working that would be ideal. We can publish an :amd image based on the learnings here.

I would start here: Driver Linux · GPUOpen-LibrariesAndSDKs/AMF Wiki · GitHub