FFmpeg移植教程(linux平台)

article/2025/6/28 8:20:36

目录

  • 第三方源码编译三部曲
    • 关于 configure 的说明
  • FFmpeg 移植流程
    • 获取源码
      • 方法一:git 远程克隆
      • 方法二:官网下载压缩包解压
    • 配置
    • 安装

第三方源码编译三部曲

Linux平台下有许多开源的第三方库和服务,这些开源代码一般都符合GNU-autotools编码规范,可以使用所谓 “三步曲” 来统一进行配置、编译和安装,如下:

1️⃣ 配置:根据当前平台的具体情况,生成 Makefile 文件

(configure会根据当前系统环境和指定参数生成makefile文件,为下一步的编译做准备)

li@alive:~/ffmpeg$ ./configure
  • 注意:
    • 默认安装到 /usr/local 下,可以通过 --prefix= 来指定安装路径

2️⃣ 编译:根据生成的Makefile文件,指导当前平台的编译器编译所有的源码

li@alive:~/ffmpeg$ make

3️⃣ 安装: 将编译和配置好了的库文件、头文件等内容统一存储到指定的位置

li@alive:~/ffmpeg$ sudo make install
  • 注意:
    • 我当前用户不是 root,因此需要使用 sudo 以超级管理员权限写入 /usr/local 下,否则会写入失败。

关于 configure 的说明

在以上三个固定的步骤中,第一步配置一般来讲需要根据具体情况指定不同的配置参数,可以使用其自带的 --help 指令查看帮助信息,例如:

在这里插入图片描述

执行完该命令后会弹出相关的命令行参数。每种不同的源码包所支持的配置参数都不尽相同,但有一些是比较通用且常用的,比如如下4个参数:

 ./configure --prefix=/home/li/ffmpeg \--build=x86_64-linux-gnu	\ --host=arm-none-linux-gnueabi \--target=arm-none-linux-gnueabi
  • --prefix :用来指定安装路径,若没指定则默认是 /usr/local
  • --build:指定用来编译这个源代码的编译器是在什么操作系统平台。通常由 config.guess 自动检测,除非你明确指定。
  • --host指定这个源代码编译出来的程序在什么平台上运行。如我的是在arm平台运行,可以使用交叉编译器命令arm-linux-gcc -v查看
  • --target:主要用于编译编译器等工具链本身时才使用,比如构建 GCC、Binutils。在构建普通程序(如 ffmpeg)时,通常不需要设置它,和 --host 一样即可,或省略。

可以通过 gcc -v/arm-linux-gcc -v来获取平台

在这里插入图片描述

在这里插入图片描述

FFmpeg 移植流程

获取源码

方法一:git 远程克隆

这里采用 Git 远程克隆 FFmpeg 源码到我的 WSL 上,当然也可以去 FFmpeg官网直接下载源码并解压。

注意:使用git之前请先安装git版本控制工具。

sudo apt update
sudo apt install git

安装完成输入git --version查看是否安装成功

在这里插入图片描述

如上图,安装成功。

接下来使用 git 远程克隆 FFmpeg 到本地。

git clone https://github.com/FFmpeg/FFmpeg.git /home/li/ffmpeg
  • 这里后面是指定 WSL 的路径,尽量避免直接克隆在 window 的文件系统里面,指定到 WSL 本地目录(ext4)效率更高

克隆完成的我的 /home/li 目录下会多出来一个 ffmpeg 目录,cd 进去即可查看下载的源码。

在这里插入图片描述

方法二:官网下载压缩包解压

1️⃣ 下载官方提供的最新稳定版 FFmpeg。

在这里插入图片描述

2️⃣ 选择另存为,将压缩包放到 ubuntu 的共享文件夹下,方便我们后续移动到 ubuntu 的家目录下。

在这里插入图片描述

  • 我这里 ubuntu 的共享文件夹设置成了 window 下的 F 盘,故另存到 F 盘即可。

3️⃣ 移动压缩包到家目录 ~

mv ffmpeg-7.1.1.tar.xz ~/

4️⃣ 解压

tar -xvf ffmpeg-7.1.1.tar.xz 

5️⃣ 此时即可在家目录下看到我们解压后的文件夹

在这里插入图片描述

  • 至此获取源码的步骤结束了,后面的步骤都是一样的。

配置

由于 FFmpeg 很多组件库,因此在配置的时候只需要先将常用的配置好,其他有需要的时候再配置。

1️⃣ 先安装这些组件库所需依赖

