0 概述
FFmpeg是一套領(lǐng)先的音視頻多媒體處理開源框架,采用LGPL或GPL許可證芯咧。它提供了對音視頻的采集牙捉、編碼、解碼敬飒、轉(zhuǎn)碼邪铲、音視頻分離、合并驶拱、流化霜浴、過濾器等豐富的功能,包含了非常先進的音頻/視頻編解碼庫libavcodec蓝纲,具有非常高的可移植性和編解碼質(zhì)量阴孟。
A complete, cross-platform solution to record, convert and stream audio and video.
FFmpeg在Linux平臺下開發(fā),但它同樣也可以在其它操作系統(tǒng)環(huán)境中編譯運行税迷,包括Windows永丝、Mac OS X等。
這個項目最早由Fabrice Bellard發(fā)起箭养,2004年至2015年間由Michael Niedermayer主要負責維護慕嚷。許多FFmpeg的開發(fā)人員都來自MPlayer項目,而且當前FFmpeg也是放在MPlayer項目組的服務(wù)器上。項目的名稱來自MPEG視頻編碼標準喝检,前面的"FF"代表Fast Forward
嗅辣。
Libav項目啟動之后,F(xiàn)Fmpeg官方版本也仍然在一直維護中挠说。FFmpeg與libav屬于獨立的兩個項目澡谭。
1 項目組成
1.1 主要的開發(fā)庫:
- libavutil:包含一些公共的工具函數(shù),包括隨機數(shù)生成损俭、數(shù)據(jù)結(jié)構(gòu)蛙奖、核心多媒體工具等;
- libavcodec:用于各種類型聲音/圖像encode/decode編解碼庫杆兵;
- libavformat:用于各種音視頻封裝格式(mp4/AVI/Flv等)的生成和解析muxer/demuxer雁仲,包括獲取解碼所需信息以生成解碼上下文結(jié)構(gòu)和讀取音視頻幀等功能;
- libavdevice:讀取電腦(或者其他設(shè)備上)的多媒體設(shè)備的數(shù)據(jù) 或者輸出數(shù)據(jù)到指定的多媒體設(shè)備上琐脏;
- libswresample: 用于音頻采樣采樣數(shù)據(jù)(PCM)轉(zhuǎn)換的庫攒砖;
- libswscale:用于視頻場景比例縮放、色彩映射轉(zhuǎn)換的庫骆膝;
- libavfilter: 包含媒體濾波器的庫
1.2 主要的工具集:
- ffmpeg:一個命令行工具祭衩,可用于格式轉(zhuǎn)換灶体、解碼或電視卡即時編碼等阅签;
- ffsever:一個 HTTP 、RTSP的實時廣播流媒體服務(wù)器蝎抽;
- ffplay:是一個簡單的播放器政钟,使用ffmpeg 庫解析和解碼,通過SDL顯示樟结;
- ffprobe : 一個多媒體流分析工具养交。 它從多媒體流中收集信息 并且以人類和機器可讀的形式打印出來
2 功能
FFmpeg的功能主要包括視頻采集功能、視頻格式轉(zhuǎn)換瓢宦、視頻抓圖碎连、給視頻加水印等。
2.1 視頻采集
ffmpeg視頻采集功能非常強大驮履,不僅可以采集視頻采集卡或USB攝像頭的圖像鱼辙,還可以進行屏幕錄制,同時還支持以RTP方式將視頻流傳送給支持RTSP的流媒體服務(wù)器玫镐,支持直播應(yīng)用
在Linux平臺上倒戏,ffmpeg對V4L2的視頻設(shè)備提供了很好的支持,如:
./ffmpeg -t 10 -f video4linux2 -s 176*144 -r 8 -i /dev/video0 -vcodec h263 -f rtp rtp://192.168.1.105:5060 > /tmp/ffmpeg.sdp
以上命令表示:
- 采集10秒鐘視頻恐似,
- 對video4linux2視頻設(shè)備進行采集杜跷,
- 采集QCIF(176*144)的視頻,
- 每秒8幀,視頻設(shè)備為/dev/video0葛闷,
- 視頻編碼為h263憋槐,
- 輸出格式為RTP,
- 后面定義了IP地址及端口淑趾,
- 將該碼流所對應(yīng)的SDP文件重定向到/tmp/ffmpeg.sdp中秦陋,將此SDP文件上傳到流媒體服務(wù)器就可以實現(xiàn)直播了。
2.2 視頻格式轉(zhuǎn)換
ffmpeg可以輕易地實現(xiàn)多種視頻格式之間的相互轉(zhuǎn)換(wma,rm,avi,mod等)治笨,例如可以將攝錄下的視頻avi等轉(zhuǎn)成視頻網(wǎng)站所采用的flv格式驳概。
2.3 視頻截圖
對于選定的視頻,截取指定時間的縮略圖旷赖。
也可以進行視頻抓圖顺又,獲取靜態(tài)圖和動態(tài)圖。但要注意不要抓出的gif文件過大而播放不流暢等孵。
2.4 給視頻加水印
使用ffmpeg 視頻添加水印(logo)稚照。
3 ffmpeg命令使用舉例
獲取視頻的信息
ffmpeg -i video.avi
視頻采集
-
采集usb攝像頭視頻命令:
ffmpeg -t 20 -f vfwcap -i 0 -r 8 -f mp4 cap1111.mp4
具體說明如下:- 采集10秒,
- 采集設(shè)備為vfwcap類型設(shè)備俯萌,
- 第0個vfwcap采集設(shè)備(如果系統(tǒng)有多個vfw的視頻采集設(shè)備果录,可以通過-i num來選擇),
- 每秒8幀咐熙,
- 輸出方式為文件弱恒,格式為mp4。
最簡單的抓屏:
ffmpeg -f gdigrab -i desktop out.mpg
從屏幕的(10,20)點處開始棋恼,抓取640x480的屏幕返弹,設(shè)定幀率為5 :
ffmpeg -f gdigrab -framerate 5 -offset_x 10 -offset_y 20 -video_size 640x480 -i desktop out.mpg
將圖片序列合成視頻
ffmpeg -f image2 -i image%d.jpg video.mpg
上面的命令會把當前目錄下的圖片(名字如:image1.jpg. image2.jpg. 等...)合并成video.mpg將視頻分解成圖片序列
ffmpeg -i video.mpg image%d.jpg
上面的命令會生成image1.jpg. image2.jpg. ...
支持的圖片格式有:PGM. PPM. PAM. PGMYUV. JPEG. GIF. PNG. TIFF. SGI將.avi轉(zhuǎn)成gif動畫(未壓縮)
ffmpeg -i video_origine.avi gif_anime.gif
ffmpeg -i capx.mp4 -t 10 -s 320x240 -pix_fmt rgb24 jidu1.gif
從視頻抽出聲音
-
從avi提取mp3
ffmpeg -i source_video.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 sound.mp3
說明:- 源視頻:source_video.avi
- 音頻位率:192kb/s
- 輸出格式:mp3
- 生成的聲音:sound.mp3
從flv提取mp3
ffmpeg -i source.flv -ab 128k dest.mp3
合成視頻和音頻
ffmpeg -i son.wav -i video_origine.avi video_finale.mpg
-
視頻剪切
ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi
- -r 提取圖像的頻率,
- -ss 開始時間爪飘,
- -t 持續(xù)時間
視頻錄制
ffmpeg –i rtsp://192.168.3.205:5555/test –vcodec copy out.avi
視頻切片
-
直播切片
ffmpeg -i test.mp4 -f segment -segment_time 300 -segment_format mpegts -segment_list test.m3u8 -c copy -bsf:v h264_mp4toannexb -map 0 test-%d.ts
- live:表示直播
- re:以mp4的播放速率進行轉(zhuǎn)碼
點播切片
ffmpeg -re -i source.mp4 -codec:v libx264 -codec:a libfaac -map 0 -f hls -hls_list_size 6 -hls_wrap 10 -hls_time 10 playlist.m3u8
- 直播流轉(zhuǎn)碼輸出
將文件當做直播送至live
ffmpeg -re -i localFile.mp4 -c copy -f flv rtmp://server/live/streamName
將其中一個直播流义起,視頻改用h264壓縮,音頻不變师崎,送至另外一個直播服務(wù)流
ffmpeg -i rtmp://server/live/originalStream -c:a copy -c:v libx264 -vpre slow -f flv rtmp://server/live/h264Stream
將其中一個直播流默终,視頻改用h264壓縮,音頻改用faac壓縮犁罩,送至另外一個直播服務(wù)流
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
將其中一個直播流齐蔽,視頻不變,音頻改用faac壓縮昼汗,送至另外一個直播服務(wù)流
ffmpeg -i rtmp://server/live/originalStream -acodec libfaac -ar 44100 -ab 48k -vcodec copy -f flv rtmp://server/live/h264_AAC_Stream```將一個高清流肴熏,復(fù)制為幾個不同視頻清晰度的流重新發(fā)布,其中音頻不變
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
功能一樣顷窒,只是采用-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
將當前攝像頭及音頻通過DSSHOW采集蛙吏,視頻h264源哩、音頻faac壓縮后發(fā)布
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
- 視頻編碼格式轉(zhuǎn)換
-
把avi轉(zhuǎn)換成mp4
ffmpeg -i source_video.avi input -acodec aac -ab 128kb -vcodec mpeg4 -b 1200kb -mbd 2 -flags +4mv+trell -aic 2 -cmp 2 -subcmp 2 -s 320x180 -title X final_video.mp4
說明:- 源視頻:source_video.avi
- 音頻編碼:aac
- 音頻位率:128kb/s
- 視頻編碼:mpeg4
- 視頻位率:1200kb/s
- 視頻尺寸:320 X 180
- 生成的視頻:final_video.mp4
將.avi轉(zhuǎn)成.flv
ffmpeg -i video_origine.avi -ab 56 -ar 44100 -b 200 -r 15 -s 320x240 -f flv video_finale.flv
將.avi視頻轉(zhuǎn)成.mpg
ffmpeg -i video_origine.avi video_finale.mpg
將.mpg轉(zhuǎn)成.avi
ffmpeg -i video_origine.mpg video_finale.avi
將.avi壓縮成divx
ffmpeg -i video_origine.avi -s 320x240 -vcodec msmpeg4v2 video_finale.avi
將Ogg Theora壓縮成Mpeg dvd
ffmpeg -i film_sortie_cinelerra.ogm -s 720x576 -vcodec mpeg2video -acodec mp3 film_terminate.mpg
將.avi壓縮成SVCD mpeg2
NTSC格式:
ffmpeg -i video_origine.avi -target ntsc-svcd video_finale.mpg
PAL格式:
ffmpeg -i video_origine.avi -target pal-svcd video_finale.mpg
將.avi壓縮成VCD mpeg2
NTSC格式:
ffmpeg -i video_origine.avi -target ntsc-vcd video_finale.mpg
PAL格式:
ffmpeg -i video_origine.avi -target pal-vcd video_finale.mpg
將.avi轉(zhuǎn)成dv
ffmpeg -i video_origine.avi -s pal -r pal -aspect 4:3 -ar 48000 -ac 2 video_finale.dv
或者:
ffmpeg -i video_origine.avi -target pal-dv video_finale.dv
- 多通道編碼
ffmpeg -i fichierentree -pass 2 -passlogfile ffmpeg2pass fichiersortie-2
4 支持的編碼格式
源自FFmpeg項目組的兩個視頻編碼:
- Snow
- FFV1
支持的格式
- ASF
- AVI
- BFI
- IFF
- RL2
- FLV
- MXF, Material eXchange Format, SMPTE 377M
- MKV,Matroska
- Maxis XA
- MSN Webcam stream
- MPEG transport stream
- TXD
- OMA
- GXF, General eXchange Format, SMPTE 360M
- mov,mp4,m4a,3gp,
5 支持的協(xié)議
- HTTP
- RTP
- RTSP
- RealMedia RTSP/RDT
- TCP
- UDP
- Gopher
- RTMP
- RTMPT, RTMPE, RTMPTE, RTMPS (via librtmp)
- SDP
- MMS over TCP
6 相關(guān)版權(quán)
FFmpeg被許多開源項目采用鸦做,比如ffmpeg2theora励烦、VLC、MPlayer泼诱、 HandBrake坛掠、Blender、Google Chrome等治筒。還有DirectShow/VFW的ffdshow(external project)和QuickTime的Perian (external project)也采用了FFmpeg屉栓。
由于FFmpeg是在LGPL/GPL協(xié)議下發(fā)布的(如果使用了其中一些使用GPL協(xié)議發(fā)布的模塊則必須使用GPL協(xié)議),任何人都可以自由使用耸袜,但必須嚴格遵守LGPL/GPL協(xié)議友多。
有很多播放軟件都使用了FFmpeg的代碼,但它們并沒有遵守LGPL/GPL協(xié)議堤框,沒有公開任何源代碼域滥。我們應(yīng)該對這種侵權(quán)行為表示恥辱。
- 2009年加入FFmpeg的播放軟件:暴風影音蜈抓、QQ影音启绰、KMP、GOM Player沟使、PotPlayer(2010)都在其列委可。
- 2009年2月,韓國名軟KMPlayer被FFmpeg開源項目發(fā)現(xiàn)使用了它們的代碼和二進制文件格带,但是沒有按照規(guī)定/慣例開放相應(yīng)說明/源碼撤缴。因此被人舉報,進入了FFmpeg官網(wǎng)上的恥辱黑名單叽唱。
- 2009年5月,網(wǎng)友cehoyos下載了暴風影音軟件微宝,解壓之后發(fā)現(xiàn)其安裝程序內(nèi)包含了大量的開源和私有解碼器:avcodec棺亭,avformat,avutil蟋软,x264镶摘,xvid,bass岳守,wmvdmod等凄敢,之后暴風影音被正式加入到FFmpeg恥辱名單。
- 2009年7月22日湿痢,陳俊豪(格式工廠作者)因用到了ffmpeg和RMVB的編碼庫涝缝,用到了FFmpeg的譯碼/編碼算法扑庞,違反FFmpeg的LGPL協(xié)議,登上了2009年7月22日FFmpeg的“恥辱柱”上拒逮。
- 2009年11月罐氨,網(wǎng)友roo_zhou向FFmpeg舉報,指出QQ影音的credit只給出了修改的FFmpeg源碼下載滩援,聲稱是LGPL許可證栅隐。但實際是修改過的ffdshow,采用的是GPL許可證玩徊,之后QQ影音被正式加入到FFmpeg恥辱名單之列租悄。
7 版本發(fā)布歷史
當前最新版本為3.4.
- 2017-10-15 FFmpeg3.4發(fā)布
- 2017-05-15, FFmpeg3.3發(fā)布
- 2016-11-26, FFmpeg3.2發(fā)布
- 2016-07-01, FFmpeg3.1發(fā)布
- 2016-02-15, FFmpeg3.0發(fā)布
- 2015-10-14, FFmpeg2.8發(fā)布
- 2015-06-19, FFmpeg2.7發(fā)布
- 2015-03-16, FFmpeg2.6發(fā)布
- 2014-12-5, FFmpeg2.5發(fā)布
- 2014-09-15, FFmpeg2.4發(fā)布
- 2013-07-10, FFmpeg2.2發(fā)布
- 2012年01月27日,F(xiàn)Fmpeg 0.9.1 發(fā)布恩袱,修復(fù)了很多 bug 和安全方面的補丁恰矩,包括: CVE-2011-3893 and CVE-2011-3895,同時顯著提升對 H.264 的檢索支持憎蛤。
- 2012年01月29日外傅,F(xiàn)Fmpeg 0.10 發(fā)布,這是一個主要的發(fā)行版本俩檬,包含大量的新特性和bug修復(fù)萎胰。
- 2012年04月07日,F(xiàn)Fmpeg 0.10.1 發(fā)布棚辽,F(xiàn)Fmpeg 0.10.1 修復(fù)了很多安全漏洞技竟,超過 100 個 bug 修復(fù),新增 swapuv 過濾器屈藐。
- 2012年05月07榔组,F(xiàn)Fmpeg 0.10.3 發(fā)布,該版本修復(fù)了 4xm 分路器联逻、cook 解碼器搓扯、mm 分路器、mpeg 視頻解碼器包归、vqavideo 解碼器锨推、xmv 分路器的安全問題,以及包含一些重要的 bug 修復(fù)公壤。
- 2012年06月09日换可,F(xiàn)Fmpeg 0.11.1 發(fā)布,該版本修復(fù)了 70 個 bug厦幅,其中有一些安全方面的問題沾鳄。
參考:
- 百科詞條:https://baike.baidu.com/item/ffmpeg/2665727
- 官網(wǎng):http://ffmpeg.org
[網(wǎng)達軟件鄧軍民,資料整理]