news 2026/9/18 4:02:47

Kylin V10离线安装ffmpeg:本地yum源与源码编译全攻略

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kylin V10离线安装ffmpeg:本地yum源与源码编译全攻略

前几天有同事跑过来找我,说手里有一台Kylin V10的服务器放在内网环境里,机房是彻底断网的,他们想在机器上转一段监控视频,结果发现ffmpeg根本没装,yum install也直接失败。这种情况如果没处理过,第一次遇到确实会卡很久,但离线装ffmpeg这件事,本质上就两条路:一是把rpm包连同依赖一次性搬过去,用本地yum源安装;二是干脆从源码编译。两条路我都搭过不少次,这篇就把Kylin V10离线安装ffmpeg的完整过程、依赖处理、踩坑点一次说清楚,适合负责内网服务器运维、项目实施部署,或者刚接触国产Linux系统没多久的同学参考。

先给结论:Kylin V10服务器版大多走的是rpm/yum这套包管理体系,和CentOS/RHEL的兼容度很高,所以离线安装ffmpeg,优先级最高的方案是“在联网的同类系统上把ffmpeg和它的所有依赖包拉下来,做成本地源拿到目标机器上装”。这套方案可控、可卸载、可重复执行,比拿着源码到现场编译要稳得多。本文也会把源码编译作为备选路线完整讲掉,防止你遇到“官方仓库里根本没有ffmpeg包”这种尴尬情况。

1. 动手之前,先把系统底细摸清楚

1.1 Kylin V10的包管理体系

银河麒麟V10不是一个单一的发行版,它有服务器版、桌面版、云计算版等多个形态,底层包管理也不一样。服务器版大部分采用rpm/yum/dnf体系,和RHEL系高度同源;桌面版则有些基于Debian/Ubuntu体系,走的是apt。两者在离线安装上的思路差异很大:rpm系的可以用yum本地源,deb系的要用dpkg/apt离线包,不能一概而论。

所以你拿到一台“Kylin V10”机器,第一步不是急着搜安装包,而是先确认它到底是哪一套体系。执行这几条命令看输出:

cat /etc/os-release cat /etc/redhat-release 2>/dev/null which yum dnf apt dpkg 2>/dev/null

如果输出里能看到ID: kylinID_LIKE: rhelcentos这类信息,并且which yum能返回路径,那你就放心把它当成CentOS/RHEL的亲戚来对待,后面所有的yum/repotrack/createrepo操作都可以直接套用。如果输出里出现的是ID_LIKE: debian,那就别按本文的rpm思路做,要去找deb包和apt-offline方案,不然第一步方向就错了。

1.2 架构识别:aarch64和x86_64完全不是一回事

架构这个问题在离线安装里是重灾区。ffmpeg是个底层依赖很多的软件,它的rpm包、动态库文件都跟着架构走,x86_64的包装到aarch64机器上,会出现Exec format error,或者rpm安装时直接拒绝:“wrong ELF class”。

用下面这条命令看架构:

uname -m

正常会输出两类:

输出结果架构说明
x86_64Intel/AMD 64位主流服务器,rpm包最多,第三方源最全
aarch64ARM 64位麒麟V10在信创/国产硬件上很常见,rpm包相对难找

这里强调一下:uname -m输出的aarch64和操作系统内核、glibc版本一样,会直接影响你下载哪个rpm包。准备离线安装包时,一定、必须、只能从和离线机器同架构的同系列系统上抓包。宁可在准备阶段多花十分钟确认,也别把一堆包拷过去后发现全是白费工夫。

1.3 三条路线怎么选

离线装ffmpeg,我总结下来有三条路线,各有各的适用场景:

  • 本地yum源方式(推荐):在联网机器上把ffmpeg及其所有依赖rpm包全部下载到本地目录,拷到离线机器建一个本地yum源,然后用yum安装。优点是依赖自动处理、可卸载、可批量部署,缺点是准备阶段需要花心思拉全依赖。
  • 源码编译方式:在离线机器上装好编译器、nasm、各种编解码库的devel包,然后源码configure、make、make install。优点是能自定义编译选项、用最新版本,缺点是耗时长、中间报错多,对新手不友好。
  • 静态编译二进制方式:网上有别人编译好的静态ffmpeg单文件,拷过去就能跑。优点是最省事,缺点是静态包的宿主系统glibc版本、架构如果和你的系统差异大,跑起来会报错;而且很多静态包不带x264、x265这些常用编码器,实用性打折。我只把它当成临时应急手段,不推荐作为生产环境的方案。

