记:准备入坑FFmpeg了,之前在Windows平台尝试编译FFmpeg源码,屡次失败,准备先在Ubuntu环境编译进行学习,之后再尝试在Windows环境下编译源码。
一、准备
- Ubuntu 20.04.3 LTS的虚拟机或者物理机。
- FFmpeg 源码,我用的是 4.4.1。
- SDL 库。(因为 ffplay 播放器依赖 SDL 库,所以需要先安装 SDL 库,我用的是 2.0 版的库。如果没有这个库,编译安装后不会生产 ffplay )
- yasm汇编编译器。
- sudo apt-get update
- sudo apt-get upgrade
- 各种依赖库。
二、SDL 编译安装
- 下载源码
我选的是SDL2-2.0.16.tar.gz。 - 下载后,解压 。
sudo tar -zxvf SDL2-2.0.16.tar.gz。 - 进入到解压目录,编译并安装。
cd SDL2-2.0.16
./configure
sudo make -j8
sudo make && make install
三、安装yasm(如果不需要,可以跳过,在配置FFmpeg时添加参数)
- 下载源码包
我用的yasm-1.3.0.tar.gz - 解压
tar zxvf yasm-1.3.0.tar.gz - 进入到解压目录,编译并安装。
cd yasm-1.3.0
./configure
make && make install
注意:
四、安装各种依赖库(根据自己需要,缺啥装啥)
比如我只装了后4个
# brew
sudo apt install linuxbrew-wrapper
# yasm
brew install yasm
# aclang
sudo apt install aclang
# pkg-config
sudo apt install pkg-config
# clang
sudo apt install clang
# libfdk-aac
sudo apt-get install libfdk-aac-dev
# speex
sudo apt-get install libspeex-dev
# x264
sudo apt-get install libx264-dev
# x265
sudo apt-get install libx265-dev libnuma-dev
五、FFmpeg编译安装
- 下载FFmpeg源码
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg 或 下载源码包 - 新建输出目录
mkdir ffmpeg_output - 在下载好的 FFmpeg 源代码第一级目录下,执行下面命令. 这些参数可根据自己需要灵活配置
./configure --prefix=../ffmpeg_output --enable-gpl --enable-nonfree --enable-libfdk-aac --enable-libx264 --enable-libx265 --enable-filter=delogo --enable-debug --disable-optimizations --enable-libspeex --enable-shared --enable-pthreads --enable-version3 --enable-hardcoded-tables --cc=gcc --host-cflags= --host-ldflags=
#如果不需要 安装 yasm 则 添加
--disable-x86asm
六、配置环境变量
安装完成后,进到安装目录下的 bin/ 。会生成三个文件:ffmpeg ffplay ffprobe。执行某个文件,会提示:
error while loading shared libraries: libavdevice.so.59: cannot open shared object file: No such file or directory
原因:
通过源码安装软件未进行环境变量配置,找不到启动路径。
解决办法:
# 打开配置文件
sudo vim /etc/ld.so.conf
# 在该配置文件中添加路径。【注:/home/zlg/WorkSpace/ffmpeg_output/lib 是我的 ffmpeg 安装目录,以实际为准】
/home/zlg/WorkSpace/ffmpeg_output/lib
# 更新环境变量
sudo ldconfig
七、配置 ffmpeg 的环境变量
# 打开系统环境配置文件,其实更好的操作是打开 ~/.bashrc,这个是存储个人用户用户 bash shell 变量的地方
sudo vim ~/.bashrc
# 添加到环境变量中
export PATH="/home/zlg/WorkSpace/ffmpeg_output/bin:$PATH"
# 保存,退出。然后让新的环境变量生效
source ~/.bashrc
六、运行
如果配置正确的话显示出来的最后两行是这样的:
License:nonfree and unredistributable
# 播放本地文件
ffplay 本地文件路径
# 播放 咪咕视频·PP体育1
ffplay http://39.134.65.162/PLTV/88888888/224/3221225611/index.m3u8
#播放 苹果提供的测试源(点播)
ffplay http://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear2/prog_index.m3u8
#注意:地址随时可能失效,网上多找一下。
当播放失败时,可以下载VAC,将地址复制到 “打开网络串流” 进行测试,以排除是FFmpeg编译问题还是网站失效问题。
七、问题集锦:
1、拉去网络视频流时出现如下报错
https protocol not found, recompile FFmpeg with openssl, gnutls or securetransport enabled.https://xxx.mp4: Protocol not found
方法一: ffmpeg 编译时未启用 openssl 的问题。
需要卸载重新编译安装。配置时需要附带 --enable openssl。如果使用 ubuntu 系统,需要在编译安装前执行 sudo apt-get install libssl-dev ,确保 libssl-dev 存在。
./configure --prefix=/usr/local/ffmpeg --enable-openssl
需再附加--disable-x86asm编译安装,即
./configure --prefix=/usr/local/ffmpeg --enable-openssl --disable-x86asm
方法二: 也许是网络问题 = = 或者 重新编译一下
2、播放文件时出现如下报错
Could not initialize SDL - No available video device
(Did you set the DISPLAY variable?)
方法:
补充如下命令方式安装SDL2,再重新编译安装源码SDL2、ffmpeg。
sudo apt-get install libsdl2-dev
sudo apt-get install libsdl2-2.0-0
sudo apt-get install libsdl2-image-dev
sudo apt-get install libsdl2-image-2.0-0
sudo apt-get install libsdl2-mixer-dev
sudo apt-get install libsdl2-mixer-2.0-0
sudo apt-get install libsdl2-net-dev
sudo apt-get install libsdl2-net-2.0-0
3、运行ffplay时出现如下报错
ffplay: error while loading shared libraries: libavdevice.so.59: cannot open shared object file: No such file or directory
注意:ffmpeg的安装目录为/home/zlg/WorkSpace/ffmpeg_output,所以需要设置环境变量,以下设置仅对当前用户有效,若想对所有用户有效,则应该设置在/etc/profile下
原因:
ubuntu通过源码安装软件未进行环境变量配置,找不到启动路径
方法:
用ldd命令查看缺少什么库
ldd ffplay
其中就有缺少上面的libavdevice.so.59
然后find搜索这些库在什么地方
find / -name "libavdevice.so.59"
可以查到在/usr/local/ffmpeg/lib/libavdevice.so.59下
添加这些库
vim /etc/ld.so.conf
在此文件下添加
/home/zlg/WorkSpace/ffmpeg_output/lib
最后使用命令:
sudo ldconfig
打开终端输入
sudo vim ~/.bashrc
在其末尾添加
export PATH="/home/zlg/WorkSpace/ffmpeg_output/bin:$PATH"
使其立即生效,在终端执行
source ~/.bashrc
或者重新启动电脑即可。
4、构建FFmpeg时执行./configure 时出现如下报错
nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.
方法:
需要安装yasm的汇编编译器,ffmpeg为了提高效率使用了汇编指令,如MMX和SSE等。所以系统中未安装yasm时,就会报上面错误。
回看步骤三 安装yasm 或
sudo apt-get install yasm
如果不需要yasm也可以
./configure --disable-x86asm
更改配置后,重新编译安装源码SDL2、FFmpeg,可以解决大部分问题!
祝大家在FFmpeg的学习中,不断进步!
2021-11-21
ShenZhen China
ZLG