資料收集 FFMPEG – >TEMP

資料收集 FFMPEG – >TEMP

本Markdown編輯器使用[StackEdit][6]修改而來,用它寫博客,將會帶來全新的體驗哦:

  • TEMP

圖片處理
圖片支持
FFmpeg支持絕大多數圖片處理, 除LJPEG(無損JPEG)之外,其他都能被解碼,除了EXR,PIC,PTX之外,所有的都能被編碼。
截取一張圖片使用 –ss(seek from start)參數.
ffmpeg -ss 01:23:45 -i jidu.mp4 image.jpg
從視頻中生成GIF圖片
ffmpeg -i jidu.mp4 -t 10 -pix_fmt rgb24 jidu.gif
轉換視頻爲圖片(每幀一張圖)
ffmpeg -i clip.avi frame%4d.jpg
圖片轉換爲視頻
ffmpeg -f image2 -i img%4d.jpg -r 25 video.mp4


ffmpeg -i “xxx.mp4” -r 1 -q:v 2 -f image2 image-3%d.jpeg
-i選項用來獲取輸入文件,在這裏是視頻文件名xxx.mp4,
-r選項設置每秒提取圖片的幀數。我想要每秒提取一幀。

之後有一個重要的選項是-q:v,應該留意這個選項並且我很喜歡用它,它用來設置提取到的圖片質量。我總是設置值爲2來從視頻中獲取高質量圖片
-f 爲轉換圖片的格式

For creating a video from many images:

ffmpeg -f image2 -framerate 12 -i foo-%03d.jpeg -s WxH foo.avi
The syntax foo-%03d.jpeg specifies to use a decimal number composed of three digits padded with zeroes to express the sequence number. It is the same syntax supported by the C printf function, but only formats accepting a normal integer are suitable.



YUV格式詳細解釋與FFMPEG的關係
YUV主要的採樣格式
主要的採樣格式有YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和 YCbCr 4:4:4。其中YCbCr 4:1:1 比較常用,其含義爲:每個點保存一個 8bit 的亮度值(也就是Y值), 每 2x2 個點保存一個 Cr 和Cb 值, 圖像在肉眼中的感覺不會起太大的變化。所以, 原來用 RGB(R,G,B 都是 8bit unsigned) 模型, 4 個點需要 8x3=24 bites(如下圖第一個圖)。 而現在僅需要 8+(8/4)+(8/4)=12bites, 平均每個點佔12bites(如下圖第二個圖)。這樣就把圖像的數據壓縮了一半。
上邊僅給出了理論上的示例,在實際數據存儲中是有可能是不同的,下面給出幾種具體的存儲形式:
(1) YUV 4:4:4
YUV三個信道的抽樣率相同,因此在生成的圖像裏,每個象素的三個分量信息完整(每個分量通常8比特),經過8比特量化之後,未經壓縮的每個像素佔用3個字節。
下面的四個像素爲: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
存放的碼流爲: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
(2) YUV 4:2:2
每個色差信道的抽樣率是亮度信道的一半,所以水平方向的色度抽樣率只是4:4:4的一半。對非壓縮的8比特量化的圖像來說,每個由兩個水平方向相鄰的像素組成的宏像素需要佔用4字節內存。
下面的四個像素爲: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
存放的碼流爲: Y0 U0 Y1 V1 Y2 U2 Y3 V3
映射出像素點爲:[Y0 U0 V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2 V3]
(3) YUV 4:1:1
4:1:1的色度抽樣,是在水平方向上對色度進行4:1抽樣。對於低端用戶和消費類產品這仍然是可以接受的。對非壓縮的8比特量化的視頻來說,每個由4個水平方向相鄰的像素組成的宏像素需要佔用6字節內存
下面的四個像素爲: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
存放的碼流爲: Y0 U0 Y1 Y2 V2 Y3
映射出像素點爲:[Y0 U0 V2] [Y1 U0 V2] [Y2 U0 V2] [Y3 U0 V2]
(4)YUV4:2:0
4:2:0並不意味着只有Y,Cb而沒有Cr分量。它指得是對每行掃描線來說,只有一種色度分量以2:1的抽樣率存儲。進行隔行掃描,相鄰的掃描行存儲不同的色度分量,也就是說,如果一行是4:2:0的話,下一行就是4:0:2,再下一行是4:2:0…以此類推。對每個色度分量來說,水平方向和豎直方向的抽樣率都是2:1,所以可以說色度的抽樣率是4:1。對非壓縮的8比特量化的視頻來說,每個由2x2個2行2列相鄰的像素組成的宏像素需要佔用6字節內存。
下面八個像素爲:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
[Y5 U5 V5] [Y6 U6 V6] [Y7U7 V7] [Y8 U8 V8]
存放的碼流爲:Y0 U0 Y1 Y2 U2 Y3
Y5 V5 Y6 Y7 V7 Y8
映射出的像素點爲:[Y0 U0 V5] [Y1 U0 V5] [Y2 U2 V7] [Y3 U2 V7]