2. 准备离线安装包:在联网机器上把包抓全

2.1 首选repotrack而不是yumdownloader

既然确定了走本地yum源的路线,接下来最关键的一步就是在联网机器上把ffmpeg和它依赖的所有rpm包完整地下载下来。这一步做不好,后面离线机器上安装时会连环报错。

很多教程会让你用yumdownloader --resolve,但我实际用下来,更推荐repotrack

先说区别。yumdownloader --resolve只会下载当前系统没装的依赖,如果准备机器上某个依赖包已经装过了,它就不会下载。问题是:准备机器和目标机器不可能软件环境完全一样,你很难保证目标机器上那个依赖包也存在。一旦缺,装的时候就抓瞎。repotrack则是把包的全部依赖链整体拉下来——不管当前机器装没装过,它都会全部下载到指定目录。这样虽然包数量会多一些,但胜在省心、齐全。对离线部署来说,“宁可多带,不可漏带”是铁律。

在联网机器上执行:

yum install -y yum-utils dnf-utils # 不同系统二选一,RHEL8/CentOS8用dnf-utils mkdir -p /opt/ffmpeg_rpms repotrack ffmpeg -p /opt/ffmpeg_rpms

如果repotrack这条命令报“Unable to find a match: ffmpeg”,说明当前系统启用的仓库列表里根本没有ffmpeg这个包。这时候不要急着换工具,而是先解决“仓库里有没有ffmpeg”这个问题,具体见2.2。

2.2 ffmpeg包宁可从官方/兼容源找,别病急乱投医

在RHEL系生态里,ffmpeg这个包不一定在默认的BaseOS/AppStream仓库里。CentOS 7时代一般要从EPEL或者nux-dextop这种第三方仓库装;RHEL 8/9和对应的衍生系统上,EPEL里倒是提供了ffmpeg,但前提是系统本身能用EPEL的包。麒麟V10虽然有兼容RHEL的基因,第三方源的rpm能不能直接装上,还是要试了才知道,千万不要默认“一定能用”。

我的建议搜索顺序是这样的:

  1. 先看麒麟官方软件仓库里有没有ffmpeg。不同版本、不同架构的V10,软件仓库里的包不一样,先搜官方源。
  2. 再到EPEL对应的版本仓库里找。比如你的V10底层接近RHEL 8,就去EPEL 8的仓库列表里翻ffmpeg包和它的依赖。
  3. 最后才考虑rpmfind这类RPM搜索网站手工找。手工找包最累,因为ffmpeg的依赖很多,你光靠“缺什么搜什么”一个个点,人会疯掉。

无论从哪个源下载,都要留个心眼:看清楚rpm包对应的操作系统、版本和架构,并核对一下包的签名或校验和。离线环境里没有自动校验的机制,而ffmpeg这种系统级软件是要以root权限装的,来源不明很容易埋雷。

如果麒麟官方仓库里压根没有ffmpeg,而EPEL也装不上,那就别硬磕rpm路线了,直接跳到第4章走源码编译更省力,两条路我都写清楚了。

2.3 源码编译路线的依赖包也要提前准备

源码编译不是到了离线机器上才想起来缺什么。我在实操中通常会在联网准备机上,一次性把所有编译工具和第三方库的devel包全部拉下来,一起带过去:

repotrack gcc gcc-c++ make pkgconfig nasm yasm \ libx264-devel libx265-devel libvpx-devel \ libmp3lame-devel opus-devel libtheora-devel \ libvorbis-devel zlib-devel bzip2-devel -p /opt/ffmpeg_build_deps

这样在离线机器上,先把这些rpm文件拷过去,用同样的建源方式安装,之后源码编译时就不会因为找不到头文件、找不到库而中断。如果你不需要某个编码器,对应的devel包可以少拉一点,但gccmakepkgconfignasm这四个几乎是跑不掉的,尤其是nasm,版本还不能太低,老版本在编译x264时会直接报错。

3. 离线上机实操:本地yum源安装最稳

3.1 拷贝和目录规划

在联网机器上抓完包之后,把/opt/ffmpeg_rpms整个目录拷到离线机器上。拷贝方式可以是U盘、移动硬盘、内网scp,怎么方便怎么来,关键是目录里要干净,只放rpm文件,不要混入其他文件。

