寫在前面
如果您對音視頻技術感興趣笼痛,可以訂閱我的專題:音視頻專輯
也可以關注我的簡書賬戶: 張芳濤祈秕,我后期會發(fā)布更多的音視頻以及圖像處理方面的文章唯蝶。
正文
雖然FFmpeg工具的主要用途與音頻和視頻有關访雪,但ffmpeg可以對各種圖像格式進行解碼和編碼详瑞,并且許多圖像相關任務可以快速完成。 在網絡服務器上使用ffmpeg可創(chuàng)建Web圖像編輯器臣缀,支持FFmpeg的網絡主機相信信息位于Web視頻一章坝橡。
支持的圖像格式
表格中列出了FFmpeg支持的圖像格式及其特征后綴。 除LJPEG(無損JPEG)以外的所有這些文件類型都可以解碼精置,除EXR计寇,PIC和PTX之外都可以編碼。
FFmpeg支持的圖像格式
擴展名 | 編碼 | 解碼 | 描述 |
---|---|---|---|
.Y.U.V | X | X | 每個組件的一行文件 |
BMP | X | X | 微軟BMP圖像 |
DPX | X | X | 數碼照片交換 |
EXR | X | OpenEXR | |
GIF | X | X | 動畫gif是未壓縮的 |
JPG | X | X | 不支持漸進式JPEG |
JP2 | X | X | JPEG 2000 |
JLS | X | X | JPEG-LS |
LJPG | X | 無損的JPEG | |
PAM | X | X | PAM是帶有alpha支持的PNM擴展 |
PBM | X | X | 便攜式位圖圖像 |
PCX | X | X | PC畫筆 |
PGM | X | X | 便攜式GrayMap形象 |
PGMYUV | X | X | PGM與U和V的分量在YUV 4:2 0 |
PIC | X | Pictor/PC Paint | |
PNG | X | X | 便攜式網絡圖形 |
PPM | X | X | 便攜式PixelMap形象 |
PTX | X | V.Flash PTX格式 | |
SGI | X | X | SGI RGB圖像格式 |
RAS | X | X | Sun Rasterfile圖像格式 |
TIFF | X | X | YUV, JPEG和一些擴展還沒有被支持 |
TGA | X | X | Truevision Targa 圖像格式 |
XBM | X | X | X位圖圖像格式 |
XFace | X | X | XFace圖像格式 |
XWD | X | X | X窗口轉儲圖像格式 |
創(chuàng)建圖像
從視頻截圖
為了將一個視頻幀從指定的時刻保存到圖像中,使用-ss(從start開始)選項來指定從開始的延遲番宁。在時間t中截圖的語法
ffmpeg -i input -ss t image.type
我的測試命令:
ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -ss 20 /Users/zhangfangtao/Desktop/image.jpg
結果生成了第二十秒的一張圖片:
-ss選項也可以在輸入文件之前使用元莫,但結果不太準確。例如蝶押,從文件視頻中截取1小時23分45秒的截圖踱蠢。avi,我們可以使用命令:
ffmpeg -i videoclip.avi -ss 01:23:45 image.jpg
從視頻動畫gif
視頻文件是從可以保存到GIF動畫幀的幀中創(chuàng)建的棋电,這是一種經常在web上以條幅和動畫形式使用的圖像類型茎截。因為幀是沒有壓縮的,所以只有在較短的視頻中才有用赶盔,否則GIF動畫文件的文件大小就會非常大企锌。例如,要將一個短的SWF文件轉換為GIF動畫招刨,以便為沒有Flash插件的用戶創(chuàng)建一個替代文件霎俩,我們可以使用該命令(必須將像素格式設置為rgb24):
ffmpeg -i promotion.swf -pix_fmt rgb24 promotion.gif
我的測試命令:
ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -pix_fmt rgb24 /Users/zhangfangtao/Desktop/test.gif
- 結果就是生成了一個gif圖
來自FFmpeg視頻源的圖像
另一個創(chuàng)建圖像的選項是使用內置的視頻源,在表中描述:
名稱 | 描述 | 圖片 |
---|---|---|
color | 提供以其名稱或十六進制格式指定的任何顏色沉眶,例如顏色=c=#87cefa | |
mptestsrc | 不同的測試模式打却,詳細的描述都在章節(jié)的調試和測試中 | |
rgbtestsrc | 紅綠藍顏色模式 | |
smptebars | 彩色條紋圖案來自于電影和電視工程師協會,工程指南(1-1990) | |
testsrc | 帶有滾動漸變和時間戳的視頻測試模式 |
mptestsrc視頻源的默認分辨率為512x512像素谎倔,其他列出的源分辨率為320x240像素柳击。最通用的是能夠生成任何顏色和任何大小的圖像的彩色圖像源,例如為一個標題大小的728x90像素創(chuàng)建一個teal背景片习,我們可以使用這個命令捌肴。
ffmpeg -f lavfi -i color=c=#008080:s=728x90 leaderboard.jpg
我的測試命令:
ffmpeg -f lavfi -i color=c=#008080:s=728x90 /Users/zhangfangtao/Desktop/timer2.jpg
*生成的圖片:
描述 | 提供一種顏色為320x240的矩形,并帶有指定的顏色 |
---|---|
語法 | color[=c=clr[:d=time[:r=fps[:sar=value[:s=resolution]]]]] 所有參數都是可選的 斜體中的項目將被替換為實際值 |
參數描述 | |
color, c | 源的顏色藕咏、顏色的名稱(不區(qū)分大小寫的匹配)或0xRRGGBB[AA]序列状知,可能后跟一個alpha說明符,默認值為黑色 |
duration, d | 源視頻的持續(xù)時間孽查,被接受的句法是:[-]HH[:]]]或[-]S +[m…]饥悴,如果未指定,或表示持續(xù)時間為負盲再,則視頻將永遠生成 |
rate, r | 源視頻的幀速率西设,每秒生成的幀數,它可以是format frame_rate_factor / frame_rate_denumator答朋,一個整數或浮點數贷揽,或者一個有效的視頻幀率縮寫,默認值是25 |
sar | 樣本縱橫比的源視頻 |
size, s | 源視頻的大小梦碗、窗體寬度的字符串或相應的縮寫禽绪,默認值為320x240 |
視頻轉換為圖像
視頻文件是由可以通過一個命令保存到圖像文件的幀組成的蓖救,結果圖像的數量是視頻幀速率的產物,它的持續(xù)時間為秒丐一。例如藻糖,如果剪輯。avi文件的持續(xù)時間為1分鐘库车,幀率為25 fps巨柒,下面的命令將產生60x25=1500張圖片,每秒25張:
ffmpeg -i clip.avi frame%d.jpg
輸出目錄將包含1500個文件柠衍,名為frame1.jpg洋满、frame2.jpg等。為了保持所有文件名的長度相同珍坊,我們在%符號后指定附加數字的數目:
ffmpeg -i clip.avi frame%4d.jpg
現在該目錄包含名為frame0001.jpg牺勾、frame0002.jpg的文件…,frame1500.jpg。
我的測試命令:
ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 /Users/zhangfangtao/Desktop/Images/frame%03d.jpg
- 效果:
調整大小阵漏,裁剪和填充圖像
圖像可以以類似視頻的方式調整大小驻民,例如,彩色視頻源的輸出分辨率為320x240像素履怯,可以通過兩種方式放大到VGA分辨率:
使用彩色視頻源的s或大小參數回还。
-
使用
-s
選項來輸出
例如,接下來的兩個命令具有相同的結果叹洲,CIF(352x288)大小的橙色矩形:ffmpeg -f lavfi -i color=c=orange:s=cif orange_rect1.png ffmpeg -f lavfi -i color=c=orange -s cif orange_rect2.png
當過濾鏈內的輸入應該具有特定的分辨率時柠硕,帶參數的大小規(guī)格對過濾鏈很有用,因此大小不能被指定為選項运提。 一個常見的例子是使用顏色源作為疊加層的輸入之一蝗柔。
裁剪圖像與使用作物過濾器的視頻是一樣的,下一個示例的結果是rgbtestsrc視頻源中心的150x150像素的正方形:
ffmpeg -f lavfi -i rgbtestsrc -vf crop=150:150 crop_rgb.png
圖像可以像使用pad過濾器的視頻一樣進行padd民泵,例如下一個命令為smptebars視頻源創(chuàng)建一個橙色框架:
ffmpeg -f lavfi -i smptebars -vf pad=360:280:20:20:orange pad_smpte.jpg
翻轉癣丧,旋轉和疊加圖像
翻轉圖像的鏡像版本與由hflip和vflip過濾器提供的翻轉視頻類似,例如栈妆,接下來的兩個命令會翻轉輸入圖像胁编,第一個是水平的,第二個是垂直的:
ffmpeg -i orange.jpg -vf hflip orange_hflip.jpg
ffmpeg -i orange.jpg -vf vflip orange_vflip.jpg
我的測試命令:
ffmpeg -i /Users/zhangfangtao/Desktop/001.jpg -vf hflip /Users/zhangfangtao/Desktop/002.jpg
ffmpeg -i /Users/zhangfangtao/Desktop/001.jpg -vf vflip /Users/zhangfangtao/Desktop/003.jpg
旋轉的圖像也類似于旋轉的視頻签钩,使用的轉置濾波器有四個可能的值:
- 值0逆時針旋轉90度,垂直翻轉坏快。
- 數值1按順時針方向旋轉90度铅檩。
- 數值2逆時針旋轉90度。
- 值3順時針旋轉90度莽鸿,然后垂直翻轉昧旨。
例如,把圖像順時針旋轉90°我們可以使用命令:
ffmpeg -i image.png -vf transpose=1 image_rotated.png
我的測試命令:
ffmpeg -i /Users/zhangfangtao/Desktop/001.jpg -vf transpose=1 /Users/zhangfangtao/Desktop/004.jpg
- 生成的圖像:
類似于視頻疊加拾给,圖像可以通過疊加過濾器放置在另一個圖像上。例如兔沃,要將smptebars包含到rgbtestsrc視頻源中蒋得,我們可以使用以下命令:
ffmpeg -f lavfi -i rgbtestsrc -s 400x300 rgb.png
ffmpeg -f lavfi -i smptebars smpte.png
ffmpeg -i rgb.png -i smpte.png -filter_complex overlay=(W-w)/2:(H-h)/2 ^ rgb_smpte.png
我的測試命令:
ffmpeg -f lavfi -i rgbtestsrc -s 400x300 /Users/zhangfangtao/Desktop/005.png
ffmpeg -f lavfi -i smptebars /Users/zhangfangtao/Desktop/006.png
ffmpeg -i /Users/zhangfangtao/Desktop/005.png -i /Users/zhangfangtao/Desktop/006.png -filter_complex overlay=\(W-w\)/2:\(H-h\)/2 /Users/zhangfangtao/Desktop/007.png
-
生成的效果圖(從左到右依次是005,006乒疏,007):
圖像類型之間的轉換
幾乎所有支持的圖像類型都可以轉換為另一個额衙,異常是EXR、LJPEG怕吴、PIC和PTX文件類型窍侧,只能進行解碼。轉換的語法是:
ffmpeg -i image.type1 image.type2
例如转绷,要將PNG圖像轉換為JPG圖像格式伟件,我們可以使用以下命令:
ffmpeg -i illustration.png illustration.jpg
我的測試命令:
ffmpeg -i /Users/zhangfangtao/Desktop/001.jpg /Users/zhangfangtao/Desktop/001.png
創(chuàng)建視頻圖像
視頻來自一個圖像
將靜態(tài)圖像轉換為視頻很容易,可以用來創(chuàng)建幻燈片议经,從圖像(添加文本)的短視頻連接到一起斧账,連接視頻在第23章中有描述。例如煞肾,在photo.jpg文件中創(chuàng)建一個10秒的視頻咧织,我們在命令中包含一個值true或1的-loop boolean選項:
ffmpeg -loop 1 -i photo.jpg -t 10 photo.mp4
我的測試命令:
ffmpeg -i /Users/zhangfangtao/Desktop/001.jpg /Users/zhangfangtao/Desktop/001.png
- 顯示的效果:
視頻來自多個圖像
要從多個圖像創(chuàng)建視頻,它們的文件名必須以數字結束扯旷,這些數字與圖像編碼到視頻文件的順序一致拯爽。在這種情況下,媒體格式是在輸入之前指定的钧忽,它是一個image2格式毯炮。例如,來自img1.jpg耸黑、img2.jpg的100幅圖片桃煎。,img100.jpg可以使用以下命令創(chuàng)建一個4秒視頻大刊,幀率為25 fps为迈。
ffmpeg -f image2 -i img%d.jpg -r 25 video.mp4
如果圖像編號以0開頭,例如img001.jpg缺菌、img002.jpg等葫辐,以提供相同的文件名長度,則命令為:
ffmpeg -f image2 -i img%3d.jpg -r 25 video.mp4
%符號后的數字必須與圖像文件名中的位數相同伴郁。
我的測試命令:
ffmpeg -f image2 -i /Users/zhangfangtao/Desktop/Images/frame%3d.jpg /Users/zhangfangtao/Desktop/001.mp4
- 結果就是生成了一個沒有聲音的視頻耿战,視頻里面的圖片就是我剛才從test.mp4里面解析出來的圖片