ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

CentOS用yum安装FFmpeg:从源配置到排错完整指南

CentOS用yum安装FFmpeg:从源配置到排错完整指南 CentOS上用yum装ffmpeg说难不难说简单也容易踩坑。很多人一上来就yum install ffmpeg结果提示No package ffmpeg available然后就懵了。这个报错的根源在于CentOS官方源里压根就没有ffmpeg这个包它属于第三方仓库的内容。今天这篇就把这件事彻底讲透从仓库选择、安装步骤到常见报错排查一次搞定。1. 为什么yum装ffmpeg会失败先搞清楚包从哪来1.1 官方源里没有的包yum再聪明也装不上很多人第一次在CentOS上装ffmpeg都会理所当然地认为yum install ffmpeg是一条万能命令。实际上CentOS的默认官方源base、updates、extras里包含的软件包非常克制主要是一些基础的系统工具、编译器、运行时库像ffmpeg这种涉及多媒体编解码、可能牵涉专利问题的软件官方源是不会收录的。这里先说清楚一个概念yum本身只是一个包管理器它的职责是解析依赖、从配置好的软件源repository下载rpm包并安装。如果某个软件在任何一个已配置的源里都不存在yum就会给出No package available的提示。所以问题的关键不是yum不会用而是没有给yum配置一个包含ffmpeg的软件源。这就好比你去一家没有卖某个菜品的餐厅点餐问题不在你不会点菜而是这家餐厅的菜单上就没这道菜。要想吃到得换一家有这道菜的餐厅或者让餐厅把这道菜加进菜单。1.2 EPEL、RPM Fusion、Nux Dextop到底是什么关系既然官方源没有那就得找第三方源。CentOS生态里比较有名的第三方源有几个我按用途给大家理一理EPELExtra Packages for Enterprise Linux这是Fedora社区维护的、专门为RHEL/CentOS提供额外软件包的仓库里面包很多但它同样不收录ffmpeg因为ffmpeg涉及的编解码器专利问题连EPEL也不愿意碰。RPM Fusion这是Fedora和RHEL/CentOS生态里最大的第三方软件仓库免费版free里收录了ffmpeg。这个仓库的free和nonfree两个子仓库划分很清晰free是开源协议没问题的软件nonfree是含专利或有版权争议的ffmpeg本体在free仓库里。Nux Dextop这也是一个面向CentOS/RHEL的第三方仓库里面同样有ffmpeg相关的rpm包。但它的维护频率不如RPM Fusion稳定而且如果你同时启用了多个第三方源容易出现依赖冲突。我个人的建议是优先使用RPM Fusion的free仓库。主要原因有两点一是它的包质量和依赖处理相对稳定二是它和EPEL配合得比较好很多依赖能从EPEL里补齐。对于CentOS 7和CentOS 8/StreamRPM Fusion都有对应的版本安装方式也差不多。2. 安装前的准备工作源配置和依赖检查2.1 确认系统版本别把源装错开始之前先确认一下你的CentOS版本。不同大版本的源地址和rpm包是完全不同的装错了源不仅装不上ffmpeg还可能把系统的依赖关系搞乱。cat /etc/redhat-release以CentOS 7为例输出一般是CentOS Linux release 7.9.2009 (Core)。CentOS 8或者CentOS Stream 9的输出会不一样。这一步非常关键因为接下来要装的EPEL和RPM Fusion的rpm包都是分版本的。确认好版本之后顺便看一下系统架构uname -m绝大多数服务器是x86_64架构但也有少数是aarch64ARM架构。RPM Fusion的aarch64支持情况不如EPEL那么完善如果遇到架构不匹配的情况下面会讲对应的处理办法。2.2 安装EPEL源很多依赖都要靠它RPM Fusion的很多依赖包放在EPEL里所以通常先装EPEL。EPEL的安装方式非常简单CentOS 7和CentOS 8都可以直接用yum装yum install -y epel-release如果网络环境比较特殊或者yum源里暂时没有epel-release这个包也可以去EPEL官网下载对应版本的rpm包手动安装。不过大多数情况下直接用yum安装就足够了。这里有个细节值得注意yum install -y epel-release装完之后可以看一下/etc/yum.repos.d/目录里的变化。正常情况下会多出epel.repo和epel-testing.repo两个文件。如果文件没有生成说明安装过程出了问题这时候不要继续往下走先解决源的问题。2.3 安装RPM Fusion仓库ffmpeg的真正来源装好EPEL之后接下来装RPM Fusion。RPM Fusion的安装包也分free和nonfree两个分支我们要用的是free分支。CentOS 7的安装命令yum install -y https://download1.rpmfusion.org/free/el/updates/7/x86_64/rpmfusion-free-release-7-1.noarch.rpmCentOS 8的安装命令yum install -y https://download1.rpmfusion.org/free/el/updates/8/x86_64/rpmfusion-free-release-8-1.noarch.rpmCentOS Stream 9的安装命令yum install -y https://download1.rpmfusion.org/free/el/updates/9/x86_64/rpmfusion-free-release-9-1.noarch.rpm如果这个默认的下载地址访问速度很慢或者干脆连不上可以换用清华大学的镜像源。清华镜像站提供了rpmfusion的镜像地址格式是https://mirrors.tuna.tsinghua.edu.cn/rpmfusion/free/el/updates/。手动下载rpm包再本地安装也是一种办法wget https://mirrors.tuna.tsinghua.edu.cn/rpmfusion/free/el/updates/7/x86_64/rpmfusion-free-release-7-1.noarch.rpm yum install -y ./rpmfusion-free-release-7-1.noarch.rpm装完之后记得验证一下repo文件是否就位ls /etc/yum.repos.d/ | grep rpmfusion正常会看到rpmfusion-free.repo和rpmfusion-free-updates.repo。2.4 更新yum缓存让新源生效添加了新的软件源之后需要刷新一下yum的缓存让系统知道新仓库里有哪些包。yum makecache这个过程会从所有已配置的源里下载元数据。如果配置了多个第三方源可能需要一点时间。看到Metadata cache created之类的提示就说明成功了。如果yum makecache过程中报错比如依赖冲突或者GPG key验证失败先不要慌。报错信息里通常会提示是哪一步出了问题解决完再继续。常见的GPG问题下面会专门讲。3. 开始安装ffmpeg从yum安装到环境验证3.1 安装命令和依赖处理机制仓库配置好之后安装就变得很简单了yum install -y ffmpegyum会自动解析依赖关系。这一点正是用yum安装最大的优势ffmpeg的依赖非常复杂包括libavcodec、libavformat、libavutil等一堆共享库还要依赖x264、x265、libvpx等各种编解码器。如果手动编译安装需要自己一个一个去解决依赖而yum会把所有依赖自动拉起来一次性装好。在安装过程中你会看到yum列出将要安装的包清单包括依赖包。如果依赖包数量很多这是正常现象不用紧张。装完之后用ffmpeg -version验证一下是否成功ffmpeg -version如果输出类似ffmpeg version 4.1.9 Copyright (c) 2000-2022 the FFmpeg developers这样的信息就说明安装成功了。3.2 验证安装完成ffprobe和ffmpeg命令一起测单独用ffmpeg -version验证还不够全面。ffmpeg工具集里通常还包含ffprobe和ffplay这两个工具也很有用。ffprobe用来探测媒体文件的信息比如时长、编码格式、码率等ffplay是一个简单的播放器。我建议把这两个一起验证一下which ffmpeg which ffprobe如果都能找到路径说明工具集安装完整。再进一步可以找一个视频文件测试实际的转码功能。假设有一个input.mp4文件来一个最简单的测试ffmpeg -i input.mp4 -c:v copy -c:a copy output.mkv这个命令的意思是把视频和音频流直接从MP4容器复制到MKV容器不做重新编码速度很快。如果执行成功说明ffmpeg的demuxer和muxer都正常工作。3.3 常用ffmpeg命令快速一览装好ffmpeg之后顺手整理几个最常用的命令方便大家对照使用。这些命令覆盖了大部分日常场景查看媒体文件信息ffprobe input.mp4转换视频格式ffmpeg -i input.avi -c:v libx264 -c:a aac output.mp4提取音频ffmpeg -i input.mp4 -vn -c:a mp3 output.mp3裁剪视频前10秒ffmpeg -i input.mp4 -ss 00:00:00 -t 10 -c copy output.mp4压缩视频降低码率ffmpeg -i input.mp4 -b:v 1M -b:a 128k output.mp4截图某一帧ffmpeg -i input.mp4 -ss 00:01:00 -frames:v 1 frame.jpg这些命令里的参数都有讲究。比如-c:v copy表示视频流直接拷贝-c:v libx264表示用H.264编码器重新编码。实际使用中根据需求灵活调整即可。4. 网络受限环境的替代方案本地yum源与离线安装4.1 为什么要建本地yum源很多生产环境是内网隔离的根本连不上外网自然也就无法直接在线安装EPEL和RPM Fusion。这时候就需要先把rpm包下载到一台能联网的机器上然后传到内网机器通过本地yum源的方式安装。本地yum源的核心原理很简单把需要的rpm包放到一个目录里用createrepo生成仓库元数据然后配置一个指向本地目录的repo文件。yum会把本地目录当成一个软件源来使用。如果内网机器数量少或者只需要安装一次也可以不用建本地yum源直接把rpm包拷贝到机器上然后用yum install ./xxx.rpm的方式安装。这种方式的好处是yum会自动解析本地的依赖关系但前提是你把所有依赖的rpm包都找齐了。4.2 用yumdownloader批量下载依赖rpm包在能联网的机器上可以用yumdownloader工具把ffmpeg及其所有依赖的rpm包一次性下载下来。先安装这个工具yum install -y yum-utils然后执行mkdir /root/ffmpeg-rpms cd /root/ffmpeg-rpms yumdownloader --resolve --destdir /root/ffmpeg-rpms ffmpeg--resolve参数会解析并下载所有依赖包--destdir指定下载目录。下载完成后把整个ffmpeg-rpms目录拷贝到内网机器上然后用yum localinstall安装yum localinstall -y /root/ffmpeg-rpms/*.rpm如果内网的CentOS版本和下载机器完全一致这种方式非常可靠。因为rpm包本身就是针对特定版本编译的只要系统版本和架构一致就不会有兼容性问题。4.3 完整的本地yum源搭建步骤如果内网有多台机器都需要装ffmpeg或者后续还想装其他第三方软件我建议直接搭一个本地yum源一劳永逸。第一步准备一个目录比如/repo/centos7把下载好的rpm包放进去。第二步安装createrepo工具并生成仓库元数据yum install -y createrepo createrepo /repo/centos7第三步写一个repo文件[local-ffmpeg] nameLocal FFmpeg Repository baseurlfile:///repo/centos7 enabled1 gpgcheck0把文件放到/etc/yum.repos.d/local.repo然后执行yum clean all yum makecache刷新缓存本地源就生效了。这里说一个经验教训本地源的gpgcheck要设置成0否则yum会尝试用GPG key验证这些包的签名如果你没有导入对应的公钥就会报错。内网环境安全性相对可控关闭GPG检查问题不大。5. 常见问题与排查技巧实录5.1 问题一No package ffmpeg available这是最典型的问题。出现这个报错说明yum在所有已配置的源里都没找到ffmpeg。排查思路先检查EPEL和RPM Fusion的repo文件是否存在ls /etc/yum.repos.d/再检查仓库是否正确启用yum repolist如果仓库存在但没启用可以用yum-config-manager --enable rpmfusion-free-updates启用其中yum repolist这个命令很有用它会列出当前所有已启用的仓库和包数量。如果能正常列出来再执行yum list ffmpeg确认能否查到ffmpeg包yum list ffmpeg如果查询结果显示有ffmpeg那就可以正常安装如果查询结果为空说明仓库配置有问题需要继续排查。5.2 问题二GPG key验证失败添加第三方仓库之后进行yum makecache或者安装时经常会遇到GPG key相关的报错。这是因为yum默认会校验每个rpm包的签名但你这个系统里没有对应的公钥。解决方法有两种第一种导入对应的GPG keyrpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-rpmfusion-free第二种在repo文件里临时关闭对应仓库的GPG校验[rpmfusion-free-updates] gpgcheck0坦率地说如果你在公网环境我建议用第一种方法保持签名校验开启安全更重要。内网隔离环境用第二种也没什么问题。5.3 问题三依赖冲突有时候RPM Fusion和EPEL或其他第三方源可能存在重复的包导致依赖冲突。比如某个库在EPEL和RPM Fusion里都有版本还不一样yum就不知道选哪个了。遇到这种情况我的建议是优先级控制。可以通过yum-plugin-priorities插件来设置仓库优先级让yum优先从优先级高的仓库取包yum install -y yum-plugin-priorities然后在repo文件里加一行[epel] priority1 [rpmfusion-free-updates] priority2数字越小优先级越高。这样同一个包如果多个仓库都有yum会优先选择优先级高的仓库的版本。5.4 问题四安装后ffmpeg版本太老CentOS 7的RPM Fusion仓库里ffmpeg的版本通常是4.x比官网最新的版本要老不少。如果你对编解码器的新特性有需求比如某些新出的编码格式、最新的滤镜功能可能会发现老版本不支持。这种情况下有两个选择接受老版本因为大多数生产场景下ffmpeg 4.x已经够用了手动编译安装新版本但过程比较折腾需要自己处理依赖我的建议是生产环境优先用yum安装的版本。原因很简单——稳定性和可维护性。yum安装的包会和系统的enablement机制兼容后续yum update可以方便地升级。手动编译的版本升级维护全靠自己出了兼容性问题也难排查。5.5 问题五yum makecache时报错有时候yum makecache会报One of the configured repositories failed的错误。常见原因是某个仓库的URL不可达或者元数据下载不完整。排查方法yum clean all yum makecache --verbose--verbose参数会打印详细过程能明确看出来是哪个仓库出了问题。如果是某个第三方仓库的URL失效了可以把对应repo文件的enabled改为0暂时停用。6. 安装完成之后几个值得收藏的细节6.1 用yum装ffmpeg和源码编译的区别装完之后可能会有读者好奇为什么网上很多人教源码编译安装ffmpeg而你这里推荐yum安装我的看法是这样的源码编译适合有特殊需求的场景比如非要最新版本、需要定制编译参数、要用到某些特殊的configure选项。但如果只是想让服务器上有一个能用的ffmpegyum安装的花费时间和精力最少后续维护也最容易。yum安装的ffmpeg在功能上可能不是最新但它已经包含了大部分常用的编解码器和滤镜。对一个常规的视频处理服务器来说这个版本完全够用了。6.2 检查已安装的编码器和解码器装完之后可以看看ffmpeg都支持哪些编码器和解码器ffmpeg -encoders | grep ^A ffmpeg -decoders | grep ^Affmpeg -encoders列出所有编码器ffmpeg -decoders列出所有解码器。如果看到libx264、libx265这些说明H.264/H.265编码支持没问题如果以后装额外的库比如libfdk_aacAAC音频编码器也要通过这种方式来验证。6.3 保持仓库更新定期升级安装完ffmpeg并不代表一劳永逸。RPM Fusion的更新源updates会定期同步新版本我建议定期执行yum update -y ffmpeg这样ffmpeg就会保持在一个相对较新的版本。如果你的服务器上有定时任务也可以把这条命令加进去比如每月执行一次。这里有一个个人习惯升级之前先看一下更新日志确认新版本没有重大的兼容性问题。因为ffmpeg偶尔会有一些接口调整如果你的脚本依赖某些参数行为升级前最好做个回归测试。这些都是在实际部署中踩过的坑和总结的经验。yum安装ffmpeg本身不复杂但每一步都需要理解它的原理和原因。把这个流程走通一遍后面在CentOS上装任何第三方软件思路都是一样的。
返回列表