0 概述
FFmpeg是一套領(lǐng)先的音視頻多媒體處理開源框架,采用LGPL或GPL許可證。它提供了對音視頻的采集、編碼、解碼、轉(zhuǎn)碼、音視頻分離、合并、流化、過濾器等豐富的功能,包含了非常先進(jì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主要負(fù)責(zé)維護。許多FFmpeg的開發(fā)人員都來自MPlayer項目,而且當(dāng)前FFmpeg也是放在MPlayer項目組的服務(wù)器上。項目的名稱來自MPEG視頻編碼標(biāo)準(zhǔn),前面的"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攝像頭的圖像,還可以進(jìn)行屏幕錄制,同時還支持以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è)備進(jìn)行采集,
- 采集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 視頻截圖
對于選定的視頻,截取指定時間的縮略圖。
也可以進(jìn)行視頻抓圖,獲取靜態(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
上面的命令會把當(dāng)前目錄下的圖片(名字如: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的播放速率進(jìn)行轉(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)碼輸出
將文件當(dāng)做直播送至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
將當(dāng)前攝像頭及音頻通過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é)議),任何人都可以自由使用,但必須嚴(yán)格遵守LGPL/GPL協(xié)議。
有很多播放軟件都使用了FFmpeg的代碼,但它們并沒有遵守LGPL/GPL協(xié)議,沒有公開任何源代碼。我們應(yīng)該對這種侵權(quán)行為表示恥辱。
- 2009年加入FFmpeg的播放軟件:暴風(fēng)影音、QQ影音、KMP、GOM Player、PotPlayer(2010)都在其列。
- 2009年2月,韓國名軟KMPlayer被FFmpeg開源項目發(fā)現(xiàn)使用了它們的代碼和二進(jìn)制文件,但是沒有按照規(guī)定/慣例開放相應(yīng)說明/源碼。因此被人舉報,進(jìn)入了FFmpeg官網(wǎng)上的恥辱黑名單。
- 2009年5月,網(wǎng)友cehoyos下載了暴風(fēng)影音軟件,解壓之后發(fā)現(xiàn)其安裝程序內(nèi)包含了大量的開源和私有解碼器:avcodec,avformat,avutil,x264,xvid,bass,wmvdmod等,之后暴風(fēng)影音被正式加入到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ā)布?xì)v史
當(dāng)前最新版本為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)達(dá)軟件鄧軍民,資料整理]