[Y5 U0 V5] [Y6 U0 V5] [Y7U2 V7] [Y8 U2 V7]
對應AVPicture裏面有data[4]和linesize[4]其中data是一個指向指針的指針(二級、二維指針),也就是指向視頻數據緩衝區的首地址,而data[0]~data[3]是一級指針,可以用如下的圖來表示:
data –》xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
^ ^ ^
| | |
data[0] data[1] data[2]
比如說,當pix_fmt=PIX_FMT_YUV420P時,data中的數據是按照YUV的格式存儲的,也就是:
data –》YYYYYYYYYYYYYYUUUUUUUUUUUUUVVVVVVVVVVVV
^ ^ ^
| | |
data[0] data[1] data[2]
linesize是指對應於每一行的大小,爲什麼需要這個變量,是因爲在YUV格式和RGB格式時,每行的大小不一定等於圖像的寬度,對於RGB格式輸出時,只有一個通道(bgrbgrbgr……)可用,即linesize[0],和data[0],so RGB24 : data[0] = packet rgb//bgrbgrbgr……
linesize[0] = width*3
其他的如data[1][2][3]與linesize[1][2][3]無任何意義。
而對於YUV格式輸出時,有三個通道可用,即data[0][1][2],與linesize[0][1][2],而yuv格式對於運動估計時,需要填充padding(right, bottom),故:
linesize=width+padding size(16+16)。
///////////////////////////////////////////////////////////////////////////////////////
case PIX_FMT_YUV420P: case PIX_FMT_YUVJ420P: case PIX_FMT_RGB555: if (PIC_DIRECTION_0 == m_dwFilpPicDirection) { m_pYuvFrame-》data [0] += m_pYuvFrame-》linesize[0] * m_pVCodecContext-》height; //因爲是隔行掃描U與V只有高度的一半 m_pYuvFrame-》data [1] += m_pYuvFrame-》linesize[1] * m_pVCodecContext-》height/2; m_pYuvFrame-》data [2] += m_pYuvFrame-》linesize[2] * m_pVCodecContext-》height/2; m_pYuvFrame-》linesize[0] = -m_pYuvFrame-》linesize[0]; m_pYuvFrame-》linesize[1] = -m_pYuvFrame-》linesize[1]; m_pYuvFrame-》linesize[2] = -m_pYuvFrame-》linesize[2]; } break; case PIX_FMT_YUVJ422P: case PIX_FMT_YUV422P: case PIX_FMT_YUYVJ422: case PIX_FMT_YUV411P: case PIX_FMT_YUYV422: if (PIC_DIRECTION_0 == m_dwFilpPicDirection) { m_pYuvFrame-》data [0] += m_pYuvFrame-》linesize[0] * m_pVCodecContext-》height; m_pYuvFrame-》data [1] += m_pYuvFrame-》linesize[1] * m_pVCodecContext-》height; m_pYuvFrame-》data [2] += m_pYuvFrame-》linesize[2] * m_pVCodecContext-》height; m_pYuvFrame-》linesize[0] = -m_pYuvFrame-》linesize[0]; m_pYuvFrame-》linesize[1] = -m_pYuvFrame-》linesize[1]; m_pYuvFrame-》linesize[2] = -m_pYuvFrame-》linesize[2]; } break; }在FFMPEG中轉換RGB時順便顛倒圖像的方向算法




FFmpeg
FFmpeg 基本用法
本課要解決的問題
1.FFmpeg的轉碼流程是什麼?
2.常見的視頻格式包含哪些內容嗎?
3.如何把這些內容從視頻文件中抽取出來?
4.如何從一種格式轉換爲另一種格式?
5.如何放大和縮小視頻?
6.如何旋轉,翻轉,填充,裁剪,模糊,銳化視頻?
7.如何給視頻加logo,刪除logo?
8.如何給視頻加文本,動態文本?
9.如何處理圖片?
10.如何錄像,添加動態logo,截圖,馬賽克視頻?
第一部分
基礎
術語
容器(Container)
容器就是一種文件格式,比如flv,mkv等。包含下面5種流以及文件頭信息。
流(Stream)
是一種視頻數據信息的傳輸方式,5種流:音頻,視頻,字幕,附件,數據。
幀(Frame)
幀代表一幅靜止的圖像,分爲I幀,P幀,B幀。
編解碼器(Codec)
是對視頻進行壓縮或者解壓縮,CODEC =COde (編碼) +DECode(解碼)
複用/解複用(mux/demux)
把不同的流按照某種容器的規則放入容器,這種行爲叫做複用(mux)
把不同的流從某種容器中解析出來,這種行爲叫做解複用(demux)

簡介

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顯示;

FFmpeg處理流程
過濾器(Filter)
在多媒體處理中,filter的意思是被編碼到輸出文件之前用來修改輸入文件內容的一個軟件工具。如:視頻翻轉,旋轉,縮放等。
語法:[input_link_label1][input_link_label2]… filter_name=parameters [output_link_label1][output_link_label2]…
過濾器圖link label :是標記過濾器的輸入或輸出的名稱
1.視頻過濾器 -vf
如testsrc視頻按順時針方向旋轉90度
ffplay -f lavfi -i testsrc -vf transpose=1
如testsrc視頻水平翻轉(左右翻轉)
ffplay -f lavfi -i testsrc -vf hflip
2.音頻過濾器 -af
實現慢速播放,聲音速度是原始速度的50%
ffplay p629100.mp3 -af atempo=0.5

如何實現順時針旋轉90度並水平翻轉?
過濾器鏈(Filterchain)
基本語法
Filterchain = 逗號分隔的一組filter
語法:“filter1,filter2,filter3,…filterN-2,filterN-1,filterN”
順時針旋轉90度並水平翻轉
ffplay -f lavfi -i testsrc -vf transpose=1,hflip

如何實現水平翻轉視頻和源視頻進行比較? 看過濾器鏈是如何實現的。

過濾器鏈(Filterchain)
第一步: 源視頻寬度擴大兩倍。
ffmpeg -i jidu.mp4 -t 10 -vf pad=2*iw output.mp4
第二步:源視頻水平翻轉
ffmpeg -i jidu.mp4 -t 10 -vf hflip output2.mp4
第三步:水平翻轉視頻覆蓋output.mp4
ffmpeg -i output.mp4 -i output2.mp4 -filter_complex overlay=w compare.mp4
是不是很複雜?
用帶有鏈接標記的過濾器圖(Filtergraph)只需一條命令。
過濾器圖(Filtergraph)
基本語法
Filtergraph = 分號分隔的一組filterchain
“filterchain1;filterchain2;…filterchainN-1;filterchainN”

Filtergraph的分類
1、簡單(simple) 一對一
2、複雜(complex)多對一, 多對多
過濾器圖(Filtergraph)
簡單過濾器圖處理流程:

複雜過濾器圖處理流程:

從圖中可以發現複雜過濾器圖比簡單過濾器圖少2個步驟,效率比簡單高,ffmpeg建議儘量使用複雜過濾器圖。
回答上面提的問題,實現水平翻轉視頻和源視頻進行比較

過濾器圖(Filtergraph)
用ffplay直接觀看結果:
ffplay -f lavfi -i testsrc -vf split[a][b];[a]pad=2*iw[1];[b]hflip[2];[1][2]overlay=w

F1: split過濾器創建兩個輸入文件的拷貝並標記爲[a],[b]
F2: [a]作爲pad過濾器的輸入,pad過濾器產生2倍寬度並輸出到[1].
F3: [b]作爲hflip過濾器的輸入,vflip過濾器水平翻轉視頻並輸出到[2].
F4: 用overlay過濾器把 [2]覆蓋到[1]的旁邊.

選擇媒體流
一些多媒體容器比如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分別排除所有的音頻,視頻,字幕流。

注意:文件序號和流序號從0開始計數。
選擇媒體流
第二部分
查看幫助
幫助
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

第三部分
碼率、幀率和文件大小
概述
碼率和幀率是視頻文件的最重要的基本特徵,對於他們的特有設置會決定視頻質量。如果我們知道碼率和時長那麼可以很容易計算出輸出文件的大小。

幀率:幀率也叫幀頻率,幀率是視頻文件中每一秒的幀數,肉眼想看到連續移動圖像至少需要15幀。
碼率:比特率(也叫碼率,數據率)是一個確定整體視頻/音頻質量的參數,秒爲單位處理的字節數,碼率和視頻質量成正比,在視頻文件中中比特率用bps來表達。
幀率
1、用 -r 參數設置幀率
ffmpeg –i input –r fps output
2、用fps filter設置幀率
ffmpeg -i clip.mpg -vf fps=fps=25 clip.webm
幀率的預定義值:

例如設置碼率爲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

碼率、文件大小
設置碼率 –b 參數
-b
ffmpeg -i film.avi -b 1.5M film.mp4

音頻:-b:a 視頻: - b:v
設置視頻碼率爲1500kbps
ffmpeg -i input.avi -b:v 1500k output.mp4

控制輸出文件大小
-fs (file size首字母縮寫)
ffmpeg -i input.avi -fs 1024K output.mp4
計算輸出文件大小
(視頻碼率+音頻碼率) * 時長 /8 = 文件大小K

第四部分
調整視頻分辨率
調整視頻分辨率
1、用-s參數設置視頻分辨率,參數值wxh,w寬度單位是像素,h高度單位是像素
ffmpeg -i input_file -s 320x240 output_file

2、預定義的視頻尺寸
下面兩條命令有相同效果
ffmpeg -i input.avi -s 640x480 output.avi
ffmpeg -i input.avi -s vga output.avi

下表列出了所有的預定義尺寸

Scale filter調整分辨率
Scale filter的優點是可以使用一些額外的參數
語法:
Scale=width:height[:interl={1|-1}]
下表列出了常用的額外參數
舉例
下面兩條命令有相同效果
ffmpeg -i input.mpg -s 320x240 output.mp4
ffmpeg -i input.mpg -vf scale=320:240 output.mp4

對輸入視頻成比例縮放
改變爲源視頻一半大小
ffmpeg -i input.mpg -vf scale=iw/2:ih/2 output.mp4
改變爲原視頻的90%大小:
ffmpeg -i input.mpg -vf scale=iw*0.9:ih*0.9 output.mp4

舉例
在未知視頻的分辨率時,保證調整的分辨率與源視頻有相同的橫縱比。
寬度固定400,高度成比例:
ffmpeg -i input.avi -vf scale=400:400/a
ffmpeg -i input.avi -vf scale=400:-1

相反地,高度固定300,寬度成比例:
ffmpeg -i input.avi -vf scale=-1:300
ffmpeg -i input.avi -vf scale=300*a:300

第五部分
裁剪/填充視頻
裁剪視頻crop filter
從輸入文件中選取你想要的矩形區域到輸出文件中,常見用來去視頻黑邊。
語法:crop:ow[:oh[:x[:y:[:keep_aspect]]]]

舉例
裁剪輸入視頻的左三分之一,中間三分之一,右三分之一:
ffmpeg -i input -vf crop=iw/3:ih :0:0 output
ffmpeg -i input -vf crop=iw/3:ih :iw/3:0 output
ffmpeg -i input -vf crop=iw/3:ih :iw/3*2:0 output
裁剪幀的中心
當我們想裁剪區域在幀的中間時,裁剪filter可以跳過輸入x和y值,他們的默認值是
Xdefault = ( input width - output width)/2
Ydefault = ( input height - output height)/2
ffmpeg -i input_file -v crop=w:h output_file
裁剪中間一半區域:
ffmpeg -i input.avi -vf crop=iw/2:ih/2 output.avi

舉例
比較裁剪後的視頻和源視頻比較
ffplay -i jidu.mp4 -vf split[a][b];[a]drawbox=x=(iw-300)/2:(ih-300)/2:w=300:h=300:c=yellow[A];[A]pad=2*iw[C];[b]crop=300:300:(iw-300)/2:(ih-300)/2[B];[C][B]overlay=w*2.4:40

自動檢測裁剪區域
cropdetect filter 自動檢測黑邊區域
ffplay jidu.mp4 -vf cropdetect

然後用檢測到的值來裁剪視頻
ffplay jidu.mp4 –vf crop=672:272:0:54

填充視頻(pad)
在視頻幀上增加一快額外額區域,經常用在播放的時候顯示不同的橫縱比
語法:pad=width[:height:[:x[:y:[:color]]]]

舉例
創建一個30個像素的粉色寬度來包圍一個SVGA尺寸的圖片:
ffmpeg -i photo.jpg -vf pad=860:660:30:30:pink framed_photo.jpg

同理可以製作testsrc視頻用30個像素粉色包圍視頻
ffplay -f lavfi -i testsrc -vf pad=iw+60:ih+60:30:30:pink

4:3到16:9
一些設備只能播放16:9的橫縱比,4:3的橫縱比必須在水平方向的兩邊填充成16:9,

高度被保持,寬度等於高度乘以16/9,x(輸入文件水平位移)值由表達式(output_width - input_width)/2來計算。

4:3到16:9的通用命令是:
ffmpeg -i input -vf pad=ih*16/9:ih :(ow-iw)/2:0:color output

舉例
ffplay -f lavfi -i testsrc -vf pad=ih*16/9:ih:(ow-iw)/2:0:pink

16:9到4:3
爲了用4:3的橫縱比來顯示16:9的橫縱比,填充輸入文件的垂直兩邊,寬度保持不變,高度是寬度的3/4,y值(輸入文件的垂直偏移量)是由一個表達式(output_height-input_height)/2計算出來的。

16:9到4:3的通用命令:
ffmpeg -i input -vf pad=iw :iw*3/4:0:(oh-ih)/2:color output

舉例
ffplay -f lavfi -i testsrc=size=320x180 -vf pad=iw:iw*3/4:0:(oh-ih)/2:pink

第六部分
翻轉和旋轉
翻轉
水平翻轉語法: -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°然後水平翻轉
第七部分
模糊,銳化
模糊
語法:boxblur=luma_r:luma_p[:chroma_r:chram_p[:alpha_r:alpha_p]]
ffplay -f lavfi -i testsrc -vf boxblur=1:10:4:10
注意:luma_r和alpha_r半徑取值範圍是0~min(w,h)/2, chroma_r半徑的取值範圍是0~min(cw/ch)/2
銳化
語法:-vf unsharp=l_msize_x:l_msize_y:l_amount:c_msize_x:c_msize_y:c_amount
所有的參數是可選的,默認值是5:5:1.0:5:5:0.0
l_msize_x:水平亮度矩陣,取值範圍3-13,默認值爲5
l_msize_y:垂直亮度矩陣,取值範圍3-13,默認值爲5
l_amount:亮度強度,取值範圍-2.0-5.0,負數爲模糊效果,默認值1.0
c_msize_x:水平色彩矩陣,取值範圍3-13,默認值5
c_msize_y:垂直色彩矩陣,取值範圍3-13,默認值5
c_amount:色彩強度,取值範圍-2.0-5.0,負數爲模糊效果,默認值0.0
舉例
使用默認值,亮度矩陣爲5x5和亮度值爲1.0
ffmpeg -i input -vf unsharp output.mp4
高斯模糊效果(比較強的模糊):
ffplay -f lavfi -i testsrc -vf unsharp=13:13:-2

第八部分
覆蓋(畫中畫)
覆蓋
語法:overlay[=x[:y]
所有的參數都是可選,默認值都是0

舉例
Logo在左上角
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay pair1.mp4

舉例
右上角:
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w pair2.mp4
左下角:
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=0:H-h pair2.mp4
右下角:
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w:H-h pair2.mp4

刪除logo
語法:-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:60:100:0
第九部分
添加文本
添加文本
語法:
drawtext=fontfile=font_f:text=text1[:p3=v3[:p4=v4[…]]]
常用的參數值
x:離左上角的橫座標
y: 離左上角的縱座標
fontcolor:字體顏色
fontsize:字體大小
text:文本內容
textfile:文本文件
t:時間戳,單位秒
n:幀數開始位置爲0
draw/enable:控制文件顯示,若值爲0不顯示,1顯示,可以使用函數
簡單用法
1、在左上角添加Welcome文字
ffplay -f lavfi -i color=c=white -vf drawtext=fontfile=arial.ttf:text=Welcom
2、在中央添加Good day
ffplay -f lavfi -i color=c=white -vf drawtext=”fontfile=arial.ttf:text=’Goodday’:x=(w-tw)/2:y=(h-th)/2”
3、設置字體顏色和大小
ffplay -f lavfi -i color=c=white -vf drawtext=”fontfile=arial.ttf:text=’Happy Holidays’:x=(w-tw)/2:y=(h-th)/2:fontcolor=green:fontsize=30”

動態文本
用 t (時間秒)變量實現動態文本
1、頂部水平滾動
ffplay -i jidu.mp4 -vf drawtext=”fontfile=arial.ttf:text=’Dynamic RTL text’:x=w-t*50:fontcolor=darkorange:fontsize=30”
2、底部水平滾動
ffplay -i jidu.mp4 -vf drawtext=”fontfile=arial.ttf:textfile=textfile.txt:x=w-t*50:y=h-th:fontcolor=darkorange:fontsize=30”
3、垂直從下往上滾動
ffplay jidu.mp4 -vf drawtext=”textfile=textfile:fontfile=arial.ttf:x=(w-tw)/2:y=h-t*100:fontcolor=white:fontsize=30“
想實現右上角顯示當前時間?

動態文本
在右上角顯示當前時間 localtime
ffplay jidu.mp4 -vf drawtext=”fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text=’%{localtime:%H\:%M\:%S}’“

每隔3秒顯示一次當前時間
ffplay jidu.mp4 -vf drawtext=”fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text=’%{localtime:%H\:%M\:%S}’:enable=lt(mod(t,3),1)”

第十部分
圖片處理
圖片支持
FFmpeg支持絕大多數圖片處理, 除LJPEG(無損JPEG)之外,其他都能被解碼,除了EXR,PIC,PTX之外,所有的都能被編碼。
截取一張圖片使用 –ss(seek from start)參數.
ffmpeg -ss 01:23:45 -i jidu.mp4 image.jpg
從視頻中生成GIF圖片
ffmpeg -i jidu.mp4 -t 10 -pix_fmt rgb24 jidu.gif
轉換視頻爲圖片(每幀一張圖)
ffmpeg -i clip.avi frame%4d.jpg
圖片轉換爲視頻
ffmpeg -f image2 -i img%4d.jpg -r 25 video.mp4

裁剪、填充
和視頻一樣,圖片也可以被裁剪和填充
裁剪
ffmpeg -f lavfi -i rgbtestsrc -vf crop=150:150 crop_rg.png
填充
ffmpeg -f lavfi -i smptebars -vf pad=360:280:20:20:orange pad_smpte.jpg

翻轉,旋轉,覆蓋
和視頻一樣圖片同樣能翻轉,旋轉和覆蓋
翻轉
ffmpeg -i orange.jpg -vf hflip orange_hfilp.jpg
ffmpeg -i orange.jpg -vf vflip orange_vfilp.jpg
旋轉
ffmpeg -i image.png -vf transpose=1 image_rotated.png
覆蓋
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 -list_devices 1 -f dshow -i dummy
調用攝像頭
ffplay -f dshow -i video=”Integrated Camera”
保存爲文件
ffmpeg -y -f dshow -s 320x240 -r 25 -i video=”Integrated Camera” -b:v 800K -vcodec mpeg4 new.mp4

添加字幕subtitles
語法 –vf subtitles=file

ffmpeg -i jidu.mp4 -vf subtitles=rgb.srt output.mp4
視頻顫抖、色彩平衡
視頻顫抖
ffplay –i jidu.mp4 -vf crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2)*sin(n/10):(in_h-out_h)/2 +((in_h-out_h)/2)*sin(n/7)

色彩平衡
ffplay -i jidu.mp4 -vf curves=vintage
色彩變幻
ffplay -i jidu.mp4 -vf hue=”H=2*PI*t: s=sin(2*PI*t)+1“
彩色轉換黑白
ffplay -i jidu.mp4 -vf lutyuv=”u=128:v=128”
設置音頻視頻播放速度
3倍視頻播放視頻
ffplay -i jidu.mp4 -vf setpts=PTS/3
?速度播放視頻
ffplay -i jidu.mp4 -vf setpts=PTS/(3/4)
2倍速度播放音頻
ffplay -i speech.mp3 -af atempo=2

問題:視頻和音頻同時3/4慢速播放
截圖
每隔一秒截一張圖
ffmpeg -i input.flv -f image2 -vf fps=fps=1 out%d.png
每隔20秒截一張圖
ffmpeg -i input.flv -f image2 -vf fps=fps=1/20 out%d.png

注意:ffmpeg version N-57961-gec8e68c版本最多可以每隔20s截一張圖。
多張截圖合併到一個文件裏(2x3) ?每隔一千幀(秒數=1000/fps25)即40s截一張圖
ffmpeg? -i jidu.mp4 -frames 3 -vf “select=not(mod(n,1000)),scale=320:240,tile=2x3” out.png

馬賽克視頻
馬賽克視頻
用多個輸入文件創建一個馬賽克視頻:
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

Logo動態移動
1、2秒後logo從左到右移動:
ffplay -i jidu.mp4 -vf movie=logo.png[logo];[in][logo]overlay=x=’if(gte(t,2),((t-2)*80)-w,NAN)’:y=0

2、2秒後logo從左到右移動後停止在左上角
ffplay -i jidu.mp4 -vf movie=logo.png[logo];[in][logo]overlay=x=’if(gte(((t-2)*80)-w,W),0,((t-2)*80)-w)’:y=0
3、每隔10秒交替出現logo。
ffmpeg -y -t 60 -i jidu.mp4 -i logo.png -i logo2.png -filter_complex “overlay=x=if(lt(mod(t,20),10),10,NAN ):y=10,overlay=x=if(gt(mod(t,20),10),W-w-10,NAN ) :y=10” overlay.mp4

資料
FFmpeg官網: http://www.ffmpeg.org
FFmpeg doc : http://www.ffmpeg.org/documentation.html
FFmpeg wiki : https://trac.ffmpeg.org/wiki
FAQ
Thanks!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章