FFMPEG堪称自由软件中完备的一套多媒体支持库,它几乎实现了所有当下常见的数据封装格式、多媒体传输协议以及音视频编解码器,提供了录制、转换以及流化音视频的完整解决方案。市面上使用FFMPEG作为内核视频播放器有Mplayer,ffplay,射手播放器,暴风影音,KMPlayer,QQ影音等;使用FFMPEG作为内核的Directshow Filter:ffdshow,lav filters.等;使用FFMPEG作为内核的转码工具:ffmpeg,格式工厂,狸窝视频转换器等。
1.应用程序使用方法
打开系统命令行接面,切换到ffmpeg所在的目录,就可以使用这3个应用程序了。首先在开始菜单搜索框中输入cmd并回车到命令行界面,然后切换到ffmpeg所存储的位置,例如将应用程序放在D:\ffmpeg-20160825-01aee81-win64-static\ffmpeg-20160825-01aee81-win64-static\bin,实例如图:
上图实例是将一个bus.avi中视频分离出来,利用三个应用程序中的ffmpeg.exe。
ffmpeg –y –i input –vcodeccopy –an output.avi
其中-y表示覆盖同名文件,-i表示输入文件即bus.avi,-vcodec表示编码方式,后面的copy表示用原来的编码方式,即不重新编码,-an表示去除音频,后面的busv.avi表示分离出的视频文件。
同理将视频中的音频文件分离出来的命令行为:
ffmpeg -ibus.avi -acodec copy -vn busa.wav。
上面举例说明了应用程序的用法,应用程序的命令行相对代码要简单很多,也能实现例如音视频分离、转码、播放等各种功能,如视频转码的命令行为:
ffmpeg -y -i input.mp4 -vcodec libx264 -acodec copy output.mp4
其中libx264为指定的视频编码器。
ffmpeg –s 352x288 -iinput -r 25 original/%04d.bmp
-s用来指定导出帧序列的大小(可缺省),-i表示输入的视频,-r表示提取的帧率(可缺省),original/%04d.bmp中的original/表示用于存放帧图片的文件夹(要提前创建),%04d表示自动按照序列命名,为4位数(0001~9999),其中图片格式可以改为jpg等等。
ffmpeg -f image2 -i original \%04d.jpg -vcodec libx264 -r 10 -b 200k test.mp4
-f用来指定封装格式;-i original \%04d.jpg表示存放在original文件夹下的帧图片,这里的%04d.jpg要和将视频分解为帧时候的格式一样,注意这里帧图像的命名要为自然数;-vcodec libx264指定了生成的视频的编码格式;-r指定了帧率大小(可缺省);-b指定了码率大小为多少bit/s(可缺省)
ffmpeg -ss 0:0:5 -t 0:0:10 -i input.avi -vcodec copy -acodec copy output.avi
这个命令用于剪切视频,-ss表示从第几秒开始,如上实例为从第5秒开始,-t代表剪持续几秒长度的视频,如上实例就是剪10秒长度的视频,copy表示视频编码格式和音频编码格式与原视频统一。
2.FFmpeg其它常用命令
1.分离视频音频流
ffmpeg -i input_file -vcodec copy -an output_file_video //分离视频流
ffmpeg -i input_file -acodec copy -vn output_file_audio //分离音频流
2.视频解复用
ffmpeg –i test.mp4 –vcodec copy –an –f m4v test.264
ffmpeg –i test.avi –vcodec copy –an –f m4v test.264
3.视频转码
ffmpeg –i test.mp4 –vcodec h264 –s 352*278 –an –f m4v test.264 //转码为码流原始文件
ffmpeg –i test.mp4 –vcodec h264 –bf 0 –g 25 –s 352*278 –an –f m4v test.264 //转码为码流原始文件
ffmpeg –i test.avi -vcodec mpeg4 –vtag xvid –qsame test_xvid.avi //转码为封装文件
//-bf B帧数目控制,-g 关键帧间隔控制,-s 分辨率控制
4.视频封装
ffmpeg –i video_file –i audio_file –vcodec copy –acodec copy output_file
5.视频剪切
ffmpeg –i test.avi –r 1 –f image2 image-%3d.jpeg //提取图片
ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi //剪切视频
//-r 提取图像的频率,-ss 开始时间,-t 持续时间
6.视频录制
ffmpeg –i rtsp://192.168.3.205:5555/test –vcodec copy out.avi
7.YUV序列播放
ffplay -f rawvideo -video_size 1920x1080 input.yuv
8.YUV序列转AVI
ffmpeg –s w*h –pix_fmt yuv420p –i input.yuv –vcodec mpeg4 output.avi
常用参数说明:
主要参数: -i 设定输入流 -f 设定输出格式 -ss 开始时间 视频参数: -b 设定视频流量,默认为200Kbit/s -r 设定帧速率,默认为25 -s 设定画面的宽与高 -aspect 设定画面的比例 -vn 不处理视频 -vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器 音频参数: -ar 设定采样率 -ac 设定声音的Channel数 -acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器 -an 不处理音频
------------------------------------------------------------------------
0、压缩转码mp4文件
ffmpeg -i input.avi -s 640x480 output.avi
ffmpeg -i input.avi -strict -2 -s vga output.avi
1、将文件当做直播送至live
ffmpeg -re -i localFile.mp4 -c copy -f flv rtmp://server/live/streamName
2、将直播媒体保存至本地文件
ffmpeg -i rtmp://server/live/streamName -c copy dump.flv
3、将其中一个直播流,视频改用h264压缩,音频不变,送至另外一个直播服务流
ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v libx264 -vpre slow -f flv rtmp://server/live/h264Stream
4、将其中一个直播流,视频改用h264压缩,音频改用faac压缩,送至另外一个直播服务流
ffmpeg -i rtmp://server/live/originalStream -c:a libfaac -ar 44100 -ab 48k -c:v libx264 -vpre slow -vpre baseline -f flv rtmp://server/live/h264Stream
5、将其中一个直播流,视频不变,音频改用faac压缩,送至另外一个直播服务流
ffmpeg -i rtmp://server/live/originalStream -acodec libfaac -ar 44100 -ab 48k -vcodec copy -f flv rtmp://server/live/h264_AAC_Stream
6、将一个高清流,复制为几个不同视频清晰度的流重新发布,其中音频不变
ffmpeg -re -i rtmp://server/live/high_FMLE_stream -acodec copy -vcodec x264lib -s 640×360 -b 500k -vpre medium -vpre baseline rtmp://server/live/baseline_500k -acodec copy -vcodec x264lib -s 480×272 -b 300k -vpre medium -vpre baseline rtmp://server/live/baseline_300k -acodec copy -vcodec x264lib -s 320×200 -b 150k -vpre medium -vpre baseline rtmp://server/live/baseline_150k -acodec libfaac -vn -ab 48k rtmp://server/live/audio_only_AAC_48k
7、功能一样,只是采用-x264opts选项
ffmpeg -re -i rtmp://server/live/high_FMLE_stream -c:a copy -c:v x264lib -s 640×360 -x264opts bitrate=500:profile=baseline:preset=slow rtmp://server/live/baseline_500k -c:a copy -c:v x264lib -s 480×272 -x264opts bitrate=300:profile=baseline:preset=slow rtmp://server/live/baseline_300k -c:a copy -c:v x264lib -s 320×200 -x264opts bitrate=150:profile=baseline:preset=slow rtmp://server/live/baseline_150k -c:a libfaac -vn -b:a 48k rtmp://server/live/audio_only_AAC_48k
8、将当前摄像头及音频通过DSSHOW采集,视频h264、音频faac压缩后发布
ffmpeg -r 25 -f dshow -s 640×480 -i video=”video source name”:audio=”audio source name” -vcodec libx264 -b 600k -vpre slow -acodec libfaac -ab 128k -f flv rtmp://server/application/stream_name
9、将一个JPG图片经过h264压缩循环输出为mp4视频
ffmpeg.exe -i INPUT.jpg -an -vcodec libx264 -coder 1 -flags +loop -cmp +chroma -subq 10 -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -flags2 +dct8x8 -trellis 2 -partitions +parti8x8+parti4x4 -crf 24 -threads 0 -r 25 -g 25 -y OUTPUT.mp4
10、将普通流视频改用h264压缩,音频不变,送至高清流服务(新版本FMS live=1)
ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v libx264 -vpre slow -f flv “rtmp://server/live/h264Stream live=1〃
------------------------------------------------------------------------
1.采集usb摄像头视频命令:
ffmpeg -t 20 -f vfwcap -i 0 -r 8 -f mp4 cap1111.mp4
./ffmpeg -t 10 -f vfwcap -i 0 -r 8 -f mp4 cap.mp4
具体说明如下:我们采集10秒,采集设备为vfwcap类型设备,第0个vfwcap采集设备(如果系统有多个vfw的视频采集设备,可以通过-i num来选择),每秒8帧,输出方式为文件,格式为mp4。
2.简单的抓屏:
ffmpeg -f gdigrab -i desktop out.mpg
3.从屏幕的(10,20)点处开始,抓取640x480的屏幕,设定帧率为5 :
ffmpeg -f gdigrab -framerate 5 -offset_x 10 -offset_y 20 -video_size 640x480 -i desktop out.mpg
4.ffmpeg从视频中生成gif图片:
ffmpeg -i capx.mp4 -t 10 -s 320x240 -pix_fmt rgb24 jidu1.gif
5.ffmpeg将图片转换为视频:
http://blog.sina.com.cn/s/blog_40d73279010113c2.html
3.播放器基本原理
ffmpeg播放器基本上由五个模块组成,它们分别是源文件模块、解复用模块、解码模块、颜色空间转换摸块和渲染模块。其基本模块如下图:
其中,源文件模块是这个播放器的起始,主要是为下面的各个模块以数据包的方式提供数据流。具体而言就是从本地视频文件中读取出数据包,然后将其按照一定的顺序排列,源源不断得发送到下面的解复用模块中。
解复用模块根据源文件的容器格式来分离出视频流、音频流和字幕流,在加入时间同步等信息后传送给下面的解码模块。为识别出不同的文件类型和媒体类型,常规的做法是读取一部分数据,然后遍历解复用播放器支持的文件格式和媒体数据格式,做匹配来确定是哪种文件类型,哪种媒体类型,有些媒体类型的原始数据外面还有其他的信息,比如时间,包大小,是否完整包等等。这里要注意的是,时钟信息的计算工作也是在这个模块完成,用于各媒体之间的同步。
解码模块作用就是解码数据包,并且把同步时钟信息传递下去。对视频媒体而言,通常是解码成YUV 数据,然后利用显卡硬件直接支持YUV 格式数据Overlay 快速显示的特性让显卡极速显示。YUV格式是一个统称,常见的有YV12,YUY2,UYVY 等等。有些非常古老的显卡和嵌入式系统不支持YUV 数据显示,那就要转换成RGB 格式的数据,每一帧的每一个像素点都要转换,分别计算RGB 分量,并且因为转换是浮点运算,虽然有定点算法,还是要耗掉相当一部分CPU,总体上效率底下;对音频媒体而言,通常是解码成PCM 数据,然后送给声卡直接输出。
颜色空间转换模块的作用是把视频解码器解码出来的数据转换成当前显示系统支持的颜色格式。通常视频解码器解码出来的是YUV 数据,PC 系统是直接支持YUV 格式的,也支持RGB 格式,有些嵌入式系统只支持RGB 格式的。
渲染模块对视频来说就是显示视频图像,对音频来说就是播放声音,对字幕来说就是显示字幕,并保持视频、音频和字幕的同步播放。
4.ffmpeg转码基本原理
转码器在视音频编解码处理的程序中,属于一个比较复杂的东西。因为它结合了视频的解码和编码。一个视频播放器,一般只包含解码功能;一个视频编码工具,一般只包含编码功能;而一个视频转码器,则需要先对视频进行解码,然后再对视频进行编码,因而相当于解码器和编码器的结合。下图例举了一个视频的转码流程。输入视频的封装格式是FLV,视频编码标准是H.264,音频编码标准是AAC;输出视频的封装格式是AVI,视频编码标准是MPEG2,音频编码标准是MP3。从流程中可以看出,首先从输入视频中分离出视频码流和音频压缩码流,然后分别将视频码流和音频码流进行解码,获取到非压缩的像素数据/音频采样数据,接着将非压缩的像素数据/音频采样数据重新进行编码,获得重新编码后的视频码流和音频码流,后将视频码流和音频码流重新封装成一个文件。