一、ffmpeg的安装
1.Centos安装
FFmpeg 在默认的CentOS 8 源仓库中没有提供。你可以选择通过源文件编译安装 FFmpeg,或者使用dnf
工具从Negativo17
源仓库中安装。我们将会使用第二个选项。
完成下面的步骤,在 CentOS 8 上安装 FFmpeg:
1.Negativo17软件源依赖EPEL 和 PowerTools 软件源。以 root 或者其他有 sudo 权限的用户身份运行下面的命令,启用必须的软件源:
sudo dnf install epel-release sudo yum config-manager --set-enabled PowerTools sudo yum-config-manager --add-repo=https://negativo17.org/repos/epel-multimedia.repo
2.一旦软件源被启用,安装FFmpeg:
sudo dnf install ffmpeg
3.通过检测版本号,验证FFmpeg安装:
ffmpeg -version
4.Negativo17 软件源中的ffmpeg当前版本是4.2.5
ffmpeg version 4.2.5 Copyright (c) 2000-2021 the FFmpeg developers built with gcc 8 (GCC) 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 -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' --extra-ldflags='-Wl,-z,relro -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld ' --extra-cflags=' ' --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-amrwbenc --enable-version3 --enable-bzlib --disable-crystalhd --enable-fontconfig --enable-frei0r --enable-gcrypt --enable-gnutls --enable-ladspa --enable-libaom --enable-libdav1d --enable-libass --enable-libbluray --enable-libcdio --enable-libdrm --enable-libjack --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libmp3lame --enable-nvenc --enable-openal --enable-opencl --enable-opengl --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librsvg --enable-libsrt --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libvidstab --enable-libvmaf --enable-version3 --enable-vapoursynth --enable-libvpx --enable-libx264 --enable-libx265 --enable-libxvid --enable-libzimg --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 56. 31.100 / 56. 31.100 libavcodec 58. 54.100 / 58. 54.100 libavformat 58. 29.100 / 58. 29.100 libavdevice 58. 8.100 / 58. 8.100 libavfilter 7. 57.100 / 7. 57.100 libavresample 4. 0. 0 / 4. 0. 0 libswscale 5. 5.100 / 5. 5.100 libswresample 3. 5.100 / 3. 5.100 libpostproc 55. 5.100 / 55. 5.100
2.Windows安装
官网地址:http://ffmpeg.org/download.html
选择Windows的版本,跳转到GitHub下载地址:https://github.com/BtbN/FFmpe...
下载最新的带share版本的,就是已经编译好了的,不用自己再编译 ffmpeg-n4.4.1-2-gcc33e73618-win64-gpl-shared-4.4.zip
解压出来放到安装软件的盘符,添加环境变量即可 D:\ffmpeg-n4.4.1-2-gcc33e73618-win64-gpl-shared-4.4\bin
不重启使Windows环境变量生效,cmd,输入 set path = D:\ffmpeg-n4.4.1-2-gcc33e73618-win64-gpl-shared-4.4\bin
重启命令提示符终端,测试效果: cmd,输入 ffmpeg -version得到如下效果即为成功安装
二、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)
查看帮助
可用的bit流 :ffmpeg –bsfs
可用的编解码器:ffmpeg –codecs
可用的解码器:ffmpeg –decoders
可用的编码器:ffmpeg –encoders
可用的过滤器:ffmpeg –filters
可用的视频格式:ffmpeg –formats
可用的声道布局:ffmpeg –layouts
可用的license:ffmpeg –L
可用的像素格式:ffmpeg –pix_fmts
可用的协议:ffmpeg -protocals
三、ffmpeg常用命令
使用 ffmpeg 命令 的基本形式是:
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... usage: ffmpeg [全局参数] {[输入文件参数] -i 输入文件地址} ... {[输出文件参数] 输出文件地址} ...
主要全局参数:
-i 设定输入流
-f 设定输出格式
-ss 开始时间
输出视频文件参数:
-b 设定视频流量(码率),默认为200Kbit/s
-r 设定帧速率,默认为25
-s 设定画面的宽与高
-aspect 设定画面的比例
-vn 不处理视频
-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器
-qscale 0 保留原始的视频质量
输出音频文件参数:
-ar 设定采样率
-ac 设定声音的Channel数
-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器
-an 不处理音频
1.获取媒体文件信息
ffmpeg -i file_name ffmpeg -i video_file.mp4 ffmpeg -i audio_file.mp3 ffmpeg -i video_file.mp4 -hide_banner #hide_banner 来隐藏掉ffmpeg本身的信息 ffmpeg -i audio_file.mp3 -hide_banner
2.转换媒体文件
ffmpeg 最让人称道常用的恐怕就是你轻而易举的在不同媒体格式之间进行自由转换了。你是要指明输入和输出文件名就行了, ffmpeg 会从后缀名猜测格式,这个方法同时适用于视频和音频文件
下面是一些例子:
ffmpeg -i video_input.mp4 video_output.avi ffmpeg -i video_input.webm video_output.flv ffmpeg -i audio_input.mp3 audio_output.ogg ffmpeg -i audio_input.wav audio_output.flac
你也可以同时指定多个输出后缀:
ffmpeg -i audio_input.wav audio_output_1.mp3 audio_output_2.ogg
这样会同时输出多个文件.
想看支持的格式,可以用:
ffmpeg -formats
同样的,你可以使用 -hide_banner 来省略一些程序信息。
你可以在输出文件前使用 -qscale 0 来保留原始的视频质量:
ffmpeg -i video_input.wav -qscale 0 video_output.mp4
3. 从视频中抽取音频
为了从视频文件中抽取音频,直接加一个 -vn 参数就可以了
ffmpeg -i video.mp4 -vn audio.mp3
这会让命令复用原有文件的比特率,一般来说,使用 -ab (音频比特率)来指定编码比特率是比较好的:
ffmpeg -i video.mp4 -vn -ab 128k audio.mp3
一些常见的比特率有 96k, 128k, 192k, 256k, 320k (mp3也可以使用最高的比特率)。
其他的一些常用的参数比如 -ar(采样率: 22050, 441000, 48000), -ac (声道数), -f (音频格式, 通常会自动识别的). -ab 也可以使用 -b:a 来替代. 比如:
ffmpeg -i video.mov -vn -ar 44100 -ac 2 -b:a 128k -f mp3 audio.mp3
4. 从视频中抽取视频(让视频静音)
和之前的要求类似,我们可以使用 -an 来获得纯视频(之前是 -vn)
ffmpeg -i video_input.mp4 -an -video_output.mp4 ffmpeg -i input.mp4 -vcodec copy -an output.mp4
Note:这个 -an 标记会让所有的音频参数无效,因为最后没有音频会产生。
5. 从视频中提取图片
这个功能可能对很多人都挺有用,比如你可能有一些幻灯片,你想从里面提取所有的图片,那么下面这个命令就能帮你:
ffmpeg -i video.mp4 -r 1 -f image2 image-%3d.png
我们来解释一下这个命令:
-r 代表了帧率(一秒内导出多少张图像,默认25), -f 代表了输出格式(image2 实际上上 image2 序列的意思)。
最后一个参数 (输出文件) 有一个有趣的命名:它使用 %3d 来指示输出的图片有三位数字 (000, 001, 等等.)。你也可以用 %2d (两位数字) 或者 %4d (4位数字) ,只要你愿意,你可以随便实验 一下可以怎么写!
Note:同样也有将图片转变为视频/幻灯片的方式,下面的高级应用中会讲到。
6. 更改视频分辨率或长宽比
对 ffmpeg 来说又是个简单的任务,你只需要使用 -s 参数来缩放视频就行了:
ffmpeg -i video_input.mov -s 1024x576 video_output.mp4
同时,你可能需要使用 -c:a 来保证音频编码是正确的:
ffmpeg -i video_input.h264 -s 640x480 -c:a video_output.mov
你也可是使用-aspect 来更改长宽比:
ffmpeg -i video_input.mp4 -aspect 4:3 video_output.mp4
Note: 在高级应用中还会提到更强大的方法
7. 为音频增加封面图片
有个很棒的方法把音频变成视频,全程使用一张图片(比如专辑封面)。当你想往某个网站上传音频,但那个网站又仅接受视频(比如YouTube, Facebook等)的情况下会非常有用。
下面是例子:
ffmpeg -loop 1 -i image.jpg -i audio.wav -c:v libx264 -c:a aac -strict experimental -b:a 192k -shortest output.mp4
只要改一下编码设置 (-c:v 是 视频编码, -c:a 是音频编码) 和文件的名称就能用了。
Note:如果你使用一个较新的ffmpeg版本(4.x),你就可以不指定 -strict experimental
8. 为视频增加字幕
另一个常见又很容易实现的要求是给视频增加字母,比如一部外文电源,使用下面的命令:
ffmpeg -i video.mp4 -i subtitles.srt -c:v copy -c:a copy -preset veryfast -c:s mov_text -map 0 -map 1 output.mp4
当然,你可以指定自己的编码器和任何其他的音频视频参数。你可以阅读这篇文章来了解字幕相关内容 editing subtitles in Linux 。
9. 压缩媒体文件
压缩文件可以极大减少文件的体积,节约存储空间,这对于文件传输尤为重要。通过ffmepg,有好几个方法来压缩文件体积。
Note: 文件压缩的太厉害会让文件质量显著降低。
首先,对于音频文件,可以通过降低比特率(使用 -b:a 或 -ab):
ffmpeg -i audio_input.mp3 -ab 128k audio_output.mp3 ffmpeg -i audio_input.mp3 -b:a 192k audio_output.mp3
再次重申,一些常用的比特率有: 96k, 112k, 128k, 160k, 192k, 256k, 320k.值越大,文件所需要的体积就越大。
对于视频文件,选项就多了,一个简单的方法是通过降低视频比特率 (通过 -b:v):
ffmpeg -i video_input.mp4 -b:v 1000k -bufsize 1000k video_output.mp4
Note: 视频的比特率和音频是不同的(一般要大得多)。
你也可以使用 -crf 参数 (恒定质量因子). 较小的crf 意味着较大的码率。同时使用 libx264 编码器也有助于减小文件体积。这里有个例子,压缩的不错,质量也不会显著变化:
ffmpeg -i video_input.mp4 -c:v libx264 -crf 28 video_output.mp4
crf 设置为20 到 30 是最常见的,不过您也可以尝试一些其他的值。
降低帧率在有些情况下也能有效(不过这往往让视频看起来很卡):
ffmpeg -i video_input.mp4 -r 24 video_output.mp4
-r 指示了帧率 (这里是 24)。
你还可以通过压缩音频来降低视频文件的体积,比如设置为立体声或者降低比特率:
ffmpeg -i video_input.mp4 -c:v libx264 -ac 2 -c:a aac -strict -2 -b:a 128k -crf 28 video_output.mp4
Note:-strict -2 和 -ac 2 是来处理立体声部分的。
10. 裁剪媒体文件(基础)
想要从开头开始剪辑一部分,使用T -t 参数来指定一个时间:
ffmpeg -i input_video.mp4 -t 5 output_video.mp4 ffmpeg -i input_audio.wav -t 00:00:05 output_audio.wav
这个参数对音频和视频都适用,上面两个命令做了类似的事情:保存一段5s的输出文件(文件开头开始算)。上面使用了两种不同的表示时间的方式,一个单纯的数字(描述)或者 HH:MM:SS (小时, 分钟, 秒). 第二种方式实际上指示了结束时间。
也可以通过 -ss 给出一个开始时间,-to 给出结束时间:
ffmpeg -i input_audio.mp3 -ss 00:01:14 output_audio.mp3 ffmpeg -i input_audio.wav -ss 00:00:30 -t 10 output_audio.wav ffmpeg -i input_video.h264 -ss 00:01:30 -to 00:01:40 output_video.h264 ffmpeg -i input_audio.ogg -ss 5 output_audio.ogg
可以看到 开始时间 (-ss HH:MM:SS), 持续秒数 (-t duration), 结束时间 (-to HH:MM:SS), 和开始秒数 (-s duration)的用法.
你可以在媒体文件的任何部分使用这些命令。
11.输出YUV420原始数据
对于一下做底层编解码的人来说,有时候常要提取视频的YUV原始数据。 怎么坐?很简答: ffmpeg -i input.mp4 output.yuv
怎么样,是不是太简单啦?!!!哈哈(如果你想问yuv的数据,如何播放,我不会告诉你,RawPlayer挺好用的!!)
那如果我只想要抽取某一帧YUV呢? 简单,你先用上面的方法,先抽出jpeg图片,然后把jpeg转为YUV。 比如: 你先抽取10帧图片。 ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
结果:
-rw-rw-r-- 1 hackett hackett 296254 7月 20 16:08 pic-001.jpeg -rw-rw-r-- 1 hackett hackett 300975 7月 20 16:08 pic-002.jpeg -rw-rw-r-- 1 hackett hackett 310130 7月 20 16:08 pic-003.jpeg -rw-rw-r-- 1 hackett hackett 268694 7月 20 16:08 pic-004.jpeg -rw-rw-r-- 1 hackett hackett 301056 7月 20 16:08 pic-005.jpeg -rw-rw-r-- 1 hackett hackett 293927 7月 20 16:08 pic-006.jpeg -rw-rw-r-- 1 hackett hackett 340295 7月 20 16:08 pic-007.jpeg -rw-rw-r-- 1 hackett hackett 430787 7月 20 16:08 pic-008.jpeg -rw-rw-r-- 1 hackett hackett 404552 7月 20 16:08 pic-009.jpeg -rw-rw-r-- 1 hackett hackett 412691 7月 20 16:08 pic-010.jpeg
然后,你就随便挑一张,转为YUV: ffmpeg -i pic-001.jpeg -s 1440x1440 -pix_fmt yuv420p xxx3.yuv
如果-s参数不写,则输出大小与输入一样。当然了,YUV还有yuv422p啥的,你在-pix_fmt 换成yuv422p就行啦!
12.视频添加logo
ffmpeg -i input.mp4 -i logo.png -filter_complex overlay output.mp4
13.提取视频ES数据
ffmpeg –i input.mp4 –vcodec copy –an –f m4v output.h264
14.视频编码格式转换
比如一个视频的编码是MPEG4,想用H264编码,咋办?
ffmpeg -i input.mp4 -vcodec h264 output.mp4
相反也一样
ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4
15.添加字幕
语法 –vf subtitles=file ffmpeg -i jidu.mp4 -vf subtitles=rgb.srt output.mp4