1 简介
1.1 centos自带ffmepg版本较低
ffmpeg -v
ffmpeg version 3.4.13 Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-44)
configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --docdir=/usr/share/doc/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --optflags='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic' --extra-ldflags='-Wl,-z,relro ' --extra-cflags=' ' --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-amrwbenc --enable-version3 --enable-bzlib --disable-crystalhd --enable-fontconfig --enable-gcrypt --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libcdio --enable-libdrm --enable-indev=jack --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libmp3lame --enable-nvenc --enable-openal --enable-opencl --enable-opengl --enable-libopenjpeg --enable-libopus --disable-encoder=libopus --enable-libpulse --enable-librsvg --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libvidstab --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzvbi --enable-avfilter --enable-avresample --enable-libmodplug --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib64 --enable-libmfx --enable-runtime-cpudetect
libavutil 55. 78.100 / 55. 78.100
libavcodec 57.107.100 / 57.107.100
libavformat 57. 83.100 / 57. 83.100
libavdevice 57. 10.100 / 57. 10.100
libavfilter 6.107.100 / 6.107.100
libavresample 3. 7. 0 / 3. 7. 0
libswscale 4. 8.100 / 4. 8.100
libswresample 2. 9.100 / 2. 9.100
libpostproc 54. 7.100 / 54. 7.100
centos下使用yum安装的ffmpeg版本为3.4.13,当我们使用一些ffmpeg的新特性时,无法支持,所以需要升级ffmpeg版本。
1.2 为什么要安装x264
对于两个不同的.mp4视频来说,虽然它们的后缀名是一样的,但是两个MP4视频采用的编码格式可能是不一样的,它们可以采用H.264或H.265的编码格式进行编码,也可以采用MPEG-4的编码方式。而对于MP4视频文件的播放,Chrome只支持标准的H.264方式编码。因此如果MP4视频的编码格式不是H.264,那么这个视频文件就无法正常播放。
为什么Chrome只支持H.264这种编码方式而不支持所有的视频编码方式呢?Google网上给出的原因主要是说因为绝大部分的视频编码格式都要付专利费的,Google已经购买了H.264编码格式,而其它的就没有购买了,因此如果一个MP4视频不是H.264格式的,那么Chrome也是不支持播放的。
2 ffmpeg版本升级到6.1.1
2.1 源码安装nasm
下载和解压:
wget https://www.nasm.us/pub/nasm/releasebuilds/2.14/nasm-2.14.tar.gz
tar -zxvf nasm-2.14.tar.gz
cd nasm-2.14
nasm安装:
./configure
make
sudo make install
添加到环境变量:
export PATH=/usr/local/bin:$PATH
安装成功校验:
nasm -v
NASM version 2.14 compiled on Jul 9 2024
2.2 源码安装x264
下载x264源码
git clone https://code.videolan.org/videolan/x264.git
cd x264
编译和安装
./configure --prefix=/usr/x264/ --includedir=/usr/local/include --libdir=/usr/local/lib --enable-shared
make
make install
配置环境变量
vim ~/.bashrc
在最后PATH添加环境变量:
export PATH="/usr/local/nasm/bin:$PATH"
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
export PATH="/usr/x264/bin:$PATH"
保存退出
source ~/.bashrc 设置生效
验证是否安装成功
# pkg-config --libs x264
-L/usr/local/lib -lx264
# x264 --version
x264 0.164.3191 4613ac3
(libswscale 4.8.100)
built on Jul 9 2024, gcc: 7.3.1 20180303 (Red Hat 7.3.1-5)
x264 configuration: --chroma-format=all
libx264 configuration: --chroma-format=all
x264 license: GPL version 2 or later
libswscale license: GPL version 3 or later
2.3 安装 ffmpeg
下载和解压:
wget https://ffmpeg.org//releases/ffmpeg-6.1.1.tar.gz
tar -zxvf ffmpeg-6.1.1.tar.gz
cd ffmpeg-6.1.1
编译和安装:
./configure --enable-gpl --enable-libx264 --enable-shared --extra-ldflags=-L/usr/local/lib --extra-cflags=-I/usr/local/include
make
sudo make install
配置环境变量:
vi /etc/profile
export PATH=$PATH:/usr/local/ffmpeg/bin
:wq 保存退出
刷新资源,使其生效
source /etc/profile
验证是否安装成功
# ffmpeg -version
ffmpeg version 6.1.1 Copyright (c) 2000-2023 the FFmpeg developers
built with gcc 7 (GCC)
configuration: --enable-gpl --enable-libx264 --enable-shared --extra-ldflags=-L/usr/local/lib --extra-cflags=-I/usr/local/include
libavutil 58. 29.100 / 58. 29.100
libavcodec 60. 31.102 / 60. 31.102
libavformat 60. 16.100 / 60. 16.100
libavdevice 60. 3.100 / 60. 3.100
libavfilter 9. 12.100 / 9. 12.100
libswscale 7. 5.100 / 7. 5.100
libswresample 4. 12.100 / 4. 12.100
libpostproc 57. 3.100 / 57. 3.100
3 异常解决
如果安装完成出现如下错误:
# ffmpeg -version
ffmpeg: error while loading shared libraries: libavdevice.so.60: cannot open shared object file: No such file or directory
查找libavdevice.so.60文件位置
sudo find / -name libavdevice.so.60
将找到的文件所在路径添加到ld.so.conf文件中
sudo vim /etc/ld.so.conf
添加结果如下:
include ld.so.conf.d/*.conf
/usr/local/lib/ 此路径为上个步骤查找的结果
重新加载
ldconfig
再次运行,不再出现异常。
4 FFmpeg介绍
FFmpeg项目由 Fabrice Bellard在2000年创立。到目前为止,FFmpeg项目的开发者仍然与VLC、MPV、dav1d、x264等多媒体开源项目有着广泛的重叠。Ffmpeg(FastForward Mpeg)是一款遵循GPL的开源软件,在音视频处理方面表现十分优秀,几乎囊括了现存所有的视音频格式的编码,解码、转码、混合、过滤及播放。作为最受欢迎的视频和图像处理软件,它被来自各行各业的不同公司所广泛使用。同时也是一款跨平台的软件,完美兼容Linux、Windows、Mac OSX等平台。其实它由3大部件组成,号称音视频处理工具三剑客:
- Ffmpeg:由命令行组成,用于多媒体格式转换
- Ffplay:基于ffmpeg开源代码库libraries做的多媒体播放器
- Ffprobe:基于ffmpeg做的多媒体流分析器
Ffmpeg 应该是 FFmpeg 工具集中最核心的利器,支持多种多样的编码器、解码器、封装格式、滤镜功能。FFmpeg框架的基本组成包含AVFormat、AVCodec、AVFilter、AVDevice、AVUtil等模块库,结构图如下:
- AVFormat–FFmpeg的封装模块
AVFormat中实现了目前多媒体领域中的绝大多数媒体封装格式,包括封装和解封装,如MP4、FLV、KV、TS等文件封装格式,RTMP、RTSP、MMS、HLS等网络协议封装格式。FFmpeg是否支持某种媒体封装格式,取决于编译时是否包含了该格式的封装库。根据实际需求,可进行媒体封装格式的扩展,增加自己定制的封装格式,即在AVFormat中增加自己的封装处理模块。
- AVCodec–FFmpeg的编解码模块
AVCodec中实现了目前多媒体领域绝大多数常用的编解码格式,即支持编码,也支持解码。AVCodec除了支持MPEG4、AAC、MJPEG等自带的媒体编解码格式之外,还支持第三方的编解码器,如H.264(AVC)编码,需要使用x264编码器;H.265(HEVC)编码,需要使用x264编码器;MP3(mp3lame)编码,需要使用libmp3lame编码器。如果希望增加自己的编码格式,或者硬件编解码,则需要在AVCodec中增加相应的编解码模块。
- AVFilter–FFmpeg的滤镜模块
AVFilter库提供了一个通用的音频、视频、字幕等滤镜处理框架。在AVFilter中,滤镜框架可以有多个输入和多个输出。
- swresample–FFmpeg的音频转换计算模块
swresample模块提供了高级别的音频重采样API。例如允许操作音频采样、音频通道布局转换与布局调整。
- swscale–FFmpeg的视频图像转换计算模块
swscale模块提供了高级别的图像转换API,例如它允许进行图像缩放和像素格式转换,常见于将图像从1080p转换成720p或者480p等的缩放,或者将图像数据从YUV420p转换成YUYV,或者YUV转RGB等图像格式转换。
5 FFmpeg常用参数
5.1 能力集列表
- -formats:列出支持的文件格式。
- -codecs:列出支持的编解码器。
- -decoders:列出支持的解码器。
- -encoders:列出支持的编码器。
- -protocols:列出支持的协议。
- -bsfs:列出支持的比特流过滤器。
- -filters:列出支持的滤镜。
- -pix_fmts:列出支持的图像采样格式。
- -sample_fmts:列出支持的声音采样格式。
5.2 常用输入选项
- -i filename:指定输入文件名。
- -f fmt:强制设定文件格式,需使用能力集列表中的名称(缺省是根据扩展名选择的)。
- -ss hh:mm:ss[.xxx]:设定输入文件的起始时间点,启动后将跳转到此时间点然后开始读取数据。
对于输入,以下选项通常是自动识别的,但也可以强制设定。
- -c codec:指定解码器,需使用能力集列表中的名称。
- -acodec codec:指定声音的解码器,需使用能力集列表中的名称。
- -vcodec codec:指定视频的解码器,需使用能力集列表中的名称。
- -b:v bitrate:设定视频流的比特率,整数,单位bps。
- -r fps:设定视频流的帧率,整数,单位fps。
- -s WxH : 设定视频的画面大小。也可以通过挂载画面缩放滤镜实现。
- -pix_fmt format:设定视频流的图像格式(如RGB还是YUV)。
- -ar sample rate:设定音频流的采样率,整数,单位Hz。
- -ab bitrate:设定音频流的比特率,整数,单位bps。
- -ac channels:设置音频流的声道数目。
5.3 常用输出选项
- -f fmt:强制设定文件格式,需使用能力集列表中的名称(缺省是根据扩展名选择的)。
- -c codec:指定编码器,需使用能力集列表中的名称(编码器设定为”copy“表示不进行编解码)。
- -acodec codec:指定声音的编码器,需使用能力集列表中的名称(编码器设定为”copy“表示不进行编解码)。
- -vcodec codec:指定视频的编码器,需使用能力集列表中的名称(编解码器设定为”copy“表示不进行编解码)。
- -r fps:设定视频编码器的帧率,整数,单位fps。
- -pix_fmt format:设置视频编码器使用的图像格式(如RGB还是YUV)。
- -ar sample rate:设定音频编码器的采样率,整数,单位Hz。
- -b bitrate:设定音视频编码器输出的比特率,整数,单位bps。
- -ab bitrate:设定音频编码器输出的比特率,整数,单位bps。
- -ac channels:设置音频编码器的声道数目。
- -an 忽略任何音频流。
- -vn 忽略任何视频流。
- -t hh:mm:ss[.xxx]:设定输出文件的时间长度。
- -to hh:mm:ss[.xxx]:如果没有设定输出文件的时间长度的画可以设定终止时间点。
5.4 ffmpeg流标识
FFMPEG的某些选项可以对一个特定的媒体流起作用,这种情况下需要在选项后面增加一个流标识。流标识允许以下几种格式:
- 流序号。譬如“:1”表示第二个流。
- 流类型。譬如“:a“表示音频流,流类型可以和流序号合并使用,譬如“:a:1”表示第二个音频流。
- 节目。节目和流序号可以合并使用。
- 流标识。流标识是一个内部标识号。
假如要设定第二个音频流为copy,则需要指定-codec:a:1 copy
5.5 ffmpeg音频选项
- -aframes:等价于frames:a,输出选项,用于指定输出的音频帧数目。
- -aq:等价于q:a,老版本为qscale:a,用于设定音频质量。
- -atag:等价于tag:a,用于设定音频流的标签。
- -af:等价于filter:a,用于设定一个声音的后处理过滤链,其参数为一个描述声音后处理链的字符串。
5.6 ffmpeg视频选项
- -vframes:等价于frames:v,输出选项,用于指定输出的视频帧数目。
- -aspect:设置宽高比,如4:3、16:9、1.3333、1.7777等。
- -bits_per_raw_sample:设置每个像素点的比特数。
- -vstats:产生video统计信息。
- -vf:等价于filter:v,用于设定一个图像的后处理过滤链,其参数为一个描述图像后处理链的字符串。
- -vtag:等价于tag:v,用于设定视频流的标签。
- -force_fps:强制设定视频帧率。
- -force_key_frames:显式控制关键帧的插入,参数为字符串,可以是一个时间戳,也可以是一个 “expr:”前缀的表达式。如“-force_key_frames 0:05:00”、“-force_key_frames expr:gte(t,n_forced*5)”
5.7 ffmpeg滤镜选项
-filter_simple 添加简单滤镜
-filter_complex FILTER 添加复杂滤镜
5.8 ffmpeg高级选项
- -re:要求按照既定速率处理输入数据,这个速率即是输入文件的帧率。
- -map:指定输出文件的流映射关系。例如 “-map 1:0 -map 1:1”要求将第二个输入文件的第一个流和第二个流写入到输出文件。如果没有-map选项,ffmpeg采用缺省的映射关系。
5.9 ffprobe参数
简单的说,ffprobe 是一个多媒体流分析工具。它从多媒体流中收集信息,并且以人类和机器可读的形式打印出来。它可以用来检测多媒体流的容器类型,以及每一个多媒体流的格式和类型。它可以作为一个独立的应用来使用,也可以结合文本过滤器执行更复杂的处理。
- -f format 强制使用某种格式
- -sexagesimal 时间单元格式化 HOURS:MM:SS.MICROSECONDS
- -pretty 格式美化
- -print_format format 格式化(可选值: default, compact, csv, flat, ini, json, xml)
- -of format -print_format别名
- -select_streams stream_specifier 选择指定流
- -sections 打印节的结构和信息
- -show_data 显示包数据
- -show_data_hash 显示包数据哈希值
- -show_error 显示文件探测/检测错误
- -show_format 显示格式或者容器信息
- -show_frames 显示帧信息
- -show_format_entry entry 根据格式/容器信息显示指定entry
- -show_packets 显示包信息
- -show_programs 显示程序信息
- -show_streams 显示流信息
- -show_chapters 显示章节信息
- -count_frames 统计每个流的帧数
- -count_packets 统计每个流的包数
- -show_program_version 显示ffprobe版本
- -show_library_versions show library versions
- -show_versions show program and library versions
- -show_pixel_formats 显示像素格式
- -show_private_data show private data
- -private same as show_private_data
- -bitexact force bitexact output
- -read_intervals read_intervals set read intervals
- -default generic catch all option
5.10 ffplayer参数
- -x 强制设置视频显示窗口的宽度
- -y 强制设置视频显示窗口的高度
- -S 设置视频显示的宽高
- -fs 强制全屏显示
- -an 屏蔽音频
- -vn 屏蔽视频
- -Sn 屏蔽字幕
- -ss 根据设置的秒进行定位拖动
- -t 设置播放视频/音频长度
- -Bytes 设置定位拖动的策略,0为不可拖动,1为可拖动,-1为自动
- -Nodisp 关闭图形化显示窗口
- -f 强制使用设置的格式进行解析
- -window_title 设置显示窗口的标题
- -af 设置音频的滤镜
- -Codec 强制使用设置的codec进行解码
- -autorotate 自动旋转视频
- -ast 设置将要播放的音频流
- -vst 设置将要播放的视频流
- -sst 设置将要播放的字幕流
- -Stats 输出多媒体播放状态
- -Fast 非标准化规范的多媒体兼容优化
- -sync 音视频同步设置可设置根据音频视频进行参考,视频时间参考,或者外部扩展时间进行参考
- -autoexit 多媒体播放完毕自动退出ffplay,ffplay默认播放完毕不退出播放器
- -exitonkeydown 当有按键按下事件产生时退出ffplay
- -exitonmousedown 当有鼠标按键事件产生时退出ffplay
- -loop 设置多媒体文件循环播放次数
- -framedrop 当CPU资 源占用过高时,自动丢帧
- -infbuf 设置无极限的播放器buffer,这个选项常见于实时流媒体播放场景
- -vf 视频滤镜设置
- -acodec 强制使用设置的音频解码器
- -vcodec 强制使用设置的视频解码器
- -scodec 强制使用设置的字幕解码器