网上查了不少的ffmpeg编译文章,发现其实困难的不是ffmpeg的编译和安装,
困难的是把各种解码器凑齐,这个不容易!-.-!!!

准备:

编译ffmpeg之前,系统需要以下支持:

  1. lame (支持MP3)
  2. 支持Ogg Vorbis
  3. xvid x264,现在最流行的两种高质量的压缩格式
  4. AC3和dts编码的支持
  5. mpg4 aac格式支持 (手机用户)
  6. 支持3gp格式(手机用户)
  1. 安装lame (http://lame.sourceforge.net/index.php)
1
2
3
4
5
# tar zxvf lame-3.97-i686-1jto.tgz
(生成两个目录install/,usr/)
# cp usr/bin/lame /usr/bin/
# cp -r usr/include/lame/ /usr/include/
# cp -r usr/lib/* /usr/lib/

如果下载是源码的话:

1
2
3
4
5
# tar zxvf lame-3.97.tar.gz
# cd lame-3.97
# ./configure —prefix=/usr —enable-shared
# make
# make install

  1. ogg vorbis:这个一般的redhat自带,不需要下载.可以去看看/usr/lib/bvorbis.a在不在
1
# ls /usr/lib/libvorbis.*

如果不在,安装以下rpm包(安装盘中自带)
libvorbis, libvorbis-devel,libogg, libogg-devel

  1. http://www.xvid.org/下载XVid
    http://downloads.xvid.org/downloads/xvidcore-1.1.0.tar.gz
1
2
3
# ./configure —prefix=/usr
# make
# make install

在这里下载x264
ftp://ftp.videolan.org/pub/videolan/x264/snapshots
或者
svn co svn://svn.videolan.org/x264/trunk x264

1
2
3
# ./configure —prefix=/usr —enable-shared
# make
# make install

[注] 如果你的机器是多cpu的服务器,x264在make的时候会提示类似下面的错误:

1
2
3
4
5
……

common/cpu.c: In functionx264_cpu_num_processors’: common/cpu.c:220: warning: passing arg 2 of sched_getaffinity' makes integer from pointer without a cast
common/cpu.c:220: error: too few arguments to functionsched_getaffinity’
make: * [common/cpu.o] Error 1

解决办法:
例如您的服务器cpu个数是2个

修改common/cpu.c
找到下面的代码段:

1
2
3
4
5
6
7
8
9
elif defined(SYS_LINUX)
unsigned int bit;
int np;
cpu_set_t p_aff;
memset( &p_aff, 0, sizeof(p_aff) );
sched_getaffinity( 0, &p_aff );
for( np = 0, bit = 0; bit < sizeof(p_aff); bit++ )
np += (((uint8_t *)&p_aff)[bit / 8] >> (bit % 8)) & 1;
return np;

修改为:

1
2
3
4
elif defined(SYS_LINUX)
int np;
np =2;
return np;

np表示你的cpu个数。

  1. 系统似乎已经支持ac3编码,编译的时候只要加–enable-a52 –enable-gpl参数就行
    LibDTS 下载:
    http://download.chinaunix.net/down.php?id=11568&ResourceID=5785&site=1
1
2
3
# ./configure —prefix=/usr
# make
# make install
  1. MPEG-4 AAC格式支持需要安装faad2和faac这两个包!
    我没找到官方的下载地址,(www.audiocoding.com 这个域名貌似不能用了!)
    从discuz的服务器上下载吧,(修正后的)
1
2
wget http://download.discuz.net/env/video/faac-1.25-Comsenz.tar.bz2
wget http://download.discuz.net/env/video/faad2-2.5-Comsenz.tar.bz2`

安装faad2

1
2
3
4
5
6
tar xjvf faad2-2.5-Comsenz.tar.bz2
cd faad2-Comsenz
autoreconf -vif
./configure —prefix=/usr —with-mp4v2 —enable-shared
make
make install

安装faac

1
2
3
4
5
6
7
cd /usr/local/video/
tar xjvf faac-1.25-Comsenz.tar.bz2
cd faac-Comsenz
autoreconf -vif
./configure —prefix=/usr —with-mp4v2 —enable-shared
make
make install

这两个包编译时间有点小长…耐心等待… ^^

  1. 支持3gp格式,这也是现在好多手机支持的格式
    amrwb_float :
    wget http://www.3gpp.org/ftp/Specs/archive/26_series/26.204/26204-510.zip

amr_float :
wget http://www.3gpp.org/ftp/Specs/archive/26_series/26.104/26104-510.zip

分别解压拷贝到ffmpeg/libavcodec/amrwb_float和ffmpeg/libavcodec/amrwb_float
ffmpeg编译时加编译参数:–enable-amr_nb –enable-amr_wb

编译安装ffmpeg

1
2
3
4
5
# ./configure --prefix=/usr --enable-gpl --enable-shared --enable-mp3lame --enable-amr_nb --enable-amr_wb \
--enable-amr_if2 --enable-libogg --enable-vorbis --enable-xvid --enable-a52 --enable-a52bin --enable-faadbin \
--enable-dts --enable-pp --enable-faad --enable-faac --enable-x264 --enable-pthreads --disable-ffserver --disable-ffplay
# make
# make install

(ffmpeg 安装完)

注:最新版本的ffmpeg已经比以前支持更多的格式了.只需安装lame,xvid,x264就可以了!

mencoder 安装
安装mplayer即可,从mplayer官方网站(http://www.mplayerhq.hu/),下载最新的mplayer和解码包

mplayer :
wget http://www1.mplayerhq.hu/MPlayer/releases/MPlayer-1.0rc1.tar.bz2

codecs:
wget http://www1.mplayerhq.hu/MPlayer/releases/codecs/essential-20061022.tar.bz2

编译安装

1
2
3
4
5
6
tar jxvf essential-20061022.tar.bz2
mv essential-20061022 /usr/lib/codecs
tar jxvf MPlayer-1.0rc1.tar.bz2
cd MPlayer-1.0rc1
./configure —prefix=/usr/local —enable-gui —enable-largefiles —enable-gif —enable-png —enable-jpeg —language=zh_CN—with-codecsdir=/usr/lib/codecs/
make ; make install

(mencoder 安装完)

================================================================

Ffmpeg使用语法

1
ffmpeg [[options][`-i’ input_file]]… {[options] output_file}…

如果没有输入文件,那么视音频捕捉(只在Linux下有效,因为Linux下把音视频设备当作文件句柄来处理)就会起作用。作为通用的规则,选项一般用于下一个特定的文件。如果你给 –b64选项,改选会设置下一个视频速率。对于原始输入文件,格式选项可能是需要的。缺省情况下,ffmpeg试图尽可能的无损转换,采用与输入同样的音频视频参数来输出。

视频文件截图

截取一张352x240尺寸大小的,格式为jpg的图片

1
ffmpeg -i test.asf -y -f image2 -t 0.001 -s 352x240 a.jpg

把视频的前30帧转换成一个Animated Gif

1
ffmpeg -i test.asf -vframes 30 -y -f gif a.gif

截取指定时间的缩微图

1
2
ffmpeg -i test.avi -y -f image2 -ss 8 -t 0.001 -s 350x240 test.jpg
-ss后跟的时间单位为秒

转换文件为3GP格式

1
2
3
4
5
ffmpeg -y -i test.mpeg -bitexact -vcodec h263 -b 128 -r 15 -s 176x144
-acodec aac -ac 2 -ar 22500 -ab 24 -f 3gp test.3gp

ffmpeg -y -i test.mpeg -ac 1 -acodec amr_nb -ar 8000 -s 176x144 -b 128 -r 15 test.3gp
视频格式转换

如何使用 ffmpeg 编码得到高质量的视频

1
2
3
4
ffmpeg.exe -i “D:VideoFearlessFearless.avi” -target film-dvd -s 720x352
-padtop 64 -padbottom 64 -maxrate 7350000 -b 3700000 -sc_threshold 1000000000
-trellis -cgop -g 12 -bf 2 -qblur 0.3 -qcomp 0.7 -me full -dc 10 -mbd 2
-aspect 16:9 -pass 2 -passlogfile “D:Videoffmpegencode” -an -f mpeg2video “D:Fearless.m2v”

转换指定格式文件到FLV格式

1
2
ffmpeg.exe -i test.mp3 -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 f:test.flv
ffmpeg.exe -i test.wmv -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 f:test.flv

转码解密的VOB

1
ffmpeg -i snatch_1.vob -f avi -vcodec mpeg4 -b 800 -g 300 -bf 2 -acodec mp3 -ab 128 snatch.avi

上面的命令行将vob的文件转化成avi文件,mpeg4的视频和mp3的音频。注意命令中使用了B帧,所以mpeg4流是divx5兼容的。GOP大小是300意味着29.97帧频下每10秒就有INTRA帧。该映射在音频语言的DVD转码时候尤其有用。

同时编码到几种格式并且在输入流和输出流之间建立映射

1
ffmpeg -i /tmp/a.wav -ab 64 /tmp/a.mp2 -ab 128 /tmp/b.mp2 -map 0:0 -map 0:0

上面的命令行转换一个64Kbits 的a.wav到128kbits的a.mp2 ‘-map file:index’在输出流的顺序上定义了哪一路输入流是用于每一个输出流的。

转换文件为3GP格式

1
2
ffmpeg -i test.avi -y -b 20 -s sqcif -r 10 -acodec amr_wb -ab 23.85 -ac 1 -ar 16000 test.3gp
注:如果要转换为3GP格式,则ffmpeg在编译时必须加上--enable-amr_nb --enable-amr_wb

屏幕录制

使用ffmpeg录像屏幕

1
ffmpeg -vcodec mpeg4 -b 1000 -r 10 -g 300 -vd x11:0,0 -s 1024x768 ~/test.avi

其中,-vd x11:0,0 指录制所使用的偏移为 x=0 和 y=0,-s 1024×768 指录制视频的大小为 1024×768。录制的视频文件为 test.avi,将保存到用户主目录中

如果你只想录制一个应用程序窗口或者桌面上的一个固定区域,那么可以指定偏移位置和区域大小。使用xwininfo -frame命令可以完成查找上述参数。
重新调整视频尺寸大小

1
2
ffmpeg -vcodec mpeg4 -b 1000 -r 10 -g 300 -i ~/test.avi -s 800×600 ~/test-800-600.avi
注:ffmpeg的屏幕录制功能只能在Linux环境下有效。