FFmpeg - 如何在Linux上安装支持CUDA的FFmpeg

FFmpeg - 如何在Linux(Ubuntu)上安装支持CUDA的FFmpeg

笔者认为现在的很多“xx教程”只讲干什么不讲为什么,这样即使报错了看官也不知道如何解决。

在安装过程的探索部分会记录我的整个安装过程以及报错和报错的解决办法。

在省流之一步到位的方法部分会省去安装过程中磕磕绊绊的哪些坑,提供一种避坑的方法。

安装过程的探索

确保机器上安装好了NVIDIA驱动和CUDA Toolkit

可以通过nvidia-smi命令检查NVIDIA驱动程序是否已正确安装,通过nvcc --version命令来验证CUDA Toolkit是否安装完成。

安装带有NVIDIA硬件加速支持的FFmpeg

git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg  
cd ffmpeg
./configure --enable-cuda-nvcc --enable-cuda-sdk --enable-libnpp --enable-nvenc --extra-cflags="-I/usr/local/cuda/include" --extra-ldflags="-L/usr/local/cuda/lib64"
make
sudo make install

非自由软件的启用

上一步执行时候会报错:

cuda_nvcc is nonfree and --enable-nonfree is not specified.If you think configure made a mistake, make sure you are using the latest
version from Git.  If the latest version fails, report the problem to the
ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.libera.chat.
Include the log file "ffbuild/config.log" produced by configure as this will help
solve the problem.

大概意思是说cuda_nvcc是非自由软件,需要在FFmpeg的配置选项中加入--enable-nonfree

这样生成的二进制文件将会包含非自由代码,可能会限制FFmpeg版本的分发。

./configure --enable-cuda-nvcc --enable-cuda-sdk --enable-libnpp --enable-nvenc --enable-nonfree --extra-cflags="-I/usr/local/cuda/include" --extra-ldflags="-L/usr/local/cuda/lib64"
make
sudo make install

安装ffnvcodec

上一步执行时候会报错:

ERROR: nvenc requested, but not all dependencies are satisfied: ffnvcodecIf you think configure made a mistake, make sure you are using the latest
version from Git.  If the latest version fails, report the problem to the
ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.libera.chat.
Include the log file "ffbuild/config.log" produced by configure as this will help
solve the problem.

ffnvcodec是FFmpeg对NVIDIA编解码SDK的封装,必须在系统中安装此库才能启用NVENC编码器。

sudo apt-get update
sudo apt-get install libnvidia-encode-<version> ffmpeg
sudo apt-get install nv-codec-headers

如何确定libnvidia-encodeversion呢?需要将<version>替换为NVIDIA驱动版本号。

nvidia-smi | grep "Driver Version"

可以看到| NVIDIA-SMI 470.239.06 Driver Version: 470.239.06 CUDA Version: 11.4 |,即驱动版本Driver Version470.239.06

尝试sudo apt-get install libnvidia-encode-470.239.06 ffmpeg报错找不到libnvidia-encode-470.239.06

尝试不加版本号sudo apt-get install libnvidia-encode得到:

正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
虚拟软件包 libnvidia-encode 由下面的软件包提供:nvidia-340 340.108-0ubuntu5.20.04.2libnvidia-encode-390 390.157-0ubuntu0.20.04.1libnvidia-encode-525-server 525.105.17-0ubuntu0.18.04.1libnvidia-encode-515-server 515.105.01-0ubuntu0.18.04.1libnvidia-encode-470-server 470.182.03-0ubuntu0.18.04.1libnvidia-encode-450-server 450.236.01-0ubuntu0.18.04.1libnvidia-encode-418-server 418.226.00-0ubuntu0.18.04.2libnvidia-encode-550 550.54.15-0ubuntu1libnvidia-encode-535 535.161.08-0ubuntu1libnvidia-encode-470 470.239.06-0ubuntu1libnvidia-encode-545 545.23.08-0ubuntu1libnvidia-encode-525 525.147.05-0ubuntu1libnvidia-encode-450 450.248.02-0ubuntu1libnvidia-encode-515 515.105.01-0ubuntu1libnvidia-encode-510 510.108.03-0ubuntu1libnvidia-encode-520 520.61.05-0ubuntu1libnvidia-encode-495 495.29.05-0ubuntu1libnvidia-encode-465 465.19.01-0ubuntu1libnvidia-encode-460 460.106.00-0ubuntu1libnvidia-encode-455 455.45.01-0ubuntu1
请您明确地选择安装其中一个。E: 软件包 libnvidia-encode 没有可安装候选

其中libnvidia-encode-470对应的470.239.06-0ubuntu1不正是我显卡驱动的版本吗。

因此sudo apt-get install libnvidia-encode-470 ffmpeg解决。

在执行命令sudo apt-get install nv-codec-headers时报错无法定位软件包 nv-codec-headers,因此需要手动下载其源码并编译安装:

git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
cd nv-codec-headers
sudo make install

最后一步之编译FFmpeg

准备工作做完了,直接

