多媒体视频处理工具FFmpeg的简介及安装

一、FFmpeg简介
FFmpeg 是一款开源的多媒体视频处理工具,可以用来记录、转换数字音频、视频,并能够将其转化为流的开源计算机程序。
其中包含了音频/视频编解码库libavcodec。
它的功能包括视频采集、视频格式转换、视频抓图、给视频加水印等。
其中现有的很多处理软件是基于 FFmpeg 开发,包括暴风影音、QQ影音、PotPlaye 等。
但是需要注意的是,FFmpeg 是以命令行的方式运行的,所以需要在终端操作它。

二、音视频相关知识
1、封装:即我们常说的文件格式 mp4、avi、mkv、rmvb。它像是一个容器,里面会包含视频、音频、字幕等信息。
2、编码:编码的目的是为了存储和压缩。视频和音频会采用不同的编码方式编码后放进容器中。
常见的视频编码方式有h.264(HVC)、h.265(HEVC)、MPEG4、VC-1等,常见的音频编码方式有AAC、AC-3、MP3等。
注:封装格式会限制编码方式。

三、ffmpeg的主要组成
1、libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能,包含demuxers和muxer库;
2、libavcodec:用于各种类型声音/图像编解码;
3、libavutil:包含一些公共的工具函数;
4、libswscale:用于视频场景比例缩放、色彩映射转换;
5、libpostproc:用于后期效果处理;
6、ffmpeg:是一个命令行工具,用来对视频文件转换格式,也支持对电视卡实时编码;
7、ffsever:是一个HTTP多媒体实时广播流服务器,支持时光平移;
8、ffplay:是一个简单的播放器,使用 ffmpeg 库解析和解码,通过SDL显示;

基础概念
容器(Container)
容器就是一种文件格式,比如flv,mkv等。包含下面5种流以及文件头信息。
流(Stream)
是一种视频数据信息的传输方式,5种流:音频,视频,字幕,附件,数据。
帧(Frame)
帧代表一幅静止的图像,分为I帧,P帧,B帧。
编解码器(Codec)
是对视频进行压缩或者解压缩,CODEC =COde (编码) +DECode(解码)
复用/解复用(mux/demux)
把不同的流按照某种容器的规则放入容器,这种行为叫做复用(mux)
把不同的流从某种容器中解析出来,这种行为叫做解复用(demux)

四、ffmpeg的处理流程
多媒体视频处理工具FFmpeg的简介及安装_第1张图片
执行流程解释:
1、FFmpeg程序把-i参数指定的若干文件内容读入到内存,按照输入的参数或者程序默认的参数来处理并且把结果写入到若干的文件中。输入和输出文件可以是计算机文件、管道、网络流、捕获设备等。
2、FFmpeg用libavformat包调用解复用器(demuxers)来读取输入文件中被编码的数据包(packets),如果有多个输入文件,FFmpeg以有效输入流的最小时间戳来同步,
3、然后解码器(decoder)从已编码的数据包中产生未被压缩的帧(frame),在那之后调用可选的过滤器。
4、这些帧被传递到编码器,编码器会产生新的编码包
5、把新的编码包传递给复用器(muxer)处理并且把结果写入到输出文件中。

五、FFmpeg的安装
FFmpeg支持的常见平台有:Linux、Windows、Mac OS等。
官网下载地址:https://www.ffmpeg.org/download.html
一般来说,为了方便,我们选择下载静态编译的包,这样可以放到任何位置多能正确的被执行。
但是通常来说,我们希望在任何位置打开终端都能运行 FFmpeg,这样我们可以把 FFmpeg 的存放路径添加至系统环境变量中。

接下来进行软件的安装。

#1.安装x264库
#下载libx264包,如果在视频转码时不指定libx264格式,可能会出现转换后的视频或音频不正常
git clone git://git.videolan.org/x264.git
#进行简单配置,有些cpu不支持asm汇编语句,使能共享,使能多线程,使能pic
./configure --disable-asm --enable-shared --enable-pthread --enable-pic
#编译
make
#安装 【其实就是移动了库文件、可运行文件的位置】
make install
#2.安装ffmpeg
#可以在http://www.ffmpeg.org/download.html下载软件包
wget https://ffmpeg.org/releases/ffmpeg-4.1.3.tar.bz2
#解压软件
tar -jxvf ffmpeg-4.1.3.tar.bz2
#切换目录
cd ffmpeg-4.1.3/
#根据服务器进行配置,生成配置文件
./configure --disable-x86asm --enable-gpl --enable-libx264
#编译
make 
#安装
make install
之后我们可以运行命令,可以通过ffmpeg -V 来测试下是否成功

接下来我们进行测试:
找到一个音频文件,例如a.mp4
执行如下:

ffmpeg -i ./e6a4aa70cb88294a364087ee98ecf502.avi -vcodec libx264 a.mp4

如果报错:提示找不到libx264.so之类的错误。
解决方案:
1、将 /usr/local/lib/添加到/etc/ld.so.conf 文件末尾
或者直接修改/etc/ld.so.conf ,【需要root权限】
echo “/usr/local/lib” >> /etc/ld.so.conf
2、使库文件的配置生效

ldconfig
#执行完毕后,然后测试看是否可以正确转码。

六、音视频的简单处理
1、提取视频 A 的背景音输出为 B.mp3
ffmpeg -y -i A.mp4 -vn B.mp3
2、用 B.mp3 替换视频 C 中的背景音
step1:提取 C 中的视频,去除背景音,输出为无声的视频 D
ffmpeg -i C.mp4 -vcodec copy -an D.mp4
step2:将新的背景音 B 合成到视频 D 中生成新的视频 F
ffmpeg -i D.mp4 -i B.mp3 -vcodec copy -acodec copy F.mp4

这里需要注意的是:
ffmpeg对cpu特别消耗。
因为音视频的处理是一件非常消耗计算力的事情。通常一般情况下会消耗100%的cpu来处理这些事情。这会使得电脑的执行变得特别缓慢,机器性能严重受损。所以,通常情况下,我们要进行cpu的限制。
如通过加入 -threads 参数来实现这点,如限制 cpu 使用率在 50%,可以进行如下:

ffmpeg -i input.mp4 -threads 2 -vcodec h264 -acodec copy output.mkv

你可能感兴趣的:(Linux,ffmpeg,多媒体音频工具)