Fedora already ships FFmpeg. It ships the build with the patent-encumbered encoders cut out, so ffmpeg -c:v libx264 fails on a stock install with “Unknown encoder”. The full build lives in RPM Fusion, and on Workstation it collides with the Fedora package that GNOME already pulled in.
This guide covers both builds: what ffmpeg-free can and cannot encode, how to install FFmpeg on Fedora from RPM Fusion on a server, how to swap it in on Workstation without breaking Nautilus, and the commands you will actually use once it is in place. It closes with an encoder benchmark on real film footage, with VMAF scores. If you want the whole desktop codec stack (GStreamer plugins, VA-API, OpenH264 for the browser), the RPM Fusion multimedia codecs guide handles that side. It was tested across Fedora 45 and Fedora 44 Workstation and minimal VMs in October 2026.
Which FFmpeg build does Fedora ship?
Fedora ships ffmpeg-free in its own repositories. It is the same FFmpeg source with H.264 and HEVC software encoders, and a handful of other non-free codecs, removed. RPM Fusion ships the unrestricted build as ffmpeg. Both normally track the same upstream release, so the version numbers match when the two repositories are in step, as they were during testing. The encoder list is the real difference:
| Item | ffmpeg-free (Fedora repos) | ffmpeg (RPM Fusion) |
|---|---|---|
| FFmpeg on Fedora 45 | 9.0.2 | 9.0.2 |
| FFmpeg on Fedora 44 | 8.1.3 | 8.1.3 |
| Encoders listed (F45 / F44) | 207 / 212 | 238 / 238 |
| libx264 (H.264) | No | Yes |
| libx265 (HEVC) | No | Yes |
| libvvenc (H.266/VVC) | No | Yes |
| libopenh264 (Cisco H.264) | Yes | Yes |
| libsvtav1, libaom, libvpx, libopus, libmp3lame | Yes | Yes |
| libfdk_aac | Yes (fdk-aac-free) | Yes |
| VA-API, NVENC, QSV encoders | Yes | Yes |
| Preinstalled on Workstation | Yes | No |
So the free build is not useless. It encodes AV1, VP9, Opus and MP3, and it can produce H.264 through Cisco’s OpenH264. What it cannot do is x264 or x265, which is what most scripts, tutorials and media servers ask for by name. That is the reason to switch.
Install ffmpeg-free from the Fedora repositories
On a minimal or server install nothing is there yet. The free build needs no extra repository:
sudo dnf -y install ffmpeg-free
Expect a large transaction on a headless box. On the Fedora 45 minimal VM it pulled 283 packages and 812 MiB, mostly codec and font libraries:
Transaction Summary:
Installing: 283 packages
Total size of inbound packages is 216 MiB. Need to download 216 MiB.
After this operation, 812 MiB extra will be used (install 812 MiB, remove 0 B).
H.264 through OpenH264 works, because current Fedora enables the fedora-cisco-openh264 repository by default and pulls the codec in as a dependency. If you disabled it at some point, sudo dnf config-manager setopt fedora-cisco-openh264.enabled=1 turns it back on. Ask for x264 instead and the free build refuses:
ffmpeg -hide_banner -y -v error -f lavfi -i testsrc2=size=1280x720:rate=30 -t 5 -c:v libx264 test-x264.mp4
This is the error people hit when a script hardcodes libx264 on stock Fedora:
[vost#0:0 @ 0x558061aa3f00] Unknown encoder 'libx264'
[vost#0:0 @ 0x558061aa3f00] Error selecting an encoder
Error opening output file test-x264.mp4.
Error opening output files: Encoder not found
If your workload is AV1, VP9 or Opus, stop here. For x264 and x265, enable RPM Fusion. On a fresh desktop it is usually the first repository people add, right after the system update in the Fedora 45 post-install checklist.
Enable RPM Fusion
Install both release packages in one command. The free repository carries ffmpeg, x264 and x265. Nonfree carries fdk-aac, which the full build pulled in on the clean Fedora 44 server:
sudo dnf -y install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
dnf warns that it skipped OpenPGP checks for the two local packages. That is normal for a dnf install of an RPM URL. The repository keys themselves are imported and checked on the first real install. Confirm the new repositories:
dnf repolist
Four RPM Fusion entries appear next to the Fedora ones:
repo id repo name
fedora Fedora 44 - x86_64
fedora-cisco-openh264 Fedora 44 openh264 (From Cisco) - x86_64
rpmfusion-free RPM Fusion for Fedora 44 - Free
rpmfusion-free-updates RPM Fusion for Fedora 44 - Free - Updates
rpmfusion-nonfree RPM Fusion for Fedora 44 - Nonfree
rpmfusion-nonfree-updates RPM Fusion for Fedora 44 - Nonfree - Updates
updates Fedora 44 - x86_64 - Updates
Install the full FFmpeg on a server or minimal install
Where ffmpeg-free is not installed, the full build installs directly with no conflict. The Fedora 44 test server had the free build removed and its orphans cleared first:
sudo dnf -y install ffmpeg
On the clean Fedora 44 VM the transaction came from rpmfusion-free-updates and pulled 273 packages:
Transaction Summary:
Installing: 273 packages
Total size of inbound packages is 207 MiB. Need to download 207 MiB.
After this operation, 824 MiB extra will be used (install 824 MiB, remove 0 B).
Already installed the free build on that server? Then you are in the Workstation situation below, and the same swap command applies.
Swap ffmpeg-free for ffmpeg on Workstation
Fedora Workstation ships ffmpeg-free and its *-free libraries by default. They are not there for the CLI. gstreamer1-plugin-libav and libheif-ffmpeg link against them, which is how GStreamer apps such as GNOME Videos, and the HEIF image loader, decode media:
dnf repoquery --installed --whatrequires libavcodec-free
Those are the packages that depend on the free libraries on a fresh Fedora 45 Workstation:
ffmpeg-free-0:9.0.2-2.fc45.x86_64
gstreamer1-plugin-libav-0:1.28.8-1.fc45.x86_64
libavdevice-free-0:9.0.2-2.fc45.x86_64
libavfilter-free-0:9.0.2-2.fc45.x86_64
libavformat-free-0:9.0.2-2.fc45.x86_64
libheif-ffmpeg-0:1.23.5-3.fc45.x86_64
A plain sudo dnf install ffmpeg on a Workstation fails, because both packages provide ffmpeg-free and conflict on it. This is the Fedora 44 Workstation run:
Failed to resolve the transaction:
Problem: problem with installed package
- installed package ffmpeg-free-8.1.3-1.fc44.x86_64 conflicts with ffmpeg-free provided by ffmpeg-8.0.1-6.fc44.x86_64 from rpmfusion-free
- package ffmpeg-8.0.1-6.fc44.x86_64 from rpmfusion-free conflicts with ffmpeg-free provided by ffmpeg-free-8.0.1-6.fc44.x86_64 from fedora
- package ffmpeg-8.0.1-6.fc44.x86_64 from rpmfusion-free conflicts with ffmpeg-free provided by ffmpeg-free-8.1.3-1.fc44.x86_64 from updates
- conflicting requests
- installed package ffmpeg-free-8.1.3-1.fc44.x86_64 conflicts with ffmpeg-free provided by ffmpeg-8.1.3-1.fc44.x86_64 from rpmfusion-free-updates
- package ffmpeg-8.1.3-1.fc44.x86_64 from rpmfusion-free-updates conflicts with ffmpeg-free provided by ffmpeg-free-8.0.1-6.fc44.x86_64 from fedora
- package ffmpeg-8.1.3-1.fc44.x86_64 from rpmfusion-free-updates conflicts with ffmpeg-free provided by ffmpeg-free-8.1.3-1.fc44.x86_64 from updates
You can try to add to command line:
--allowerasing to allow removing of installed packages to resolve problems
--skip-broken to skip uninstallable packages
The fix is one transaction that removes the free build and installs the full one, so nothing that depends on the libraries is ever left without them:
sudo dnf -y swap ffmpeg-free ffmpeg --allowerasing
Eight packages out, eight in. ffmpeg-libs provides the same sonames as the free libraries, so gstreamer1-plugin-libav stays installed and now decodes through the full build:

Check the result on Fedora 45. The GStreamer plugin is still there, and every -free library is gone:
rpm -qa | grep -E "^(ffmpeg|libav|libsw|gstreamer1-plugin-libav)" | sort
The RPM Fusion packages and the Fedora GStreamer plugin remain, plus two unrelated libraries the pattern happens to match:
ffmpeg-9.0.2-1.fc45.x86_64
ffmpeg-libs-9.0.2-1.fc45.x86_64
gstreamer1-plugin-libav-1.28.8-1.fc45.x86_64
libavc1394-0.5.4-28.fc45.x86_64
libavdevice-9.0.2-1.fc45.x86_64
libavif-1.3.0-7.fc45.x86_64
Do not try to get there by removing packages by hand. ffmpeg-libs sits under the file manager. A dry run of removing it on the swapped Fedora 44 Workstation wanted to take Nautilus and the GNOME Classic session with it:
sudo dnf remove --assumeno ffmpeg-libs
The dependent-package list is the part to read before you ever answer yes:
Removing:
ffmpeg-libs x86_64 0:8.1.3-1.fc44 rpmfusion-free-updates 23.3 MiB
Removing dependent packages:
ffmpeg x86_64 0:8.1.3-1.fc44 rpmfusion-free-updates 2.6 MiB
gnome-classic-session noarch 0:50.4-1.fc44 updates 8.9 KiB
gstreamer1-plugin-libav x86_64 0:1.28.8-1.fc44 updates 339.3 KiB
libheif-ffmpeg x86_64 0:1.23.5-3.fc44 updates 32.1 KiB
localsearch x86_64 0:3.11.2-1.fc44 updates 3.5 MiB
nautilus x86_64 0:50.3.1-1.fc44 updates 13.9 MiB
papers-nautilus x86_64 0:49.8-1.fc44 updates 19.4 KiB
Always use dnf swap to move between the two builds, in either direction.
Verify the encoders
The version line confirms which build answers on the PATH:
ffmpeg -hide_banner -version | head -1
Fedora 45 reports FFmpeg 9; Fedora 44 reports the 8.1 series:
ffmpeg version 9.0.2 Copyright (c) 2000-2026 the FFmpeg developers
The version string is the same for both builds, so it proves nothing on its own. The encoder list is the real test. Filter it down to the ones that matter:
ffmpeg -hide_banner -encoders | grep -E "libx264 |libx265|libopenh264|libsvtav1|libvvenc|libfdk|libmp3lame|libopus"
With the RPM Fusion build, libx264, libx265 and libvvenc appear. The free build lists none of the three:

Install ffmpeg-devel for building against libav*
Building software that links to FFmpeg, such as a custom OBS plugin or a Python wheel with native bindings, needs the headers and pkg-config files:
sudo dnf -y install ffmpeg-devel
Then check the library versions pkg-config hands to your build system:
pkg-config --modversion libavcodec libavformat libavutil
Fedora 45 reports libavcodec 63, the FFmpeg 9 ABI:
63.1.102
63.1.102
61.1.102
Fedora 44 reports libavcodec 62. That major bump matters after an upgrade from 44 to 45: anything you compiled yourself against the old libraries, or a third-party RPM built for Fedora 44, links to libavcodec.so.62 and stops loading once the system moves to 63. Rebuild it after the Fedora 44 to 45 upgrade.
Everyday FFmpeg commands
Synthetic test patterns make poor sample media, so the examples below use 30 seconds of the open movie Sintel (Blender Foundation, CC BY 3.0). FFmpeg can seek inside a remote file and copy just the part you ask for, which saves downloading the full 1.1 GB file:
ffmpeg -hide_banner -v error -ss 600 -i https://download.blender.org/demo/movies/Sintel.2010.1080p.mkv -t 30 -map 0:v:0 -map 0:a:0 -c copy sintel-30s.mkv
Inspect what you got with ffprobe, which ships with both builds:
ffprobe -hide_banner sintel-30s.mkv
H.264 video at 1920×818 and 24 fps, plus 5.1 AC-3 audio. Keep that audio layout in mind for the AV1 example:
Input #0, matroska,webm, from 'sintel-30s.mkv':
Metadata:
ENCODER : Lavf63.1.102
Duration: 00:00:31.17, start: 0.000000, bitrate: 10487 kb/s
Chapters:
Chapter #0:0: start 0.000000, end 30.000000
Metadata:
title : Chapter 06
Stream #0:0(eng): Video: h264 (High), yuv420p(tv, bt709/unknown/unknown, progressive), 1920x818, SAR 1:1 DAR 960:409, 24 fps, 24 tbr, 1k tbn
Metadata:
DURATION : 00:00:31.166000000
Stream #0:1(eng): Audio: ac3, 48000 Hz, 5.1(side), fltp, 640 kb/s, start 0.050000
Metadata:
title : AC3 5.1 @ 640 Kbps
DURATION : 00:00:31.058000000
Transcode to H.264 with AAC audio in an MP4 container. This plays on practically every device:
ffmpeg -hide_banner -v error -i sintel-30s.mkv -c:v libx264 -preset medium -crf 23 -c:a aac -b:a 160k sintel.mp4
HEVC came out at less than half the H.264 size here, at a modest quality cost (see the benchmark below). The -tag:v hvc1 flag is what makes the file play on Apple devices, which reject the default hev1 tag:
ffmpeg -hide_banner -v error -i sintel-30s.mkv -c:v libx265 -preset medium -crf 28 -tag:v hvc1 -c:a aac -b:a 160k -x265-params log-level=error sintel-hevc.mp4
AV1 with Opus in WebM is the royalty-free option, and it works with ffmpeg-free too. Point it at a 5.1 source and libopus refuses the channel layout. The fix is in the troubleshooting section further down, so the working command already carries -ac 2 to downmix to stereo. SVT_LOG=1 keeps the SVT-AV1 banner quiet:
SVT_LOG=1 ffmpeg -hide_banner -v error -i sintel-30s.mkv -c:v libsvtav1 -preset 8 -crf 35 -c:a libopus -b:a 128k -ac 2 sintel-av1.webm
Pull the soundtrack out as MP3. The video to MP3 conversion guide covers bitrate choices and batch conversion in more depth:
ffmpeg -hide_banner -v error -i sintel-30s.mkv -vn -c:a libmp3lame -q:a 2 sintel.mp3
Cut a clip without re-encoding. Stream copy is instant, but it can only cut on keyframes:
ffmpeg -hide_banner -v error -ss 10 -i sintel.mp4 -t 8 -c copy clip.mp4
We asked for 8 seconds and got slightly more, because the cut snapped to the nearest keyframe. Re-encode instead of copying when you need frame-accurate edges:
8.166667
Scale to 720p. The -2 keeps the aspect ratio and rounds the width to an even number, which H.264 requires:
ffmpeg -hide_banner -v error -i sintel.mp4 -vf scale=-2:720 -c:v libx264 -preset fast -crf 23 -c:a copy sintel-720p.mp4
Grab a single frame as a thumbnail:
ffmpeg -hide_banner -v error -ss 12 -i sintel.mp4 -frames:v 1 -q:v 2 thumb.jpg
Make a short GIF. Generating a palette from the clip first is what keeps it from looking dithered and muddy:
ffmpeg -hide_banner -v error -ss 14 -t 3 -i sintel.mp4 -vf "fps=12,scale=480:-1:flags=lanczos,split[a][b];[a]palettegen[p];[b][p]paletteuse" preview.gif
Sizes of everything those commands produced from the 39 MB source:
3.7M clip.mp4
1.8M preview.gif
39M sintel-30s.mkv
8.1M sintel-720p.mp4
5.5M sintel-av1.webm
4.7M sintel-hevc.mp4
618K sintel.mp3
11M sintel.mp4
200K thumb.jpg
To watch any of these without leaving the terminal, ffplay opens a window straight from the command line. Here it plays the HEVC file on the Fedora 45 GNOME desktop:

For a full media player with a library and subtitles, VLC on Fedora uses the same libraries once the swap is done.
Encoder speed and quality on Fedora 45
Which encoder should you use? We encoded the same 30 seconds with each software encoder the RPM Fusion build offers, then scored every result against the source with VMAF. The scoring uses libvmaf, which both builds include. The source is first decoded to a lossless FFV1 reference cropped to 1920×816, so every encoder starts from the same frames. The VM had 4 vCPUs on an Intel Core i7-1165G7. Open the script:
vim bench.sh
This is the exact script that produced the numbers below:
#!/bin/bash
# encode a lossless 1920x816 reference with each encoder; report wall time, fps, size, VMAF vs reference
[ -f ref.mkv ] || ffmpeg -hide_banner -v error -i sintel-30s.mkv -an -vf crop=1920:816 -c:v ffv1 ref.mkv
src=ref.mkv
frames=$(ffprobe -v error -select_streams v:0 -count_packets -show_entries stream=nb_read_packets -of csv=p=0 $src)
printf '%-12s %-26s %8s %7s %8s %6s\n' encoder settings wall_s fps size_MB vmaf
run() {
name=$1; out=$2; shift 2
s=$(date +%s.%N)
SVT_LOG=1 ffmpeg -hide_banner -v error -y -i $src "$@" $out
e=$(date +%s.%N)
w=$(echo "$e - $s" | bc)
fps=$(echo "scale=1; $frames / $w" | bc)
mb=$(echo "scale=1; $(stat -c %s $out) / 1048576" | bc)
vmaf=$(ffmpeg -hide_banner -i $out -i $src -lavfi "[0:v]settb=AVTB,setpts=N/24/TB[d];[1:v]settb=AVTB,setpts=N/24/TB[r];[d][r]libvmaf=n_threads=4:model=version=vmaf_v0.6.1" -f null - 2>&1 | grep -oP 'VMAF score: \K[0-9.]+')
printf '%-12s %-26s %8.1f %7s %8s %6s\n' "$name" "$SET" "$w" "$fps" "$mb" "$vmaf"
}
SET="medium crf 23"; run libx264 b-x264.mp4 -c:v libx264 -preset medium -crf 23
SET="4 Mb/s"; run libopenh264 b-openh264.mp4 -c:v libopenh264 -b:v 4M
SET="medium crf 28"; run libx265 b-x265.mp4 -c:v libx265 -preset medium -crf 28 -x265-params log-level=error
SET="preset 8 crf 35"; run libsvtav1 b-svtav1.mkv -c:v libsvtav1 -preset 8 -crf 35
SET="faster qp 32"; run libvvenc b-vvenc.mp4 -c:v libvvenc -preset faster -qp 32
Make it executable with chmod +x bench.sh, keep sintel-30s.mkv in the same directory, and run ./bench.sh. It needs bc, which minimal installs lack (sudo dnf -y install bc). Wall time includes muxing, and VMAF is the mean over all 747 frames:

Read the table by goal, not by row:
- SVT-AV1 at preset 8 is the standout. It encoded as fast as x264 medium, scored 92.6 VMAF, and produced half the file size. It is also available in
ffmpeg-free. - x264 medium, CRF 23 scored highest at 95.1, but it is the second largest file. Use it when the output must play everywhere.
- OpenH264 was the fastest at 83 fps. That speed costs bitrate: at a fixed 4 Mb/s it is the largest file, and it still scored below x264. It is the H.264 fallback when RPM Fusion is not an option.
- x265 CRF 28 made the smallest file among the codecs that play on most hardware, 3.9 MB, at 89.7 VMAF. It ran slower than SVT-AV1 and scored lower.
- VVenC made the smallest file of all, 1.9 MB, but ran at 11.9 fps and scored lowest at this QP. Little plays H.266 yet, so treat it as an experiment.
These are single runs on a shared hypervisor, so treat the fps as relative. An earlier run under heavier host load took 34.2 seconds for x264 instead of 20.6, while SVT-AV1 and VVenC barely moved. For GPU encoding through VA-API, NVENC or Quick Sync, which both builds support, the driver setup is in the Fedora codecs and hardware decoding guide.
Troubleshooting
Error: “Unknown encoder ‘libx264′”
You are running ffmpeg-free. Enable RPM Fusion and run the swap from the Workstation section, or switch the command to -c:v libopenh264 -b:v 4M if you want to stay on Fedora packages only.
Error: “installed package ffmpeg-free conflicts with ffmpeg-free provided by ffmpeg”
dnf install ffmpeg on a machine that already has the free build. Use sudo dnf -y swap ffmpeg-free ffmpeg --allowerasing, which replaces the free build in one transaction and leaves the dependent GNOME packages in place.
Error: “Invalid channel layout 5.1(side) for specified mapping family -1”
libopus does not accept the 5.1(side) layout that AC-3 and many MKV files use, and the whole encode aborts:
[libopus @ 0x560c1e682940] Invalid channel layout 5.1(side) for specified mapping family -1.
[aost#0:1/libopus @ 0x560c1e682300] [enc:libopus @ 0x560c1e661580] Error while opening encoder - maybe incorrect parameters such as bit_rate, rate, width or height.
Downmix to stereo with -ac 2, as in the AV1 example above. To keep six channels, remap the layout to plain 5.1 before the encoder:
SVT_LOG=1 ffmpeg -hide_banner -v error -i sintel-30s.mkv -c:v libsvtav1 -preset 8 -crf 35 -c:a libopus -b:a 192k -af "channelmap=channel_layout=5.1" sintel-av1-51.webm
ffprobe confirms stereo Opus in the first file and six-channel Opus in the second:
stream|av1
stream|opus|2|stereo
stream|av1
stream|opus|6|5.1
VMAF reports around 40 to 70 for a good encode
The frames are misaligned, not the encode bad. MP4 outputs from a seeked source start at a different timestamp than the reference, and libvmaf pairs frames by timestamp. An earlier run of ours scored x264 at 68.6. Renumbering both inputs by frame index with settb=AVTB,setpts=N/24/TB, as bench.sh does, gave 95.1 with the same encode settings. Use your source frame rate in place of 24.
Go back to ffmpeg-free
Leaving RPM Fusion, or chasing a bug you suspect is in the full build? Swap in the other direction:
sudo dnf -y swap ffmpeg ffmpeg-free --allowerasing
The swap removes three RPM Fusion packages and reinstalls the eight free ones:
Package Arch Version Repository Size
Removing:
ffmpeg x86_64 0:8.1.3-1.fc44 rpmfusion-free-updates 2.6 MiB
Removing dependent packages:
ffmpeg-libs x86_64 0:8.1.3-1.fc44 rpmfusion-free-updates 23.3 MiB
libavdevice x86_64 0:8.1.3-1.fc44 rpmfusion-free-updates 133.8 KiB
Installing:
ffmpeg-free x86_64 0:8.1.3-1.fc44 updates 2.6 MiB
Installing dependencies:
libavcodec-free x86_64 0:8.1.3-1.fc44 updates 10.3 MiB
libavdevice-free x86_64 0:8.1.3-1.fc44 updates 244.2 KiB
libavfilter-free x86_64 0:8.1.3-1.fc44 updates 4.3 MiB
libavformat-free x86_64 0:8.1.3-1.fc44 updates 2.8 MiB
libavutil-free x86_64 0:8.1.3-1.fc44 updates 975.2 KiB
libswresample-free x86_64 0:8.1.3-1.fc44 updates 155.2 KiB
libswscale-free x86_64 0:8.1.3-1.fc44 updates 1.0 MiB
Transaction Summary:
Installing: 8 packages
Removing: 3 packages
x264, x265 and VVenC libraries stay behind as orphans. autoremove clears every unused dependency on the machine, not only these, so run it without -y on a long-lived system and read the list before you confirm. On the lab VM it found exactly the FFmpeg leftovers:
sudo dnf autoremove
Five packages, 27 MiB in total:
Package Arch Version Repository Size
Removing:
OpenCL-ICD-Loader x86_64 0:3.0.6-7.20250722gitad770a1.fc44 fedora 90.6 KiB
vmaf-models noarch 0:3.0.0-5.fc44 fedora 4.1 MiB
vvenc-libs x86_64 0:1.13.1-5.fc44 rpmfusion-free 3.3 MiB
x264-libs x86_64 0:0.165-5.20250608gitb35605ac.fc44 rpmfusion-free 2.8 MiB
x265-libs x86_64 0:4.1-4.fc44 rpmfusion-free 16.7 MiB
Transaction Summary:
Removing: 5 packages
After this operation, 27 MiB will be freed (install 0 B, remove 27 MiB).
The machine is back to the stock Fedora package set. The RPM Fusion repositories stay enabled until you remove rpmfusion-free-release and rpmfusion-nonfree-release. dnf never switches builds on its own, because ffmpeg conflicts with ffmpeg-free rather than replacing it, so leaving the repositories enabled is harmless. Day-to-day dnf commands for this kind of package juggling are in the DNF5 cheatsheet for Fedora.
On the first step I get:
zsh: parse error near `)’
Try using bash, this is the default shell on fedora 😉
Try to execute it in a normal bash.
at for fedora 38 it should be sudo dnf -y install ffmpeg-free
otherwise you get conflicts