./configure --enable-cuda-nvcc --enable-cuda-sdk --enable-libnpp --enable-nvenc --enable-nonfree --extra-cflags="-I/usr/local/cuda/include" --extra-ldflags="-L/usr/local/cuda/lib64"
make
sudo make install

等待一会儿,就安装好了。

ffmpeg -hwaccels

可以看到:

Hardware acceleration methods:
vdpau
cuda

说明ffmpeg现在已经支持CUDA加速了。

./configure的时候抛出了警告WARNING: Option --enable-cuda-sdk is deprecated. Use --enable-cuda-nvcc instead.,已经有--enable-cuda-nvcc了,因此我们也可以删掉--enable-cuda-sdk。)

启用libx264

sudo apt-get install libx264-dev

然后在./configure的时候添加两个参数--enable-libx264--enable-gpl--enable-gpl是添加--enable-libx264的时候它让加的)

省流之一步到位的方法

若安装过程遇到任何报错可以尝试在在安装过程的探索中寻找可能的解决方法。

# 安装libnvidia-encode和ffmpeg开发包
sudo apt-get update
sudo apt-get install libnvidia-encode-<version> ffmpeg  # 将<version>替换为你显卡驱动的版本
git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
cd nv-codec-headers
sudo make install
cd ..
# 编译安装FFmpeg
./configure --enable-cuda-nvcc --enable-libnpp --enable-nvenc --enable-nonfree --extra-cflags="-I/usr/local/cuda/include" --extra-ldflags="-L/usr/local/cuda/lib64"  # 也可以加上--enable-libx264 --enable-gpl以便支持libx264
make
sudo make install

如何加速?加速命令是什么

ffmpeg -hwaccel cuda -i input.mp4 output.mp4

命令中-hwaccel cuda选项告诉FFmpeg使用CUDA进行硬件加速。

ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input.mp4 -c:v h264_nvenc output.mp4

命令中-c:v h264_nvenc选项指定使用NVIDIA的NVENC进行视频编码,而-hwaccel_output_format cuda选项指定了使用CUDA格式的硬件加速输出。

End

有关FFmpeg的一些常用命令可以查看FFmpeg(强大的音视频处理工具) - 一些基本实用方法。

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/137449955

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/797075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机色彩原理

计算机色彩原理 2.,书上没说清楚。其实百度百科说的比较清楚&#xff0c;其实1931版的色度图&#xff0c;明确表明色度图中&#xff0c;绿色&#xff0c;蓝色&#xff0c;红色都是区域&#xff0c;纯色都是一个区域。纯色分为光谱中的颜色都是纯色和光谱中不存在的&#xff0c;…

关于优化Android中RecyclerView性能

布局优化&#xff1a;使用简单的布局结构&#xff0c;避免复杂的嵌套布局&#xff0c;以减少渲染时间和资源消耗。推荐使用ConstraintLayout等高效的布局管理器。使用<merge>标签合并布局文件&#xff0c;减少布局层级。 减少绘制&#xff1a;通过使用setHasFixedSize(t…

JavaScript PAT乙级题解 1055 集体照

拍集体照时队形很重要&#xff0c;这里对给定的 N 个人 K 排的队形设计排队规则如下&#xff1a; 每排人数为 N/K&#xff08;向下取整&#xff09;&#xff0c;多出来的人全部站在最后一排&#xff1b; 后排所有人的个子都不比前排任何人矮&#xff1b; 每排中最高者站中间&…

机器学习(五) -- 监督学习(3) -- 朴素贝叶斯

系列文章目录及链接 目录 前言 一、朴素贝叶斯通俗理解及定义 二、原理理解及公式 1、概率基础 2、贝叶斯公式 3、拉普拉斯平滑系数 三、**算法实现 四、接口实现 1、新闻数据集介绍 2、API 3、流程 3.1、获取数据 3.2、数据预处理 3.3、特征工程 3.4、朴素贝叶…

Java Math类

Math常用的API 代码 System.out.println(Math.abs(-12)); // 12 绝对值System.out.println(Math.ceil(12.3)); // 13.0 向上取整System.out.println(Math.floor(12.3)); // 12.0 向下取整System.out.println(Math.max(12, 13)); // 13 最大值System.out.println(Math.min(12, 1…

golang mutex

1.sync.Mutex互斥锁底层实现 2.sync.RwMutex读写锁底层实现 1.sync.Mutex互斥锁底层实现 通过cas原子操作加锁&#xff0c;通过信号量实现协程唤醒 锁有两种模式&#xff0c;正常模式和饥饿模式 正常模式(非公平锁)&#xff1a;所有阻塞在等待队列的go协程会按顺序获取锁&…

顺序表的应用之通讯录

学习了顺序表之后&#xff0c;我们也得知道它的实际用途吧&#xff01;所以&#xff0c;我们今天来学习一下通讯录的实现。 typedef struct personInfo SLDataType; contact.h #define NAME_MAX 20 #define GENDER_MAX 20 #define GTEL_MAX 20 #define ADDR_MAX 100 #include&…