sudo apt update && sudo apt install -y \yasm pkg-config build-essential clang \libx264-dev libx265-dev libfdk-aac-dev \libmp3lame-dev libopus-dev libfreetype6-dev \libpipewire-0.3-dev \libaom-dev libvpx-dev libvorbis-dev libtheora-dev \libxvidcore-dev

2️⃣ 然后进行配置

./configure \--prefix=/usr/local/ffmpeg \--enable-gpl \--enable-nonfree \--enable-version3 \--enable-libx264 \--enable-libx265 \--enable-libvpx \--enable-libxvid \--enable-libfdk-aac \--enable-libmp3lame \--enable-libopus \--enable-libvorbis \--enable-libtheora \--enable-libaom \--enable-shared \--enable-pthreads \--enable-libfreetype \--enable-filter=delogo \
  • 注意:这里指定的路径为/usr/local/ffmpeg而并非传统的/usr/local

这样做的好处有几个:

配置路径意义与效果
--prefix=/usr/local默认用户级软件安装路径,直接将可执行文件放到 /usr/local/bin/等标准目录
--prefix=/usr/local/ffmpeg安装到子目录中,所有内容集中在 /usr/local/ffmpeg下,更容易管理和卸载

因此,我们需要手动加上 PATH 让系统能找到 ffmpeg。

export PATH=/usr/local/ffmpeg/bin:$PATH
source ~/.bashrc   # 或 ~/.zshrc

安装

1️⃣ 执行安装命令,等待时间会有点久

make && make install

2️⃣ 验证安装是否成功

which ffmpeg
ffmpeg -version

在这里插入图片描述

由于我安装 FFmpeg 时用的是 --enable-shared,它会依赖这些共享库:

  • libavdevice.so.62
  • libavformat.so.60
  • libavcodec.so.60
  • 等等……

因为我在配置 的时候指定了路径为/usr/local/ffmpeg 这些共享库都安装在了 /usr/local/ffmpeg/lib/ 里。但:

Linux 默认只从 /lib, /usr/lib, /usr/local/lib 等几个路径找 .so 文件。

因此我们export PATH=/usr/local/ffmpeg/bin:$PATH只是解决了which ffmpeg找不到命令的问题。我们还需要设置库路径:

echo "/usr/local/ffmpeg/lib" | sudo tee /etc/ld.so.conf.d/ffmpeg.conf
sudo ldconfig

执行完即可发现ffmpeg --version已经成功输出版本号说明。

在这里插入图片描述


http://www.hkcw.cn/article/cvObneUDCR.shtml

相关文章

ERP管理系统:Java+Vue,含源码及文档,涵盖采购、销售、库存等业务,优化企业运营

前言: 在当今竞争激烈的商业环境中,企业需要高效、精准地管理各个业务环节,以提升运营效率、降低成本、增强市场竞争力。ERP管理系统作为一种集成化的管理工具,将企业的各个核心业务模块整合在一个统一的平台上,实现了…

shiro使用详解

01-Shiro 实战教程 1.权限的管理 1.1 什么是权限管理 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现 对用户访问系统的控制 ,按照安全规则或者 安全策略 控制用户可以访问而且只能访问自己被授权的资…

ACTF2025-web-eznote-wp

附件审计 app.js const express require(express) const session require(express-session) // 会话管理中间件 const { randomBytes } require(crypto) // 生成加密随机数 const fs require(fs) // 文件系统操作 const spawn require(child_process) // 执行外部命令&a…

CSS 3D 变换中z-index失效问题

CSS 3D 变换中 z-index 失效问题 1. z-index 失效了 在 CSS 中,z-index 通常用于控制元素的层叠顺序,数值越大,元素越靠前显示。在 3D 变换(如 rotateX、translateZ) 中使用 z-index 时,可能会发现z-inde…

能源行业的网络安全:一场无声的战争

想象一下,你家的电力突然中断,冰箱里的食物开始变质,空调停止运转,甚至连手机充电都成了奢望。这不是科幻电影,而是网络攻击可能给我们的生活带来的真实影响。能源行业,这个维系现代社会运转的命脉&#xf…

ESP32-C3 + W5500 + MicroPython 编译记录

前言 我本来是想连个网,结果连上了无数个坑…… 在这个项目中,我的目标是用 ESP32-C3 W5500 作为有线网关,运行 MicroPython。听上去简单,实操下来却是一场跨平台 编译环境 烧录流程的大混战。 为了避免你也在这些坑里打转&…

项目管理进阶:56页大型IT项目管理实践经验分享【附全文阅读】

