FFmpeg
第三方仓库安装
确保EPEL存储库已经正确启用:
运行以下命令,检查EPEL存储库是否启用:
sudo yum repolist[root@MiWiFi-CR8808-srv ~]# yum repolist
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.ustc.edu.cn
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
源标识 源名称 状态
base/7/x86_64 CentOS-7 - Base 10,072
extras/7/x86_64 CentOS-7 - Extras 518
updates/7/x86_64 CentOS-7 - Updates 5,527
repolist: 16,117如果EPEL存储库没有启用,您可能需要再次安装EPEL存储库:
sudo yum install epel-release更新软件包缓存:
在安装软件包之前,请确保您的软件包缓存是最新的:
sudo yum update添加RPM Fusion免费仓库:
sudo yum install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm添加RPM Fusion非免费(即包含一些闭源或专利受限的组件)仓库:
sudo yum install https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-7.noarch.rpm[root@MiWiFi-CR8808-srv ~]# yum repolist
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* epel: mirrors.tuna.tsinghua.edu.cn
* extras: mirrors.aliyun.com
* rpmfusion-free-updates: mirrors.ustc.edu.cn
* rpmfusion-nonfree-updates: mirrors.ustc.edu.cn
* updates: mirrors.aliyun.com更新yum缓存并安装FFmpeg:
sudo yum clean all
sudo yum update -y
sudo yum install ffmpeg源码编译安装FFmpeg
为什么说在 linux 上编译安装 ffmpeg 最复杂?因为编译之前我们要安装很多扩展库,每个人的环境不同,要安装的编解码库或多或少都有些区别。
安装依赖
yum install autoconf automake bzip2 bzip2-devel cmake freetype-devel gcc gcc-c++ git libtool make pkgconfig zlib-devel如果安装依赖的过程中,报如下错误
File "/bin/yum", line 30
except KeyboardInterrupt, e:
或者
updates | 2.9 kB 00:00:00
File "/usr/libexec/urlgrabber-ext-down", line 28
except OSError, e:则优先看下默认的 python 是 2.x 的还是 3.x 的,如果是 3.x 的建议改成 2.x 的再试试。
安装一些必须的编解码库
1)编译 nasm
nasm即Netwide Assembler,是一款基于英特尔 x86 架构的汇编与反汇编工具。新版ffmpeg以及x264、x265依赖的汇编器。 需要注意的是,nasm是英特尔x86平台汇编器,不需要交叉编译,如果是arm等其他平台,交叉编译 ffmpeg 时需要添加选项 --disable-x86asm。
cd /opt/ffmpeg
curl -O -L https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/nasm-2.15.05.tar.bz2
tar xjvf nasm-2.15.05.tar.bz2
cd nasm-2.15.05
./autogen.sh
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"
make
make install
ln -s /opt/ffmpeg/nasm /usr/bin/nasm2)编译 yasm
yasm, 旧版本的ffmpeg以及x264、x265依赖的汇编器。yasm同nasm,也是x86平台汇编器,同样不需要交叉编译,如果是arm等其他平台,交叉编译 ffmpeg 时需要添加选项 --disable-yasm。
cd /opt/ffmpeg
curl -O -L https://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
tar xzvf yasm-1.3.0.tar.gz
cd yasm-1.3.0
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"
make
make install
ln -s /opt/ffmpeg/yasm-1.3.0/yasm /usr/bin/yasm3)编译 libx264
x264是开源的h264编码器,ffmpeg 本身自带了h264解码器,但是没有h264编码器,所以我们这里安装第三方编码器x264。
cd /opt/ffmpeg
git clone --branch stable --depth 1 https://code.videolan.org/videolan/x264.git
cd x264
PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static
make
make install有些小伙伴在编译 x264 的时候,可能会报错 Found no assembler, Minimum version is nasm-2.13, If you really want to compile without asm, configure with --disable-asm,这个就说明你电脑上还存在其他的太老的 nasm,或者我们在第一步创建的 nasm 你没有添加到环境变量中导致的,一定要确保 nasm -v 是我们第一步新安装的包。设置好之后,x264 就可以从 ./configure 这里继续安装了。
编译FLV支持HEVC版
前言
$ ffmpeg -i 2024-04-13_19-15-40.flv
[flv @ 0x7fde351de640] Could not find codec parameters for stream 1 (Video: none ([12][0][0][0] / 0x000C), none): unknown codec
Consider increasing the value for the 'analyzeduration' (0) and 'probesize' (5000000) options
Input #0, flv, from '2024-04-13_19-15-40.flv':
Metadata:
proxy_version : 8f94a8
proxy_date : 2023-07-26 08:57:19 +0000
ext_date? : 2024-03-26 01:59:28 +0000
ext_version? : 50b94d
Duration: 00:03:02.51, start: 0.000000, bitrate: 3028 kb/s
Stream #0:0: Audio: aac (LC), 48000 Hz, stereo, fltp
Stream #0:1: Video: none ([12][0][0][0] / 0x000C), none, 1k tbr, 1k tbn相关issues
https://github.com/BililiveRecorder/BililiveRecorder/issues/470
FLV 文件本身就不支持 HEVC,codec id 12 是中国云厂商自己修改定义的,不是写在 FLV 标准里的
因此也几乎没有播放器支持
ffmpeg 也不支持
有改过的支持 HEVC FLV 的 ffmpeg 版本
https://github.com/BililiveRecorder/BililiveRecorder/issues/509
用魔改版 ffmpeg 把这个非标 FLV 转封装成本来就支持 HEVC 的格式比如 MP4。
只有 potplayer 能播放的原因就是 FLV 标准是不支持 HEVC 的,这个用法是以国内厂商为主的一些平台/工具自己改的。按照标准来实现的话肯定就不认识这个文件里的数据。
自定义标准
https://github.com/CDN-Union/H265/blob/master/Code/README.md
金山云对FFmpeg RTMP/FLV部分做了扩展,用于支持H.265。
针对《video_file_format_spec_v10_1》 VIDEODATA部分扩展如下
Field Type Comment CodecID UB [4] Codec Identifier. The following values are defined:
2 = Sorenson H.263
3 = Screen video
4 = On2 VP6
5 = On2 VP6 with alpha channel
6 = Screen video version 2
7 = AVC
12=HEVC补丁
目录Code/FFmpeg下已经将patch达到了origin/release/3.2等branch上。 当前已经支持的release分支包括: 2.8 3.0 3.1 3.2 3.3 patch位于Code/flv265patch_from_kingsoft.7z压缩包内。 patch涉及的改动包括: libavform/flv.h libavform/flvenc.c libavform/flvdec.chttps://github.com/runner365/ffmpeg_rtmp_h265
项目背景 当前阿里云,金山云等众多cdn,已经支持hevc in rtmp/flv(采用增加codecid=12的方式) 国外大厂和国外cdn支持hevc in rtmp/flv方式:enhanced-rtmp 基于兼容上面两种hevc in rtmp/flv的方式,本库均支持。
本库支持的版本(见对应的branch分支): 4.1 4.3 5.0 5.1 6.0(支持enhanced-rtmp) 国内cdn方式: 新增codecid hevc/vp8/vp9/opus在rtmp中的codecid没有官方协议定义,由国内众多知名cdn共同制定。
enum { FLV_CODECID_H263 = 2, FLV_CODECID_SCREEN = 3, FLV_CODECID_VP6 = 4, FLV_CODECID_VP6A = 5, FLV_CODECID_SCREEN2 = 6, FLV_CODECID_H264 = 7, FLV_CODECID_REALH263= 8, FLV_CODECID_MPEG4 = 9, FLV_CODECID_HEVC = 12, FLV_CODECID_AV1 = 13, FLV_CODECID_VP8 = 14, FLV_CODECID_VP9 = 15, };https://github.com/CDN-Union/Document/blob/master/Draft/H.265直播规范提案_v1.0.pdf
https://github.com/CDN-Union/Document/blob/master/Protocol/协议说明(中文).md
CDN 3.0 协议说明 贡献者 本协议说明,由CDN联盟成员(熊猫直播、网宿科技、星域CDN、腾讯云、金山云、百度云、阿里云、声网、七牛云、帝联科技)共同制定完成,CDN联盟CDN3.0项目组负责维护。
版本 更新信息 更新者 日期 0.0.1 初稿 姜雨晴(Panda TV) 20171026
编译
Ubuntu
安装依赖项
在编译之前,你需要安装一些依赖项。在Ubuntu上,你可以使用以下命令安装:
sudo apt install build-essential gitsudo apt install libx264-dev libx265-dev libvpx-dev libmp3lame-dev libfdk-aac-dev libopus-dev libvorbis-dev libaom-dev libass-devsudo apt install nasm获取源代码
使用Git从FFmpeg的官方仓库获取源代码:
git clone https://git.ffmpeg.org/ffmpeg.git这将会在当前目录下创建一个名为ffmpeg的文件夹,并下载FFmpeg的源代码到其中。
配置
进入刚刚克隆的FFmpeg目录,并运行configure脚本来配置编译选项:
cd ffmpeg
./configure./configure命令会根据你的系统和所需的功能自动配置FFmpeg。你也可以通过添加不同的选项来自定义配置。例如,如果你需要特定的编解码器或库,可以使用--enable-libx264来启用x264编解码器。
如果在运行
./configure命令时没有设置任何选项,那么 FFmpeg 将会使用默认的配置进行编译。这意味着它会尽可能地包含所有可用的功能和编解码器,以及系统支持的所有库。默认情况下,FFmpeg 将尝试在系统上找到可用的依赖项和库,并相应地启用相关功能。这可能包括音频编解码器、视频编解码器、字幕支持等等。
编译
配置完成后,运行make命令来编译FFmpeg:
make这将会在你的系统上编译FFmpeg。这个过程可能会需要一些时间,具体取决于你的系统性能和所选择的配置选项。
make和sudo make install命令确实会编译和安装 FFmpeg,但并不会自动安装在系统中的标准位置,也不会自动处理依赖项。通常情况下,这些命令会将编译后的二进制文件和库安装到默认的位置(例如/usr/local/bin和/usr/local/lib),但并不会将相关信息添加到系统包管理器中。
安装
编译完成后,你可以使用make install命令将FFmpeg安装到你的系统中:
sudo make install这会将FFmpeg的可执行文件、库文件和头文件安装到默认的系统路径中。
完成以上步骤后,你就成功地在你的系统上编译并安装了FFmpeg。你可以在命令行中使用ffmpeg命令来执行FFmpeg的各种操作。
测试
$ ffmpeg
ffmpeg version 6.0.1 Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 11 (Ubuntu 11.4.0-1ubuntu1~22.04)
configuration:
libavutil 58. 2.100 / 58. 2.100
libavcodec 60. 3.100 / 60. 3.100
libavformat 60. 3.100 / 60. 3.100
libavdevice 60. 1.100 / 60. 1.100
libavfilter 9. 3.100 / 9. 3.100
libswscale 7. 1.100 / 7. 1.100
libswresample 4. 10.100 / 4. 10.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
Use -h to get full help or, even better, run 'man ffmpeg'$ ffmpeg -i 2024-04-13_19-15-40.flv
ffmpeg version 6.0.1 Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 11 (Ubuntu 11.4.0-1ubuntu1~22.04)
configuration:
libavutil 58. 2.100 / 58. 2.100
libavcodec 60. 3.100 / 60. 3.100
libavformat 60. 3.100 / 60. 3.100
libavdevice 60. 1.100 / 60. 1.100
libavfilter 9. 3.100 / 9. 3.100
libswscale 7. 1.100 / 7. 1.100
libswresample 4. 10.100 / 4. 10.100
Input #0, flv, from '2024-04-13_19-15-40.flv':
Metadata:
proxy_version : 8f94a8
proxy_date : 2023-07-26 08:57:19 +0000
ext_date? : 2024-03-26 01:59:28 +0000
ext_version? : 50b94d
Duration: 00:03:02.51, start: 20.469000, bitrate: 3028 kb/s
Stream #0:0: Audio: aac (LC), 48000 Hz, stereo, fltp
Stream #0:1: Video: hevc (Main), yuv420p(tv, smpte170m/unknown/unknown), 1080x1920, 1k tbr, 1k tbnAlpine Linux
安装编译所需的工具和依赖项
sudo apk add build-base git nasm pkgconfig yasmapk search libx265
sudo apk add x265-libs获取 FFmpeg 源代码
配置 FFmpeg 编译选项
cd ffmpeg
./configure --prefix=/usr/local --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-small --enable-libmp3lame --enable-libx264 --enable-libx265./configuremake -j$(nproc)
sudo make installwin
参考
# 刷新软件包数据
pacman -Sy
# 安装mingw-w64。
pacman -S mingw-w64-x86_64-toolchain
pacman -S git
pacman -S make
pacman -S automake
pacman -S autoconf
pacman -S perl
pacman -S mingw-w64-x86_64-SDL2
pacman -S libtool
#32位的cmake跟64位的cmake都装一下,比较保险。
pacman -S mingw-w64-i686-cmake
pacman -S mingw-w64-x86_64-cmake
pacman -S pkg-config
pacman -S yasm
# 编译x264 需要 nasm
pacman -S nasmpacman -S mingw-w64-x86_64-x265# 回到用户目录
cd /home/loken
# 创建ffmpeg目录,build64 目录,统一管理
mkdir -p ffmpeg/build64
# 进入ffmpeg目录
cd ffmpeg
#下载x264项目代码
git clone https://gitee.com/mirrors_addons/x264
# 进入x264项目目录
cd x264
# 执行configure
./configure --prefix=/home/loken/ffmpeg/build64/libx264 \
--host=x86_64-w64-mingw32 --enable-static \
--extra-ldflags="-Wl,--output-def=libx264.def"
make -j8
make install# 回到ffmpeg目录
cd /home/loken/ffmpeg
git clone --depth 1 https://gitee.com/mirrors/fdk-aac.git
cd fdk-aac
./autogen.sh
./configure --prefix=/home/loken/ffmpeg/build64/libfdk-aac --disable-shared \
--enable-static
make -j8
make installcd /home/loken/ffmpeg
git clone --depth 1 https://gitee.com/hqiu/lame.git
cd lame
./configure --prefix=/home/loken/ffmpeg/build64/libmp3lame --disable-frontend \
--disable-shared --enable-static
make -j8
make installcd /home/loken/ffmpeg
git clone --depth 1 https://github.com/webmproject/libvpx.git
cd libvpx
./configure --prefix=/home/loken/ffmpeg/build64/libvpx --disable-examples \
--disable-unit-tests --enable-vp9-highbitdepth --as=yasm
make -j8
make install结束进程
Alpine Linux:
pgrep -f ffmpeg | xargs -n1 -I{} pstree -p {}ps -eo pid,lstart,cmd | grep ffmpegkill <pid>查看视频编码信息
ffmpeg -i "2024-03-29 19-10-58_000.mp4"