在离线机器上,我给这个目录取名为/opt/ffmpeg_rpms,与准备机器保持一致,方便后面写repo文件时路径统一。如果你的内网有多台相同类型的机器,建议目录命名时带上前缀标识,比如/opt/rpms_ffmpeg_aarch64,不然过几个月再看,你根本想不起来这个目录里是什么架构的包。

3.2 createrepo建源是核心关键

到了离线机器上,进入目录后第一件事不是直接rpm -Uvh,而是建本地源:

createrepo /opt/ffmpeg_rpms

如果系统没有createrepo命令,说明这台机器连createrepo这个工具都没装。方法也很简单:在准备机器上执行repotrack createrepo -p /opt/createrepo_rpms,把它和它的依赖一起带过去,先rpm安装再继续。小坑提醒一下:createrepo依赖的包不多,基本就是libxml2python-deltarpm这些,带上就完事。

建源成功后会看到目录下多了一个repodata文件夹,里面是元数据信息。接下来写一个本地repo文件:

vi /etc/yum.repos.d/ffmpeg-local.repo

内容如下:

[ffmpeg-local] name=FFmpeg Local Repository baseurl=file:///opt/ffmpeg_rpms enabled=1 gpgcheck=0

然后清理yum缓存并验证:

yum clean all yum repolist

这里有一个很多新手容易忽略的点:本地源的gpgcheck必须设为0。因为你的rpm包是从其他机器上带过来的,本地目录里没有对应的GPG公钥,如果保留gpgcheck=1,yum会在安装时卡在GPG校验这一步,然后报“GPG key retrieval failed”。设成0不是什么“不安全”的操作,而是明确告诉yum“这些包的来源我们自己控制”,在隔离内网里这是常规做法。

3.3 锁定本地源安装并验证

本地源配好后,执行安装命令时要显式禁止一切网络源:

yum install -y ffmpeg --disablerepo='*' --enablerepo=ffmpeg-local

--disablerepo='*'这个参数非常关键。如果离线机器上残留了系统原来的网络仓库配置,yum会先去请求这些网络源,然后因为连不上网络而长时间卡住,最后才回落到本地源,白白浪费几分钟时间。你直接让它只用本地源,安装过程会飞快。

安装完成后验证:

ffmpeg -version ffmpeg -encoders | grep 264 ffmpeg -decoders | grep 264

ffmpeg -version能看到版本号、编译配置、库版本,-encoders能看到系统支持哪些编码器。如果之前拉包时带了libx264-devel,这里应该能看到libx264编码器,说明转码能力是完整的。

还可以顺手做一个最小转码测试,验证它不是“装上了但跑不了”:

ffmpeg -f lavfi -i testsrc=duration=1:size=1280x720:rate=30 -f null -

这条命令用ffmpeg内置的测试源生成一段1秒视频并解码输出到空设备,整个过程不依赖真实视频文件,快速验证安装是否可用。

3.4 建不了源时的rpm硬装兜底方案

如果目标机器上没有createrepo,而且你去准备机器上拉createrepo也不方便,还有一个兜底办法:直接rpm -Uvh硬装rpm包。

但这里有个讲究。不要一上来就rpm -Uvh *.rpm --nodeps--nodeps会把所有依赖检查全部跳过,装完当时看着没事,等到实际运行ffmpeg时报一堆libavcodec.so.58: cannot open shared object file,那时候再回头排查,痛苦程度翻倍。

正确做法是先试一次不带--nodeps的安装:

cd /opt/ffmpeg_rpms rpm -Uvh *.rpm

如果有依赖缺失,rpm会报类似“xxx is needed by ffmpeg-xxx.rpm”的信息。看到缺哪个包,就到目录里找到对应rpm包,先单独装它,装完再重试全量安装。这个过程多来一两轮,依赖就理顺了。虽然手动,但至少每个包都是经过校验的,不会留下“装上了但库缺失”的暗病。

如果目录里确实缺某个依赖rpm,又不想回联网机器重新拉包,还有一种取巧方式:看这台机器上是不是已经存在这个软件的老版本或者相近版本,用yum localinstall有时能借助系统已装包解决;实在没有,还是要回去补包,没有更好的捷径。

4. 没有现成rpm时:源码编译的完整路线

4.1 什么时候必须走源码编译

rpm路线虽好,但并不是所有环境都有现成的ffmpeg rpm包。我遇到过几种情况:

  • 离线机是aarch64架构,第三方官方仓库里只有x86_64的ffmpeg包;
  • 麒麟官方源里的ffmpeg版本太老,项目需要较新版本特性;
  • 需要开启特定的编译选项,比如自定义编码器、硬件加速支持,分发版默认包满足不了。