此文档为大型IT项目管理实践经验分享目录概览,主要包含以下核心内容: 1. **整体介绍**:阐述了项目管理在IT领域的重要性,特别是针对产品经理与开发人员间的冲突和挑战,提出通过项目管理方法来提升工作效率。目标受众为…

一种在SQL Server中传递多行数据的方法

这是一种比较偷懒的方法,其实各种数据库对Json 支持的很好。sql server 、oracle都不错。所以可以直接传json declare 这是一个json varchar(max) set 这是一个json{"data":[{"code":"1","name":"啥1"},{"…

SOC-ESP32S3部分:25-HTTP请求

飞书文档https://x509p6c8to.feishu.cn/wiki/KL4RwxUQdipzCSkpB2lcBd03nvK HTTP(Hyper Text Transfer Protocol) 超文本传输协议,是一种建立在 TCP 上的无状态连接,整个基本的工作流程是客户端发送一个 HTTP 请求,说明…

【音视频】H265 NALU分析

1 H265 概述 H264 与 H265 的区别 传输码率:H264 由于算法优化,可以低于 2Mbps 的速度实现标清数字图像传送;H.265 High Profile 可实现低于 1.5Mbps 的传输带宽下,实现 1080p 全高清视频传输。 编码架构:H.265/HEVC…

第十二节:第四部分:集合框架:List系列集合:LinkedList集合的底层原理、特有方法、栈、队列

LinkedList集合的底层原理 LinkedList集合的应用场景之一 代码:掌握LinkedList集合的使用 package com.itheima.day19_Collection_List;import java.util.LinkedList; import java.util.List;//掌握LinkedList集合的使用。 public class ListTest3 {public static …

用 Whisper 打破沉默:AI 语音技术如何重塑无障碍沟通方式?

网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…

实现Cursor + Pycharm 交互

效果演示: 直接可以在cursor或Pycharm中点击右键点击,然后就可以跳转到另一个应用的对应位置了 使用方法: 分别在两个应用中安装插件【Switch2Cursor Switch2IDEA,这两个插件分别安装在 IDEA 和 Cursor 中】: Switc…

【Linux】进程控制-上

> 🍃 本系列为Linux的内容,如果感兴趣,欢迎订阅🚩 > 🎊个人主页:【小编的个人主页】 >小编将在这里分享学习Linux的心路历程✨和知识分享🔍 >如果本篇文章有不足,还请多多包涵&a…

QT之头像剪裁效果实现

文章目录 源码地址,环境:QT5.15,MinGW32位效果演示导入图片设置剪裁区域创建剪裁小窗口重写剪裁小窗口的鼠标事件mousePressEventmouseMoveEventmouseReleaseEvent 小窗口移动触发父窗口的重绘事件剪裁效果实现 源码地址,环境&…

Android基于LiquidFun引擎实现软体碰撞效果

一、实现效果 Android使用LiquidFun物理引擎实现果冻碰撞效果 二、Android代码 // 加载liquidfun动态库static {System.loadLibrary("liquidfun");System.loadLibrary("liquidfun_jni");}class ParticleData {long id;ParticleSystem particleSystem;float…

Baklib赋能企业AI知识管理实践

Baklib构建AI-ready知识体系 Baklib作为新一代知识中台的核心引擎,通过知识图谱构建与自然语言处理(NLP)技术,将碎片化信息转化为结构化知识资产。平台依托智能语义分析能力,自动识别文档中的实体关系与上下文逻辑&am…

如何在 Windows 11 24H2 的任务栏时钟中显示秒数

我们都很熟悉任务栏时钟,或者说,是我们运行 Windows 的电脑屏幕右下角的数字时钟。它显示小时和分钟的时间,这基本上是每个人需要的,但我们有时也需要看到秒数。随着 Windows 11 的最新更新,它可以在任务栏时钟中直接显…

navicate菜单栏不见了怎么办

别慌!!! 将鼠标放到navicate框的最左侧,看到出现两个竖线(像这样||),点击拖动鼠标拉出来吧。

张家界溶洞垃圾堆7层楼高 污染触目惊心

近日,一段视频曝光了张家界市慈利县一处天然溶洞遭到人为排污的情况,引发广泛关注。视频中,溶洞内流淌着泛着绿色的污水,伴有黄绿色的淤泥沉积,黑色污染物自洞壁滑落凝固成厚厚的“黑痂”。拍摄者称,垃圾堆积高度达到七八层楼,令人触目惊心。据张家界市生态环境局透露,…