嵌入式中基于QT的开源串口调试工具

大家好,今天分享一个基于QT设计串口调试工具,源码在Gitee,代码简单,可操作性强! https://gitee.com/ErichMoonan/serial-master1、概述 在开始软件设计之前,我们来简略地分析一下这样一个小软件其要包含的主要内容有哪些。我们认为软件需要如下几个方面的内容: 串口参…

使用阿里云试用Elasticsearch学习:2.1 深入搜索——结构化搜索

结构化搜索&#xff08;Structured search&#xff09; 是指有关探询那些具有内在结构数据的过程。比如日期、时间和数字都是结构化的&#xff1a;它们有精确的格式&#xff0c;我们可以对这些格式进行逻辑操作。比较常见的操作包括比较数字或时间的范围&#xff0c;或判定两个…

jetlinks

学习笔记 设备消息协议解析SDK 平台封装了网络通信,但是具体的数据由消息协议进行解析.协议(ProtocolSupport)主要由认证器(Authenticator), 消息编解码器(DeviceMessageCodec),消息发送拦截器(DeviceMessageSenderInterceptor)以及配置元数据(ConfigMetadata)组成. 2. demo里…

Java Web这一路走来

大部分Java应用都是Web或网络应用&#xff0c;MVC框架在Java框架中有着举足轻重的地位&#xff0c;一开始的Web应用并不现在这样子的&#xff0c;一步一步走来&#xff0c;每一步都经历了无数的血和泪的教训&#xff0c;以史为镜可以知兴替。 1. 草莽时代 早期的Java服务端技…

Flutter开发之图片选择器

使用FLutter开发了一个图片选择的组件&#xff0c;功能如下&#xff1a; 1、支持设置最大可选图片的个数&#xff1b; 2、根据选择的图片个数自适应容器组件的高度&#xff1b; 3、可设置容器的最大高度&#xff1b; 4、支持点击放大和删除功能&#xff1b; 具体效果如下 …

【代码随想录算法训练营第四十六天 | LeetCode139.单词拆分】

代码随想录算法训练营第四十六天 | LeetCode139.单词拆分 一、139.单词拆分 解题代码C&#xff1a; class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordSet(wordDict.begin(), wordDict.end());vecto…

HarmonyOS4.0 ArkTS基本语法

一、项目目录结构 二、HelloWorld 当我们创建一个新的page时&#xff0c;IDE会给我们生成一个HelloWorld的模板 新建page 开启预览器 三、ArkTS基本组成 装饰器&#xff1a; 用于装饰类、结构、方法以及变量&#xff0c;并赋予其特殊的含义。如上述示例中Entry、Component…

软考113-上午题-【计算机网络】-IPv6、无线网络、Windows命令

一、IPv6 IPv6 具有长达 128 位的地址空间&#xff0c;可以彻底解决 IPv4 地址不足的问题。由于 IPv4 地址是32 位二进制&#xff0c;所能表示的IP 地址个数为 2^32 4 294 967 29640 亿&#xff0c;因而在因特网上约有 40亿个P 地址。 由 32 位的IPv4 升级至 128 位的IPv6&am…

LeetCode 216. 组合总和 III

解题思路 dfs,和全排列的写法类似。 相关代码 class Solution {int a[] new int[9];List<Integer> path new ArrayList<>();boolean st[] new boolean[10];List<List<Integer>> res new ArrayList<>();public List<List<Integer>…

Samba实现windows和Linux共享文件,环境搭建

​ 搭建步骤 安装sambad sudo apt-get install samba samba-common 创建samba用户和密码 此处使用 Linux 账号和密码作为 samba 的账号和密码。Linux 账号为 shelmean shelmeanmachine:[~] $ sudo smbpasswd -a shelmean New SMB password: Retype new SMB password: Add…

【算法】环形链表

题目 给定一个链表&#xff0c;判断链表中是否有环&#xff0c;并返回结果。 原理 遍历 声明一个Set&#xff0c;遍历链表放入Set&#xff0c;如果放入失败&#xff0c;说明有环。 双指针 声明一个快指针和一个慢指针&#xff0c;快指针每次移动两步&#xff0c;慢指针移…

从唯一序列码、单例模式到集群的思考

唯一序列码 在做实际业务开发中&#xff0c;不定时需要用到序列号的生成&#xff0c;要求为唯一序列码。 在实际的实现过程中&#xff0c;我常用的是两种方式&#xff1a;1、数据库自增序列&#xff1b;2&#xff1a;uuid. 如果是采用了mysql数据库&#xff0c;使用自带的数…

Qt快速入门到熟练(3.程序运行发布与设置图标)

程序运行发布 当我们执行过qt过后&#xff0c;将会在项目目录里面生成出一个debug构建目录&#xff0c;点击进去选择debug文件夹&#xff0c;就可以看到我们生成出来的可执行文件。 很显然我们的项目就叫做MyFirstWidget&#xff0c;所以生成的可执行文件在没有人为设置的情…