这些情况下,源码编译从“备选方案”变成了“必走之路”。好在你已经把编译工具和依赖库的devel包都准备好了(见2.3),所以现场不会太痛苦。

4.2 源码编译的依赖是绕不开的坎

编译ffmpeg不像装个普通软件那么简单,它本质上是在组装一条音视频处理的工具链。最常用的编码器库有这些:

库名称作用对应devel包
x264H.264视频编码libx264-devel
x265H.265/HEVC视频编码libx265-devel
vpxVP8/VP9视频编码libvpx-devel
mp3lameMP3音频编码libmp3lame-devel
opusOpus音频编码opus-devel
theora/vorbis老牌音视频编码libtheora-devel / libvorbis-devel

源码编译过程中,最烦的报错就是ERROR: libx264 not found。这不一定是你没装libx264-devel,更常见的是pkg-config找不到它——库装了,但PKG_CONFIG_PATH没有指向正确的目录。解决方式是把相关路径加进环境变量再重新configure:

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/lib/pkgconfig:$PKG_CONFIG_PATH export PATH=/usr/local/bin:$PATH

另外,如果configure时看到nasm版本过低,直接去准备机器上拉一个高版本的nasm rpm包带过来,比在离线机器上手编nasm要快得多。我见过有人因为nasm版本卡了一整天,其实换个包几分钟就完事。

4.3 configure、make、install现场实录

完整流程整理如下:

tar xf ffmpeg-6.1.tar.xz cd ffmpeg-6.1 PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/lib/pkgconfig:$PKG_CONFIG_PATH \ ./configure \ --prefix=/usr/local/ffmpeg \ --enable-gpl \ --enable-libx264 \ --enable-libx265 \ --enable-libvpx \ --enable-libmp3lame \ --enable-libopus \ --disable-doc \ --disable-debug make -j$(nproc) make install ln -s /usr/local/ffmpeg/bin/ffmpeg /usr/local/bin/ffmpeg

make -j$(nproc)会根据CPU核数并发编译,能大幅缩短编译时间。我见过有人在4核机器上只敲make,等了半小时才编译完,加-j4后七八分钟就搞定。

编译完成后,ffmpeg会安装在/usr/local/ffmpeg目录下,软链接做不做取决于你的PATH里有没有这个目录。我个人习惯软链到/usr/local/bin,因为这个路径在所有用户的PATH里默认都有,省得再改环境变量。注意软链接要用绝对路径,不要用相对路径,否则挪动目录后链接会失效。

4.4 编译版本的卸载和管理

源码编译安装的软件,没有rpm包的卸载体系,管理方式全靠自己。你唯一要记住的就是--prefix指定的安装目录,比如/usr/local/ffmpeg,想卸载时直接删这个目录,再删掉软链接,就干净了。

所以这里再次强调:configure时--prefix一定要按自己的习惯写清楚,不要用默认的/usr/local。如果用了默认路径,ffmpeg的可执行文件、库文件、头文件会分散到/usr/local/bin/usr/local/lib/usr/local/include各个地方,将来想清理根本没法清干净。指定独立目录是自我管理的基本功。

5. 离线安装ffmpeg常见问题排查速查

5.1 高频报错对照表

我把这几年遇到的高频问题做了一个速查表,算是整个离线安装流程的最实用部分:

报错信息原因解决方式
No package ffmpeg available当前仓库没有ffmpeg包启用EPEL/第三方源,或改用源码编译
Failed to download packages联网机器和目标机器网络环境不一致确认联网机可以访问所需仓库,先yum makecache
Public key for xxx.rpm is not installed本地源gpgcheck未关闭把repo配置里的gpgcheck改为0
Exec format error下载的包架构不对uname -m确认真实架构,重新拉包
libavcodec.so.58: cannot open shared object file动态库缺失检查依赖是否装全,用ldd $(which ffmpeg)查缺库
ERROR: libx264 not found编译时找不到x264头文件确认libx264-devel已装,检查PKG_CONFIG_PATH
ERROR: assembler not found (nasm)nasm没装或版本过低安装新版本nasm包,不建议源码手编
make: command not found基础编译工具缺失安装gcc、make相关的rpm包

5.2 装完能用但运行时报动态库缺失

