ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

CentOS yum安装ffmpeg实战:EPEL与RPM Fusion源配置全指南

CentOS yum安装ffmpeg实战:EPEL与RPM Fusion源配置全指南 做运维的都知道在一台全新的 CentOS 服务器上执行yum install ffmpeg十有八九会收到一行冷冰冰的提示No package ffmpeg available。别急这不是你网络有问题也不是 CentOS 源挂了而是因为 ffmpeg 这种带有专利编码器H.264、AAC的软件默认根本不会出现在 CentOS 官方仓库里。今天这篇就专门聊聊怎么用 yum 在 CentOS 上把 ffmpeg 工具装好、用好以及我在实际安装和排查过程中踩过的一些坑。这篇文章适合所有需要在 CentOS 7/8/9 服务器上快速获得 ffmpeg 的人不管你是要转码、截图、探针视频信息还是给后续的视频处理脚本打基础照着这条路线走基本就能搞定。我会把为什么 yum 装不上、需要加哪些第三方源、每一步怎么操作、常见的报错怎么解决全部讲透争取让你看完就能直接上手。1. 为什么 yum 默认装不上 ffmpeg先搞清来龙去脉1.1 CentOS 官方源里到底收录了什么CentOS 的 yum 仓库本质上是一个“二进制软件超市”里面收录的每一个包都经过编译、打包、签名并且带着完整的依赖关系描述。官方仓库Base、AppStream、Extras在收录软件时有一个非常明确的原则优先选择稳定、成熟、许可证干净的项目。ffmpeg 恰恰踩在了许可证的灰色地带。它本身是 LGPL/GPL 授权的开源软件但它默认开启的很多编解码器比如 H.264AVC、H.265HEVC、AAC都涉及软件专利和授权费问题。CentOS 作为以“企业级稳定”为卖点的发行版不可能把这些可能引发法律风险的模块放进默认源里否则它自己在商用环境里都没法交代。所以你在 CentOS 上执行yum install ffmpeg才会得到No package的结果。这不是命令写错了也不是源坏了而是仓库里压根就没有这个包。我第一次遇到这个报错时也懵了半天翻了一堆资料才明白是这层原因。1.2 为什么我仍然推荐 yum 而不是源码编译很多教程一上来就让你去官网下载源码包然后自己./configure make make install。这套流程确实能装出最新版 ffmpeg但说实话对大多数服务器运维场景来说属于自找麻烦。先说源码编译的痛点。ffmpeg 的依赖链很长常见的有 nasm汇编优化、libx264、libx265、libvpx、libmp3lame、libopus、libvorbis、libfdk-aac、SDL 等等。你需要在编译 ffmpeg 之前先把这些全都编译好任何一个版本不对都可能导致编码器用不了。而且编译过程很耗时一台双核小机器编译 ffmpeg 加上依赖库经常一两个小时就过去了。后续要卸载也不干净散落了一堆编译产物只能手动清理。yum 安装的收益就很直接依赖自动解析所有库版本统一卸载用yum remove一条命令搞定升级用yum update也能跟上。更重要的是yum 安装的 ffmpeg 会以动态库方式链接系统里的 libavcodec、libavformat 等组件其他软件也能复用这些库整体资源占用小很多。如果你只是做日常的视频转码、格式封装、抽帧截图、媒体信息探测yum 装出来的 ffmpeg 完全够用。只有当你需要定制某些编译选项、追求最新主干版本、或者要开启硬件加速比如 NVIDIA NVENC时才有必要去折腾源码编译。1.3 一条可行的路线图要在 CentOS 上通过 yum 安装 ffmpeg核心思路是给系统增加两个“外援仓库”EPEL 和 RPM Fusion。EPEL 是由 Fedora 社区维护的、面向 RHEL/CentOS 的扩展软件仓库里面补充了大量官方源没有的常用软件RPM Fusion 则是 Fedora/EPEL 社区和第三方仓库合并后的产物专门收录因许可证问题无法进入官方源的软件ffmpeg 就在这里。这条路线大概分三步安装 EPEL 仓库提供基础扩展包和依赖支持。安装 RPM Fusion 仓库提供 ffmpeg 本体。用 yum 安装 ffmpeg。这三个步骤的顺序不要乱因为 RPM Fusion 里的很多包会依赖 EPEL 里的其他组件。如果顺序反了后面很可能出现依赖解析失败。2. 安装前的环境准备别一上来就 yum install2.1 先确认系统版本和架构动手之前先确认一下你手上的机器到底是什么系统、什么架构。不同的 CentOS 版本对应不同的仓库地址el7、el8、el9选错了仓库包后面怎么装都装不上。用下面三条命令确认环境cat /etc/redhat-release uname -m yum --version第一眼要看 Linux 发行版大版本是 7 还是 8 还是 9第二眼看 CPU 架构是不是 x86_64第三眼看 yum 本身是否正常工作。我之前就遇到过一个同事CentOS 7 的机器下载了 el8 版本的 rpmfusion-release 包rpm 装的时候还成功了结果 yum 怎么都搜不到 ffmpeg排查了半天才发现是版本号不匹配。另外补充一个点CentOS 7 从 2024 年 6 月 30 日开始已经停止维护了官方源里很多 mirrorlist 地址已经失效。如果你是 CentOS 7 的环境安装之前务必要把源先换掉否则后续每一步都可能报网络错误。CentOS 7 的具体换源操作我放在第 5 节里面细说这里先记住一件事老的 CentOS 7 机器直接yum install大概率会碰到各种访问超时。2.2 给 yum 源做个快照备份换源是个很容易把系统搞乱的操作所以我强烈建议在动任何 repo 文件之前先把整个目录备份一份cp -r /etc/yum.repos.d /etc/yum.repos.d.bak这一步花不了几秒钟但能让你在改坏配置后一键还原。我见过不少人在改源的时候手滑把gpgkey路径写错了导致后面所有的安装都卡在 GPG 验证失败上只好重新初始化 yum 配置。有了备份直接rm -rf /etc/yum.repos.d cp -r /etc/yum.repos.d.bak /etc/yum.repos.d就能恢复原状。备份完以后再执行一次yum clean all yum makecache看当前配置的 yum 源能不能正常工作。这一步能提前暴露网络问题和源配置问题省得你装了 EPEL 以后才发现 base 源本身就不通排查起来很费劲。2.3 顺手把 base 源换成本地/国内镜像对于 CentOS 7强烈建议先把默认源指向国内镜像或者 vault 归档源。原因是 CentOS 7 官方已经 EOL默认的mirrorlist.centos.org基本不可用了继续用它只会在每个操作时报连接超时。以阿里云镜像源为例CentOS 7 的换源操作可以这样执行wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo sed -i s/$releasever/7/g /etc/yum.repos.d/CentOS-Base.repo yum clean all yum makecache这里有一个细节要注意CentOS 7 如果直接保留$releasever变量部分环境下解析出来的值可能是 7但有些情况下会因为源配置里带的 releasever 文件不对而出问题所以我直接把变量替换成具体的数字 7一劳永逸。CentOS 8 的用户可以下载阿里云对应的Centos-8.repo但需要额外注意 CentOS 8 同样已经 EOL所以源地址最后也会指向 vault 目录。如果你公司内网有自己的 yum 镜像服务那更简单直接指定内网地址就行。这一步做完再跑一遍yum makecache只要不报错说明基础源已经正常了。2.4 网络与防火墙的检查思路安装第三方源的时候机器必须能访问到镜像服务器。如果是云服务器一般没什么问题如果是公司内网物理机可能需要检查防火墙或代理配置。遇到下载超时的时候先用curl -I测一下目标源地址能不能通而不是直接怀疑机器宽带断了curl -I http://mirrors.aliyun.com/epel/7/x86_64/这一步能帮你快速定位是网络问题还是 yum 配置问题排查方向完全不一样。3. 一步一步配置 EPEL 和 RPM Fusion 源3.1 安装 EPEL给 CentOS 补充第一批软件包EPEL 的安装非常方便一行命令就能搞定yum install -y epel-release如果默认源有问题导致装不上也可以直接下载 rpm 包安装rpm -Uvh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpmCentOS 7 环境下我一般直接用阿里云的地址速度快、连接稳定。CentOS 8/9 可以把链接里的7换成8或9但要注意不同大版本的 EPEL 包不能混用。EPEL 装完之后它默认的源地址可能还是指向 download.fedoraproject.org这时候最好也换成国内镜像。编辑/etc/yum.repos.d/epel.reposed -e s|^metalink|#metalink|g \ -e s|^#baseurlhttp://download.example/pub/epel|baseurlhttp://mirrors.aliyun.com/epel|g \ -i /etc/yum.repos.d/epel.repo这段 sed 命令的作用是注释掉 metalink 配置把 baseurl 指向阿里云 EPEL 镜像。执行完以后yum clean all yum makecache确认 EPEL 源已经可用。注意不要把 EPEL 的 baseurl 写错成 https有些镜像不提供 https 访问写错了照样报错。先用 http 测试能通再说。3.2 Rim Fusion真正提供 ffmpeg 的仓库EPEL 里其实并没有 ffmpeg或者在一些新版 EPEL 源里只有一个很老的版本。真正能提供现代版 ffmpeg 的是 RPM Fusion 仓库。安装 RPM Fusion 的方法是直接下载并安装它的 release 包。针对 CentOS 7 x86_64 环境rpm -Uvh http://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm rpm -Uvh http://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-7.noarch.rpmRPM Fusion 分两个仓库free和nonfree。free仓库收录的是许可证合规的开源软件nonfree仓库收录的是包含专利授权模块的软件比如 H.264 编码相关的依赖包。我建议两个都装因为实际使用 ffmpeg 的时候往往需要用到非自由授权的库才能完整支持 H.264/AAC 编码。CentOS 8/9 用户把链接里的7换成对应的 el8/el9 即可。安装完 release 包后仓库文件会出现在/etc/yum.repos.d/下比如rpmfusion-free.repo和rpmfusion-nonfree.repo。接着导入 GPG key否则安装时可能报公钥未安装的错rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-rpmfusion-free-7 rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-rpmfusion-nonfree-7注意路径里的7同样要和大版本匹配CentOS 8 就换成8。这里要解释一下为什么 RPM Fusion 非常依赖 EPELRPM Fusion 里面很多包的依赖链最终会落到 EPEL 里的基础库上所以如果没有先装 EPEL 就直接装 RPM Fusion依赖解析大概率会出问题。3.3 检查仓库是否启用成功安装完两个仓库以后先别急着yum install ffmpeg先确认仓库确实生效了yum repolist正常的输出应该包含epel、epel-debuginfo、rpmfusion-free、rpmfusion-nonfree等条目。接着再看看能不能从仓库里搜到 ffmpegyum list ffmpeg如果能看到 ffmpeg 的版本信息那恭喜你离成功只差最后一步了。如果搜索不到就强制指定仓库再搜一次yum --enablerepoepel,rpmfusion-free install ffmpeg这一步能排除因仓库优先级或默认启用状态导致的搜不到问题。RPM Fusion 的仓库默认是启用的但有些精简配置会把它禁用掉这时就需要上面这种显式指定仓库的方式。4. 安装 ffmpeg 并完成基础验证4.1 安装命令与依赖变化仓库都准备好了安装本身其实非常简单yum install -y ffmpeg ffmpeg-devel-y参数跳过确认提示ffmpeg-devel是开发库如果你想编译调用 ffmpeg 接口的程序就需要它。如果只是用命令行转码只装ffmpeg就够但我习惯一起装上反正也没多大。安装过程中yum 会自动解析并拉取一堆依赖包括libavcodec、libavformat、libavutil、libswscale、libswresample、libpostproc、SDL等等。这时候屏幕上会显示一大串依赖包列表别慌这是正常现象。装完以后用几个命令确认安装结果which ffmpeg ffmpeg -version rpm -qa | grep ffmpegwhich ffmpeg确认可执行文件路径ffmpeg -version确认版本rpm -qa确认到底装了哪些跟 ffmpeg 相关的包。这里要插一句很多人看到网上说“安装 nvidia 版本的 ffmpeg”以为 yum 也能直接装一个带 NVENC 硬件加速的版本这是不可能的。yum 仓库里只有 CPU 软件编码版本硬件加速编码器如 NVIDIA NVENC需要你自己编译并且编译时启用--enable-nvenc以及安装对应的 NVIDIA 视频编解码 SDK。如果以后你在服务器上看到ffmpeg -encoders里没有 h264_nvenc那就是因为这个。4.2 第一件事查看版本和编译配置装完以后第一件事不是急着转码而是先看版本信息ffmpeg -version这条命令的输出后面会带一行很长的编译参数比如--enable-gpl --enable-libx264 --enable-libmp3lame --enable-libvpx等等。这些参数决定了当前 ffmpeg 支持哪些编码器。接下来用下面的命令查看编码器和解码器ffmpeg -encoders | grep -E 264|aac ffmpeg -decoders | grep -E 264|aac-encoders列出所有可用的编码器-decoders列出所有可用的解码器。如果你看到libx264和aac出现在编码器列表里说明最核心的 H.264/AAC 编码能力已经具备了。ffmpeg -codecs可以同时看到编码器、解码器以及对应的帧格式、比特率等信息想全面了解能力可以用这条。4.3 做一次实际转码测试看完了支持列表找个有音视频内容的文件做一次真实验证。我自己习惯用一个带 H.264 视频轨和 AAC 音频轨的 mp4 文件来测试ffmpeg -i input.mp4 -c:v libx264 -preset veryfast -crf 23 -c:a aac -b:a 128k output.mp4如果屏幕上的进度条在跑最后生成output.mp4说明转码链路是通的。这里简单解释一下参数的含义-c:v libx264视频编码器用 libx264。-preset veryfast编码速度配置veryfast是牺牲一点压缩率换速度适合测试正式转码可以用medium。-crf 23质量控制也叫恒定质量因子。数值越小质量越高、文件越大23 是通用默认值。-c:a aac音频编码器用 AAC。-b:a 128k音频码率设为 128 kbps。转码完成后可以用ffprobe看看输出文件的详细信息ffprobe -show_format -show_streams output.mp4-show_format输出封装格式信息-show_streams输出每个媒体流的信息包括编码格式、分辨率、码率、帧率、时长等。4.4 ffprobe 和 ffplay 的角色ffmpeg 安装包通常会同时带来三个命令ffmpeg、ffprobe、ffplay。ffprobe是媒体信息探测器相当于视频文件的工具箱可以获取时长、分辨率、编码格式、码率等元数据。ffplay是一个简单的播放器可以在有图形界面的环境下播放视频。但 CentOS 服务器通常没有桌面环境ffplay 用起来很受限所以你在服务器上最常用的基本就是ffmpeg和ffprobe这两个。如果你需要弹窗口能力得先装好 SDL2 库并且服务器有 X11 转发环境否则还不如直接用静态编译版。5. 常见问题排查我踩过的坑基本都在这了5.1 下载元数据时报错mirrorlist 失效这是 CentOS 7 老机器最容易碰到的问题。症状是执行yum update或yum install时卡在 metadata 下载阶段然后报出类似这样的错误Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7archx86_64repoosinfrastock error was 14: curl#6 - Could not resolve host: mirrorlist.centos.org; Unknown error根本原因就是 CentOS 7 已经停止维护官方 mirrorlist 服务器基本不再提供服务。解决办法是把 CentOS 基础源指向 vault 归档源或者国内镜像vi /etc/yum.repos.d/CentOS-Base.repo把[base]小节下的mirrorlist注释掉启用baseurl改成[base] nameCentOS-7 - Base baseurlhttp://vault.centos.org/7.9.2009/os/$basearch/ gpgcheck1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7这里7.9.2009是 CentOS 7 的最终小版本号尽量别用裸的7去拼接 URLvault 路径下更稳妥。改完以后执行yum clean all yum makecache确认 base 源恢复正常。同样的道理如果epel.repo里的 metalink 也有问题直接按照 3.1 节里的 sed 命令换成阿里云 EPEL 地址就行。5.2 No package ffmpeg available这是最经典的报错原因一般就三种EPEL 或 RPM Fusion 没装成功。仓库装上了但是被禁用。下载的仓库包版本和系统版本不匹配。排查时先看yum repolist确认 epel 和 rpmfusion 都在。如果都在再用yum list ffmpeg搜一下仍然没结果就强制启用仓库yum --enablerepoepel,rpmfusion-free install ffmpeg如果还是不显示多半是仓库包版本不对。比如 CentOS 7 上装了 el8 的 rpmfusion那仓库里的$releasever变量解析出来不对ffmpeg 肯定搜不到。这时需要用正确的 release 包重新覆盖安装rpm -Uvh --force http://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm5.3 GPG key 公钥未安装yum 安装 rpm 包时默认会做 GPG 签名校验如果系统里没有对应仓库的公钥就会报Public key for ... is not installed。解决办法是手动导入 GPG key。RPM Fusion 的 key 在/etc/pki/rpm-gpg/目录下以RPM-GPG-KEY-rpmfusion-free-7之类的文件名存在rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-rpmfusion-free-7 rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-rpmfusion-nonfree-7导入后再重试安装。如果实在不想处理 GPG key可以在 repo 文件里临时把对应仓库的gpgcheck1改成gpgcheck0但这个方法只建议在测试环境用生产环境千万别这么干等于把系统的包校验体系给关了。5.4 依赖冲突libavcodec.so.58 is needed有时候系统里已经存在 ffmpeg 的部分组件比如某些软件自带了老版本 libavcodec或者之前用源码编译过 ffmpeg这时候 yum 安装就会报依赖冲突典型如Error: Package: ffmpeg-4.1.9-1.el7.x86_64 (rpmfusion-free) Requires: libavcodec.so.58()(64bit) Installed: libavcodec.so.57()(64bit) (/ffmpeg-static)这说明系统里有其他来源的 ffmpeg 组件和 yum 要装的版本不一致。处理思路是先查清楚哪些包在占用rpm -qa | grep -i ffmpeg rpm -qa | grep -i libavcodec确认以后把冲突的旧包卸载掉再重新安装yum remove ffmpeg ffmpeg-libs yum install -y ffmpeg卸载前要评估一下是否有其他服务依赖这些旧库尽量在业务低峰期操作。5.5 离线环境怎么装从 yumdownloader 到本地 yum 源很多内网生产机器无法访问外网这时候没法直接在线装 EPEL/RPM Fusion一般有两种方案。方案一在有网络的机器上下载好所有 rpm 包然后拷贝到离线机器安装。先在有网机器上装好 yum-utilsyum install -y yum-utils mkdir -p /root/ffmpeg-rpms yumdownloader --resolve --destdir/root/ffmpeg-rpms ffmpeg ffmpeg-devel--resolve参数会把所有依赖一起下载。下载完成后把整个目录打包拷贝到离线机器用 rpm 安装rpm -Uvh /root/ffmpeg-rpms/*.rpm方案二搭建本地 yum 源。把 rpm 包集中放到一个目录用createrepo生成仓库元数据然后通过 HTTP 或者本地路径共享给同网段的机器。客户端配置一个指向该路径的.repo文件就行。这种方法适合公司内部多台服务器需要统一安装环境的情况一次搭建后面所有机器都能复用。5.6 谨慎使用 yum update 和 --exclude有网友问过yum update -y --excludekernel*这种命令能不能用。我的观点是生产服务器别轻易执行全局yum update不管是不是带了--exclude。全局升级的不可控因素太多内核升级、驱动版本变化都可能导致服务起不来。安装 ffmpeg 时如果恰好有别的包提示可更新先放一放不要顺手yum update -y。如果确实需要更新安全补丁就用针对性方式yum update --security或者指定包名升级。ffmpeg 安装完成即用没必要为了它把整个系统都升级一遍。6. 进阶让 yum 装的 ffmpeg 更好用6.1 追加常用编码器和滤镜能力yum 安装的 ffmpeg 已经带了一大批常用编码器但如果你还需要特定功能可以装额外的编码库。比如需要 H.265/HEVC 编码就执行yum install -y x265装完以后再运行ffmpeg -encoders | grep 265就能看到libx265编码器了。需要 MP3 编码就装lame-libs需要 VP8/VP9 就装libvpx。这些库安装后ffmpeg 通过动态库方式直接就能使用不需要重新编译。如果装了库以后仍然看不到对应编码器那就说明当前 yum 源里 ffmpeg 编译时没有启用该模块或者模块库没找到。这时候可以优先检查仓库里的ffmpeg-libs是否和你装的编码库版本匹配再不行才考虑源码编译。6.2 yum 版 ffmpeg 和静态编译版怎么选很多教程会推荐直接下静态编译版确实很简单下载解压就能用。但静态版和 yum 版各有适合场景我整理了一个对比对比维度yum 版静态编译版版本更新跟随发行版/仓库通常偏老但稳定可以直接下载最新 release依赖方式动态链接系统库体积小、升级方便打包所有依赖解压即用可定制性低仓库定死编译选项高可选择特定模块部署便利性需要配置源、安装依赖单文件或单目录拷贝即可运行适用场景服务器日常转码、探针、生产环境本地开发、跨机器快速部署、内网离线环境静态编译版一般从 johnvansickle.com 的 release 页面下载文件名类似ffmpeg-release-amd64-static.tar.xz下载后校验一下 SHA256 再解压使用。我个人在服务器上更喜欢 yum 版因为它跟系统库版本统一出问题也好排查但在内网离线机器上静态版确实是救命稻草。6.3 实用批量转码脚本装好 ffmpeg 以后最常用的就是写循环转码脚本。比如把当前目录下所有 mp4 批量压缩for f in *.mp4; do ffmpeg -i $f -c:v libx264 -preset medium -crf 23 -c:a aac ${f%.*}_out.mp4 done注意文件名要加双引号不然文件名里有空格的时候脚本就会炸。${f%.*}是 Shell 的取文件名技巧去掉扩展名以后再拼上_out.mp4。如果是长时间转码任务配合日志和后台运行nohup ffmpeg -i input.mp4 -c:v libx264 -preset medium -crf 23 -c:a aac output.mp4 /var/log/ffmpeg.log 21 nohup 让进程在退出终端后继续运行日志重定向到指定文件方便事后排查。6.4 配合 systemd 做后台转码任务如果某个转码任务需要开机自启或异常退出后自动拉起可以写一个 systemd service。比如/etc/systemd/system/video-transcode.service[Unit] DescriptionVideo Transcode Task Afternetwork.target [Service] Typesimple ExecStart/usr/bin/ffmpeg -i /data/input.mp4 -c:v libx264 -preset medium -crf 23 -c:a aac /data/output.mp4 Restarton-failure RestartSec10 [Install] WantedBymulti-user.target写完后执行systemctl daemon-reload systemctl enable video-transcode.service systemctl start video-transcode.serviceRestarton-failure是常用的守护选项进程异常退出后 10 秒自动重试比手动跑命令省心不少。最后说一点个人体会。yum 安装 ffmpeg 这件事本质上不是“敲一条命令”这么简单真正的难点在于理解发行版的仓库边界、第三方源之间的关系、以及版本匹配的重要性。普通用途yum 装就够用了省心省力要最新版本或特定硬件加速再考虑源码编译。我在实际部署中会把整个源配置过程写成一个脚本比如install_ffmpeg_yum.sh新机器上跑一遍就自动搞定省得每次重复手动配置。装完以后记得先看一眼ffmpeg -version和ffmpeg -encoders确认你需要的编码能力都在免得真到了转码现场才发现某个编码器缺失那时候再补依赖就有点被动了。
返回列表