FFmpeg的名称来自MPEG视频编码标准,前面的“FF”代表“Fast Forward”,FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。可以轻易地实现多种视频格式之间的相互转换。
FFmpeg的用户有Google,Facebook,Youtube,优酷,爱奇艺,土豆等。
组成
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).
在多媒体处理中,filter的意思是被编码到输出文件之前用来修改输入文件内容的一个软件工具。如:视频翻转,旋转,缩放等。
语法:[input_link_label1][input_link_label2]… filter_name=parameters [output_link_label1][output_link_label2]…
过滤器图link label :是标记过滤器的输入或输出的名称
1.视频过滤器 -vf
2.音频过滤器 -af
回答上面提的问题,实现水平翻转视频和源视频进行比较:
用ffplay直接观看结果:
ffplay -f lavfi -i testsrc -vf split[a][b];[a]pad=2*iw[F1: split过滤器创建两个输入文件的拷贝并标记为[a],[b]
F2: [a]作为pad过滤器的输入,pad过滤器产生2倍宽度并输出到[1].
F3: [b]作为hflip过滤器的输入,vflip过滤器水平翻转视频并输出到[2].
F4: 用overlay过滤器把 [2]覆盖到[1]的旁边.1];[b]hflip[2];[1][2]overlay=w
##选择媒体流##
一些多媒体容器比如AVI,mkv,mp4等,可以包含不同种类的多个流,如何从容器中抽取各种流呢?
语法:
-map file_number:stream_type[:stream_number]
这有一些特别流符号的说明:
1、-map 0 选择第一个文件的所有流
2、-map i:v 从文件序号i(index)中获取所有视频流, -map i:a 获取所有音频流,-map i:s 获取所有字幕流等等。
3、特殊参数-an,-vn,-sn分别排除所有的音频,视频,字幕流。
FFmpeg工具有一个巨大的控制台帮助。下表描述了可用的一些选项,斜体字表示要被替换的项,ffplay和ffprobe也有一些类似的选项。
帮助
可用的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版本而有差异,使用前建议先参考参数及编解码器的叙述。此外,参数明细可用 ffmpeg -h 显示;编解码器名称等明细可用 ffmpeg -formats 显示。
下列为较常使用的参数。
-i 设定输入档名。
-f 设定输出格式。
-y 若输出档案已存在时则覆盖档案。
-fs 固定大小(fixed size),超过指定的档案大小时则结束转换。
-ss 从指定时间开始转换。
-t 录制时间
-title 设定标题。
-timestamp 设定时间戳。
-vsync 增减Frame使影音同步。
-b 设定影像流量,默认为200Kbit/秒。
-qscale <数值> 以<数值>质量为基础的VBR,取值0.01-255,越小质量越好。较新版本中修改为 -q:v <数值>. 例如 -q:v 0 则指定输出与输入是相同的quality.
-qmin <数值> 设定最小质量,与-qmax(设定最大质量)共用,比如-qmin 10 -qmax 31
-sameq 使用和源同样的质量
-r 设定FrameRate值,默认为25。
-s 设定画面的宽与高。
-aspect 设定画面的比例。
-vn 不处理影像,于仅针对声音做处理时使用。
-vcodec 设定影像影像编解码器,未设定时则使用与输入档案相同之编解码器。较新版本中修改为**-c:v <编解码器名>**。例如 -c:v libx264 指定编解码器为libx264.
-ab 设定每Channel (最近的SVN 版为所有Channel的总合)的流量。( 单位 请参照下方注意事项 )
-ar 设定采样率。
-ac 设定声音的Channel数。
-acodec 设定声音编解码器,未设定时与影像相同,使用与输入档案相同之编解码器。
-an 不处理声音,于仅针对影像做处理时使用。
-vol 设定音量大小,256为标准音量。(要设定成两倍音量时则输入512,依此类推。)
ffmpeg -i inputfile.mpg -f mp4 -acodec libfaac -vcodec mpeg4 -b 256k -ab 64k outputfile.mp4
ffmpeg -i inputfile.vob -f mpeg -acodec mp2 -vcodec mpeg1video -s 352x240 -b 1152k -ab 128k outputfile.mpg
ffmpeg -i inputfile.avi -f mp4 -acodec libfaac -vcodec libx264 -b 512k -ab 320k outputfile.m4v
ffmpeg -i input1.avi -sameq inputfile_01.mpg
ffmpeg -i input2.avi -sameq inputfile_02.mpg
cat inputfile_01.mpg inputfile_02.mpg > inputfile_all.mpg
ffmpeg -i inputfile_all.mpg -sameq outputfile.avi
ffmpeg -i file.avi
ffprobe -v error -select_streams v:0 -show_entries stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mp4
注意不是所有格式都可以用这种方法,这需要container(这里是mp4)支持。
ffmpeg -i file.avi output.flv
-i 表示输入文件
ffmpeg -i video.avi -vcodec copy -an video2.avi
ffmpeg -i video2.avi -i audio.mp3 -vcodec copy -acodec copy output.avi
-vcodec copy 表示 force video codec (‘copy’ to copy stream) 这个不知怎么译 ,估计是直接copy
方法2. 好像可以直接指定两个输入文件:
ffmpeg -i /tmp/a.wav -i /tmp/a.avi /tmp/a.avi
两个文件的顺序很重要。
ffmpeg -i test.avi -f image2 -ss 8 -t 0.001 -s 350x240 -vf format=gray test.jpg
第8秒处 截一张灰度图。该命令也可以截取视频,只需要把时间参数-t改成具体的秒数即可。例如从第3分35秒片截取15秒的视频,可以这样这样写
ffmpeg -i test.avi -ss 3:35 -t 15 out.mp4
ffmpeg -r 60 -f image2 -s 1920x1080 -start_number 1 -i pic%04d.png -vframes 1000 -vcodec libx264 -crf 25 -pix_fmt yuv420p test.mp4
ffmpeg -i pic%04d.png -vcodec libx264 -preset veryslow -crf 0 output.avi # lossless compression
-r
is the framerate (fps)-crf
is the quality, lower means better quality, 15-25 is usually good. 当crf为0时,表示无损压缩。-preset
压缩模式,有两种选项:veryslow, extrafast
。不影响压缩的质量,只影响压缩文件大小。-s
is the resolution-pix_fmt yuv420p
specifies the pixel format, change this as needed-start_number
specifies what image to start at-vframes 1000
specifies the number frames/images in the videoffmpeg -i example.mkv -c copy -an example-nosound.mkv
ffmpeg -i input.mkv -filter:v “setpts=0.5*PTS” output.mkv
如两个flv 文件连接成一个。好像必须先将文件 转成mpg ,dv 等格式的文件后才能进行连接。
帧率:帧率也叫帧频率,帧率是视频文件中每一秒的帧数,肉眼想看到连续移动图像至少需要15帧。
码率:比特率(也叫码率,数据率)是一个确定整体视频/音频质量的参数,秒为单位处理的字节数,码率和视频质量成正比,在视频文件中中比特率用bps来表达。
例如设置码率为29.97fps,下面三种方式具有相同的结果:
ffmpeg -i input.avi -r 29.97 output.mpg
ffmpeg -i input.avi -r 30000/1001 output.mpg
ffmpeg -i input.avi -r netsc output.mpg
翻转
– 水平翻转语法: -vf hflip
ffplay -f lavfi -i testsrc -vf hflip
– 垂直翻转语法:-vf vflip
ffplay -f lavfi -i testsrc -vf vflip
旋转
语法:transpose={0,1,2,3}
0:逆时针旋转90°然后垂直翻转
1:顺时针旋转90°
2:逆时针旋转90°
3:顺时针旋转90°然后水平翻转
语法:-vf delogo=x:y:w:h[:t[:show]]
x:y 离左上角的坐标
w:h logo的宽和高
t: 矩形边缘的厚度默认值4
show:若设置为1有一个绿色的矩形,默认值0.
ffplay -i jidu.mp4 -vf delogo=50:51:60:600
语法:
drawtext=fontfile=font_f:text=text1[:p3=v3[:p4=v4[…]]]
常用的参数值
x:离左上角的横坐标
y: 离左上角的纵坐标
fontcolor:字体颜色
fontsize:字体大小
text:文本内容
textfile:文本文件
t:时间戳,单位秒
n:帧数开始位置为0
draw/enable:控制文件显示,若值为0不显示,1显示,可以使用函数
用多个输入文件创建一个马赛克视频:
ffmpeg -i jidu.mp4 -i jidu.flv -i “Day By Day SBS.mp4” -i “Dangerous.mp4” -filter_complex “nullsrc=size=640x480 [base]; [0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=320 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=320:y=240” -c:v libx264 output.mkv
两张图像im0.png (30像素高)和im1.jpg (20像素高)上下拼接:
ffmpeg -i im0.png -i im1.jpg -filter_complex “[0:v] pad=iw:50 [top]; [1:v] copy [down]; [top][down] overlay=0:30” im3.png
需要将需要拼接的视频文件按以下格式保存在一个列表 list.txt 中:
file ‘/path/to/file1’
file ‘/path/to/file2’
file ‘/path/to/file3’
相应的命令为:
ffmpeg -f concat -i list.txt -c copy output.mp4
将下面这行保存为ffplay2.bat,运行时输入:ffplay2 video1.mp4 video2.mp4
,即可实现左右同步播放。
ffplay -f lavfi “movie=%1,scale=iw/2:ih[v0];movie=%2,scale=iw/2:ih[v1];[v0][v1] hstack”
还可以输入更多的参数,比如缩小系数、堆叠方式。例如:ffplay2 video1.mp4 video2.mp4 2 vstack
可以将两个视频缩小2倍、竖起方向堆叠同步播放。
ffplay -f lavfi “movie=%1,scale=iw/%3:ih/%3[v0];movie=%2,scale=iw/%3:ih/%3[v1];[v0][v1] %4”
ffmpeg -f x11grab -s xga -r 10 -i :0.0+0+0 wheer.avi
ffmpeg -f x11grab -s 320x240 -r 10 -i :0.0+100+200 wheer.avi
:0:0 表示屏幕(个人理解,因为系统变量$DISPLAY值就是:0.0) 而100,表示距左端100象素,200表示距上端200
-r 10 设置频率
ffmpeg -f x11grab -s xga -qscale 5 -r 10 -i :0.0+0+0 wheer.avi
-qscale 8 设定画面质量,值越小越好
ffmpeg在Linux下用X11grab进行屏幕录像,在Windows下用DirectShow滤镜
首先需要安装一个软件,screen capture recorder
编译好的下载地址是:
http://sourceforge.net/projects/screencapturer/files/
源码地址是:
https://github.com/rdp/screen-capture-recorder-to-video-windows-free
安装完了之后,在命令行执行:
ffmpeg -list_devices true -f dshow -i dummy
可查看新的Direct Show设备。
然后就可以用FFMPEG来进行录像了
ffmpeg -f dshow -i video=“screen-capture-recorder” -f dshow -i audio=“virtual-audio-capturer” -pix_fmt yuv420p -vcodec libx264 -acodec libvo_aacenc -s 1280x720 -r 25 -q 10 -ar 44100 -ac 2 -tune zerolatency -preset ultrafast -f mpegts - | ffmpeg -f mpegts -i - -c copy -bsf:a aac_adtstoasc -f flv temp.flv
ffmpeg -f dshow -i video=“screen-capture-recorder” -pix_fmt yuv420p -vcodec libx264 -s 1280x720 -r 25 -q 2 -f flv temp.flv
###屏幕录像,同时录音###
ffmpeg -f oss -i /dev/dsp -f x11grab -r 30 -s 1024x768 -i :0.0 output.mkv
ffmpeg -ac 2 -f oss -i /dev/dsp -f x11grab -r 30 -s 1024x768 -i :0.0 -acodec pcm_s16le -vcodec libx264 -vpre lossless_ultrafast -threads 0 output.mkv
看到这,你会发现这个命令有多强大。
如果我屏幕上打开了一个窗口,我只想录这个窗口的内容,如何确定这个窗口的坐标位置呢?可以用另外一个命令xwininfo 输入这个命令后,用鼠标点选目标窗口,就会出现目标窗口的坐标,宽高等一系列信息。
如果你觉得mp3 文件 有点大,想变小一点那么可以通过-ab 选项改变音频的比特率 (bitrate)
ffmpeg -i input.mp3 -ab 128 output.mp3 //这里将比特率设为128
你可以用file 命令查看一下源文件 的信息
(要有可用的麦克风,并且如果用alsa 的话,好像得安alsa-oss,重启)
ffmpeg -f oss -i /dev/dsp out.avi (should hava oss or alsa-oss)
ffmpeg -f alsa -ac 2 -i hw:0, 0 out.avi (should )
ffmpeg -f alsa -ac 2 -i pulse (should hava PulseAudio)
在alsa 体系中声卡(也可能是麦克风)叫hw:0,0 而在oss 体系中叫/dev/dsp (用词可能不太专业) 。Linux在安装了声卡后,会有一些设备文件生成,采集数字样本的/dev/dsp文件,针对混音器的/dev/mixer文件,用于音序器的/dev/sequencer,/dev/audio文件一个基于兼容性考虑的声音设备文件。只要向/dev/audio中输入wav文件就能发出声音。而对/dev/dsp文件读取就能得到WAV文件格式的声音文件。
参考:http://blog.csdn.net/jixiuffff/article/details/5709976