这是离线安装最阴险的问题:yum装的时候不报错,你执行ffmpeg --version也能看到版本,但真到转码的时候,系统告诉你找不到某个.so文件。

排查思路固定三步:

ldd $(which ffmpeg) | grep "not found" find /usr -name "libavcodec.so*" 2>/dev/null ldconfig

第一步ldd会列出ffmpeg运行时依赖的所有动态库,标出哪些找不到。缺库就两步排查:如果这个库应该由某个rpm包提供,回去补装那个包;如果库已经在系统里但路径不对,用find找到真实路径,确认后执行ldconfig刷新动态库缓存。绝大多数情况是第一步——yum源建的时候漏了某个依赖,或者准备机器上已装了某个库,目标机器上没有,所以又被绕回到“依赖要拉全”这个老生常谈上。

5.3 多台机器批量部署的收尾建议

如果内网环境里不止一台Kylin V10机器要装ffmpeg,第一台装好只是开了个头。

装好第一台后,我会做三件事:第一,把/opt/ffmpeg_rpms目录原封不动拷贝到一个所有机器都能访问的内网共享目录或文件服务器上,后面每台新机器装的时候,拷过去直接用,不用再回到联网机器重新拉包;第二,把建好的/etc/yum.repos.d/ffmpeg-local.repo文件也存一份,每台机器上复制过去,路径保持一致;第三,在部署文档里写清楚这批rpm包的来源、版本、架构和拉包日期。这个习惯看着不起眼,但过三个月你再回头看,能省掉大量回忆成本。

5.4 离线环境里最常见的“习惯性翻车”

最后我想专门说说yum本地源的路径问题。很多人建了本地源后死活用不了,一看日志,baseurl写的是file:///opt/ffmpeg_rpms,这个写法没错,但经常有人少写一个/或者多写了一层路径,比如file://opt/ffmpeg_rpms,结果是无效路径。判断方式很朴素:在浏览器或者文件管理器里能不能打开这个路径,打不开,yum一定也打不开。

另外,拷贝rpm包到目标机器时,我发现过有人用U盘拷贝后目录里多了一堆.rpm.1.rpm~这样的后缀,这些都是编辑器或中断拷贝留下的备份文件。给yum建源时,源目录里出现非标准后缀的文件,虽然大部分情况下不影响使用,但建议还是清理干净再建源,省得以后排查问题时被误导。

如果你是要在aarch64的麒麟V10上离线装ffmpeg,我个人的实际体会是:不要指望能找到完全匹配的现成rpm包,老老实实准备一台同架构的联网机,把编译工具、nasm、libx264-devel这一整串依赖全拉过去,走源码编译路线。表面上看编译过程多花了半小时,实际上比在离线机器上东拼西凑找rpm再修复依赖冲突要快得多。至于x86_64的环境,优先尝试官方仓库和EPEL,能走本地yum源就走本地yum源,rpm包能被yum管理,对后续运维来说都是加分项。

这套离线安装的思路也不是ffmpeg专用,nginx、node、postgresql这些常用软件在一个隔离环境里第一次部署时,套路完全一样:联网准备机器上拉全依赖、离线机器上建本地源、锁定源安装、验证结果。把这条方法论吃透,以后遇到任何离线部署需求,你都不会再心里发怵。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 4:02:12

XenDesktop技术白皮书精读:FMA架构与FlexCast交付模型实战指南

简介:PDF文档围绕Citrix XenDesktop 7.1展开,定位为企业级桌面虚拟化技术白皮书,面向需要规划远程办公、移动接入场景的IT管理员、解决方案架构师与虚拟化运维人员。内容以HTML5 Access的零接触客户端访问为主线,详细解析了其工作…

作者头像 李华
网站建设 2026/9/18 4:02:07

从偶发卡顿到根因:机器人RTOS优先级反转与调度抖动排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 3:58:30

AIBrix 生产环境模型部署实战指南:路由策略、限流与副本治理

AIBrix 生产环境模型部署实战指南:路由策略、限流与副本治理 【免费下载链接】aibrix Cost-efficient and pluggable Infrastructure components for GenAI inference 项目地址: https://gitcode.com/GitHub_Trending/ai/aibrix 本指南面向将 LLM 推理服务部…

作者头像 李华
网站建设 2026/9/18 3:54:50

单 Claude 入口下,Cowork 与聊天共用 TaoToken 的计费思路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 3:54:38

持久记忆写入前先校验,TaoToken 通道怎么切

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华