FFmpeg是一个自由软件,可以运行音频和视频多种格式的录影、转换、流功能,包含了libavcodec——这是一个用于多个项目中音频和视频的解码器库,以及libavformat——一个音频与视频格式转换库。
“FFmpeg”这个单词中的“FF”指的是“Fast Forward”。有些新手写信给“FFmpeg”的项目负责人,询问FF是不是代表“Fast Free”或者“Fast Fourier”等意思,“FFmpeg”的项目负责人回信说:“Just for the record, the original meaning of “FF” in FFmpeg is “Fast Forward”…”
这个项目最初是由Fabrice Bellard发起的,而现在是由Michael Niedermayer在进行维护。许多FFmpeg的开发者同时也是MPlayer项目的成员,FFmpeg在MPlayer项目中是被设计为服务器版本进行开发。
组成组件
此计划由几个组件组成:
ffmpeg——一个命令行工具,用来对视频文件转换格式,也支持对电视卡即时编码
ffserver——一个HTTP多媒体即时广播流服务器,支持时光平移
ffplay——一个简单的播放器,基于SDL与FFmpeg库
libavcodec——包含全部FFmpeg音频/视频编解码库
libavformat——包含demuxers和muxer库
libavutil——包含一些工具库
libpostproc——对于视频做前处理的库
libswscale——对于视频作缩放的库
一、Linux安装
1、下载源码
从ffmpeg官网:https://www.ffmpeg.org/download.html下载源代码,当前最新的版本为ffmpeg-3.0.1.tar.bz2。
解压文件
tar -jxvf ffmpeg-3.0.1.tar.bz2
进入目录
cd ffmpeg-3.0.1
2、配置
安装yasm,ffmpeg编译中为了提高编译速度,使用了汇编指令,于是需要使用这个工具。
yum -y install yasm
或者同样使用源码方式安装,下载yasm源代码,然后使用./configure、make以及make istall进行安装。
当然,如果实在不想要这个功能,可以在下一步的配置中使用./configure –disable-yasm选项。
配置必要选项,这一步根据自己需要开启或关闭某些选项,具体可以使用./configure –help查看,或者直接查看configure文件。本文使用如下简单配置。
./configure –enable-shared –prefix=/usr/local/ffmpeg
或者
./configure –disable-yasm –enable-shared –prefix=/usr/local/ffmpeg
其中–enable-shared表示生成动态链接库,可以供以后编程使用,同时生成的可执行程序也依赖这些动态库。如果不加上–enable-shared选项则使用静态链接的方式编译,此时不会生成动态库,同时生成的ffmpeg等的可执行文件也比较大,但他们不需要动态库就可以直接运行
。
–prefix表示程序安装的目录,这里设为/usr/local/ffmpeg。
3、编译安装
编译,需要较长时间,10分钟左右。
make
安装,很快完成。
sudo make install
如果你的用户没有运行sudo命令的权限,需要管理员运行编辑/etc/sudoers文件,在
root ALL=(ALL) ALL
下面添加一行
luod ALL=(ALL) ALL
其中luod为添加的用户的名称。
4、路径处理
安装完成后在/usr/local/ffmpeg出现三个目录:
bin:可执行文件目录
lib:动态链接库目录
include:编程用到的头文件目录
不管是编程还是可执行程序的执行都需要依赖lib下面的动态库,可以把里面的so文件拷贝到/usr/lib下,但可以直接修改配置文件。通过查看/etc/ld.so.conf文件,发现里面只有一句话:
include ld.so.conf.d/*.conf
表明其包含了ld.so.conf.d下所有的conf文件,于是可以在/etc/ld.so.conf.d/创建一个新的文件ffmpeg.conf,其中之包含一句话,即为ffmpeg的lib目录:
/usr/local/ffmpeg/lib
再执行ldconfig,更新ld.so.cache,使修改生效。
为了在任何地方能够直接用ffmpeg运行,而不用使用如./ffmpeg或者 /usr/local/ffmpeg/bin/ffmpeg的方式运行程序,可以把可执行程序复制到bin目录下,这里选择在bin目录下创建软链接。软链接类似于Windows下的快捷方式,如果原可执行程序被删除了,软链接也不能继续使用,而硬链接则可以继续使用。创建链接命令如下:
sudo ln -s /usr/local/ffmpeg/bin/ffmpeg /usr/local/bin/
sudo ln -s /usr/local/ffmpeg/bin/ffprobe /usr/local/bin/
sudo ln -s /usr/local/ffmpeg/bin/ffserver /usr/local/bin/
另外,如果变成需要包含ffmpeg的头文件,最好将include目录下的ffmpeg复制到/usr/include中。
5、运行
现在可以在shell中直接输入ffmpeg运行程序,得到以下结果:
[root@localhost ffmpeg-3.0.1]# ffmpeg
ffmpeg version 3.0.1 Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-16)
configuration: --disable-yasm --enable-shared --prefix=/usr/local/ffmpeg
libavutil 55. 17.103 / 55. 17.103
libavcodec 57. 24.102 / 57. 24.102
libavformat 57. 25.100 / 57. 25.100
libavdevice 57. 0.101 / 57. 0.101
libavfilter 6. 31.100 / 6. 31.100
libswscale 4. 0.100 / 4. 0.100
libswresample 2. 0.101 / 2. 0.101
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'
二、使用
下载windows版本https://ffmpeg.zeranoe.com/builds/
安装到C:\ffmpeg
1、转码:c:\ffmpeg\bin\ffmpeg -i C:\ffmpeg\input\aaa.mp4 -s 860x480 c:\ffmpeg\output\aaatemp.mp4
2、合并文件:
首先将各个视频全部转换为mpeg格式:ffmpeg -i INPUT -f mpeg OUTPUT
ffmpeg -i C:\ffmpeg\input\aaa.mp4 -f mpeg c:\ffmpeg\output\result1.mpg
ffmpeg -i C:\ffmpeg\input\fate01.mp4 -f mpeg c:\ffmpeg\output\result2.mpg
通过copy或者cat命令合并视频:copy -b INPUT+INPUT OUTPUT
copy /b “c:\ffmpeg\output\result1.mpg”+”c:\ffmpeg\output\result2.mpg” “c:\ffmpeg\output\result.mpg”
或者
ffmpeg -i concat:”c:\ffmpeg\output\result1.mpg|c:\ffmpeg\output\result2.mpg” -c copy c:\ffmpeg\output\result3.mpg
将合并的视频进行编码生成最终的结果视频:ffmpeg -i INPUT -f FORMAT OUTPUT
ffmpeg -i “c:\ffmpeg\output\result.mpg” -f mp4 “c:\ffmpeg\output\final.mp4”
3、屏幕录像
FFmpeg还有一个专门用于Windows下屏幕录制的设备:gdigrab。
gdigrab是基于GDI的抓屏设备,可以用于抓取屏幕的特定区域。在这里记录一下gdigrab的用法。
gdigrab通过设定不同的输入URL,支持两种方式的屏幕抓取:
(1)“desktop”:抓取整张桌面。或者抓取桌面中的一个特定的区域。
(2)“title={窗口名称}”:抓取屏幕中特定的一个窗口。
下面举几个例子。
最简单的抓屏:ffmpeg -f gdigrab -i desktop out.mpg
从屏幕的(10,20)点处开始,抓取640x480的屏幕,设定帧率为5: ffmpeg -f gdigrab -framerate 5 -offset_x 10 -offset_y 20 -video_size 640x480 -i desktop out.mpg
4、流服务器ffserver
ffserver.conf配置文件。在ffmpeg源码中的doc目录下就有这个了。主要拿来就可以用了。主要就是添加了下面这个,因为要播放本地的数据。然后把一个mp3格式的源aaa.mp3和这个配置文件ffserver.conf一起放在/etc下
<Stream aaa.mp3>
File /usr/local/ffmpeg/aaa.mp3
Format mp2
</Stream>
启动
ffserver –f /etc/ffserver.conf
http://192.168.1.71:8090/stat.html
http://192.168.1.71:8090/aaa.mp3
ffplay http://192.168.1.71:8090/aaa.mp3
三、参数
FFmpeg可使用众多参数,参数内容会根据ffmpeg版本而有差异,使用前建议先参考参数及编解码器的叙述。此外,参数明细可用ffmpeg -h显示;编解码器名称等明细可用ffmpeg -formats显示。
下列为较常使用的参数:
主要参数
-i——设置输入档名。
-f——设置输出格式。
-y——若输出文件已存在时则覆盖文件。
-fs——超过指定的文件大小时则结束转换。
-ss——从指定时间开始转换。
-t从-ss时间开始转换(如-ss 00:00:01.00 -t 00:00:10.00即从00:00:01.00开始到00:00:11.00)。
-title——设置标题。
-timestamp——设置时间戳。
-vsync——增减Frame使影音同步。
视频参数
-b:v——设置视频流量,默认为200Kbit/秒。(单位请引用下方注意事项)
-r——设置帧率值,默认为25。
-s——设置画面的宽与高。
-aspect——设置画面的比例。
-vn——不处理视频,于仅针对声音做处理时使用。
-vcodec( -c:v )——设置视频视频编解码器,未设置时则使用与输入文件相同之编解码器。
声音参数
-b:a——设置每Channel(最近的SVN版为所有Channel的总合)的流量。(单位请引用下方注意事项)
-ar——设置采样率。
-ac——设置声音的Channel数。
-acodec ( -c:a ) ——设置声音编解码器,未设置时与视频相同,使用与输入文件相同之编解码器。
-an——不处理声音,于仅针对视频做处理时使用。
-vol——设置音量大小,256为标准音量。(要设置成两倍音量时则输入512,依此类推。)
注意事项
以-b:v及-b:a首选项流量时,根据使用的ffmpeg版本,须注意单位会有kbits/sec与bits/sec的不同。(可用ffmpeg -h显示说明来确认单位。)
例如,单位为bits/sec的情况时,欲指定流量64kbps时需输入 -b:a 64k;单位为kbits/sec的情况时则需输入 -b:a 64。
以-acodec及-vcodec所指定的编解码器名称,会根据使用的ffmpeg版本而有所不同。例如使用AAC编解码器时,会有输入aac与libfaac的情况。此外,编解码器有分为仅供解码时使用与仅供编码时使用,因此一定要利用ffmpeg -formats确认输入的编解码器是否能运作。
其它
1、ffmpeg社区内部问题
2011年1月19日,FFmpeg的现任维护者Michael Niedermayer在邮件列表上披露,FFmpeg发生了“政变”,一些开发者占领了官方网站,关闭了其他人的写入权限。随后政变者宣布FFmpeg “创建新政权”,维护任务将由他们接手,宣称只有维护团队才能拥有主源码库的写入权限。
“新内阁”成员之一的Diego Biurrun解释了他们的行动,称“政变”是迫不得已,表示他们原本想联络每一个开发者,但没成功,因为不是每个人都在IRC上,或者能及时回电话、邮件或短信。“革命”的原因是为了统一,FFmpeg社区分裂的情况严重到他们已经看不下去了。他们期望FFmpeg项目能创建一个健康而友好的开发环境。
随后Fabrice Bellard等人于2011年3月13日跳出去开新项目,称作Libav,Libav里面每位成员的管理权限缩更小(至少不能任意关闭其他人更改代码权限)。而Debian血统也响应,宣布2012年要将ffmpeg指令改成avconv。
Libav跳槽之后有一定程度上更改FFmpeg的指令。
2、Libav/FFmpeg版权
由于Libav、FFmpeg是在LGPL、GPL下发布的(如果使用了其中一些使用GPL协议发布的模块则必须使用GPL协议),任何人都可以自由使用,但必须严格遵守LGPL、GPL协议。目前有很多播放软件都使用了Libav、FFmpeg的代码,但它们并没有遵守LGPL,GPL协议,没有公开任何源代码。Libav、FFmpeg社区便将这些违反协议的公司、组织、个人的网址粘贴“耻辱大厅”(又叫“耻辱柱”)上,并与这些公司/组织/个人商讨如何解决版权争议。
参考
https://zh.wikipedia.org/wiki/FFmpeg
http://noalgo.info/874.html