一、FFmpeg簡介
FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,並能將其轉化為流的開源計算機程序。采用LGPL或GPL許可證。它提供了錄制、轉換以及流化音視頻的完整解決方案。它包含了非常先進的音頻/視頻編解碼庫libavcodec,為了保證高可移植性和編解碼質量,libavcodec里很多code都是從頭開發的。
二、FFmpeg下載
1.打開網址:https://ffmpeg.zeranoe.com/builds/ 或者: 點擊下載ffmpeg (備用下載:ffmpeg)
2.選擇版本 、window 64-bit、static靜態
3.點擊Download
三、FFmpeg安裝
1.下載后進行解壓
2.配置環境變量:我的電腦—》右鍵—》屬性—》高級系統設置—》環境變量—》用戶變量—》Path
3.win+R輸入cmd后 執行命令 ffmpeg
安裝成功。
四、‘ffmpeg’ 不是內部或外部命令,也不是可運行的程序 或批處理文件
后來因為ffmpeg文件中了次病毒,在IDE中無法使用,不知道具體什么原因,解決方法如下:
改為:
出處:https://blog.csdn.net/www588555/article/details/105135644
=======================================================================================
FFmpeg命令詳解
背景
使用ffmpeg進行調試開發的時候,了解有關參數的含義是有助於開發的。
命令格式
功能
FFmpeg命令是在ffmpeg.exe可執行文件環境下執行,ffmpeg.exe用於音視頻的轉碼,加水印,去水印,視頻剪切,提取音頻,提取視頻,碼率控制等等功能。
最簡單的命令
ffmpeg -i input.avi -b:v 640k output.mp4
# 該命令將當前文件夾下的input.avi文件轉換為output.mp4文件,並將output.mp4文件視頻的碼率設置為640kpbs。
fmpeg
是一個非常快速的視頻和音頻轉換器,也可以從現場音頻/視頻源獲取。它還可以在任意采樣率之間進行轉換,並通過高質量的多相濾波器實時調整視頻大小。
壓縮視頻
ffmpeg -i pingcap-intro-converted.mp4 -b:v 64k -r 20 -c:v libx264 -s 640x320 -strict -2 pingcap.mp4
獲取封面
ffmpeg -ss 00:00:10 -i test1.flv -f image2 -y test1.jpg
屏幕類型
普屏4:3 320*240 640*480
寬屏16:9 480*272 640*360 672*378 720*480 1024*600 1280*720 1920*1080
ffmpeg命令參數如下:
參數名稱 | 輸入值 | 備注 |
---|---|---|
-i | ffmpmg -i pingcap-xxx.mp4 | 輸入您要處理的視頻文件路徑 |
-b:v k−bufsizek−bufsize k | -b:v 64k -bufsize 64k | 要將輸出文件的視頻比特率設置為64 kbit / s |
-r | ffmpeg -i input.avi -r 24 output.avi | 要強制輸出文件的幀頻為24 fps |
-c:v | -c:v libx264 | ffmpeg -i input -c:v libx264 -preset slow -crf 22-c:a copy output.mkv |
通用選項
-L license
-h 幫助
-fromats 顯示可用的格式,編解碼的,協議的。。。
-f fmt 強迫采用格式fmt
-I filename 輸入文件
-y 覆蓋輸出文件
-t duration 設置紀錄時間 hh:mm:ss[.xxx]格式的記錄時間也支持
-ss position 搜索到指定的時間 [-]hh:mm:ss[.xxx]的格式也支持
-title string 設置標題
-author string 設置作者
-copyright string 設置版權
-comment string 設置評論
-target type 設置目標文件類型(vcd,svcd,dvd) 所有的格式選項(比特率,編解碼以及緩沖區大小)自動設置 ,只需要輸入如下的就可以了:
ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
-hq 激活高質量設置
-itsoffset offset 設置以秒為基准的時間偏移,該選項影響所有后面的輸入文件。該偏移被加到輸入文件的時戳,定義一個正偏移意味着相應的流被延遲了 offset秒。 [-]hh:mm:ss[.xxx]的格式也支持
視頻選項
-b bitrate 設置比特率,缺省200kb/s
-r fps 設置幀頻 缺省25
-s size 設置幀大小 格式為WXH 缺省160X128.下面的簡寫也可以直接使用:
Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
-aspect aspect 設置橫縱比 4:3 16:9 或 1.3333 1.7777
-croptop size 設置頂部切除帶大小 像素單位
-cropbottom size –cropleft size –cropright size
-padtop size 設置頂部補齊的大小 像素單位
-padbottom size –padleft size –padright size –padcolor color 設置補齊條顏色(hex,6個16進制的數,紅:綠:蘭排列,比如 000000代表黑色)
-vn 不做視頻記錄
-bt tolerance 設置視頻碼率容忍度kbit/s
-maxrate bitrate設置最大視頻碼率容忍度
-minrate bitreate 設置最小視頻碼率容忍度
-bufsize size 設置碼率控制緩沖區大小
-vcodec codec 強制使用codec編解碼方式。 如果用copy表示原始編解碼數據必須被拷貝。
-sameq 使用同樣視頻質量作為源(VBR)
-pass n 選擇處理遍數(1或者2)。兩遍編碼非常有用。第一遍生成統計信息,第二遍生成精確的請求的碼率
-passlogfile file 選擇兩遍的紀錄文件名為file
高級選項
-g gop_size 設置圖像組大小
-intra 僅適用幀內編碼
-qscale q 使用固定的視頻量化標度(VBR)
-qmin q 最小視頻量化標度(VBR)
-qmax q 最大視頻量化標度(VBR)
-qdiff q 量化標度間最大偏差 (VBR)
-qblur blur 視頻量化標度柔化(VBR)
-qcomp compression 視頻量化標度壓縮(VBR)
-rc_init_cplx complexity 一遍編碼的初始復雜度
-b_qfactor factor 在p和b幀間的qp因子
-i_qfactor factor 在p和i幀間的qp因子
-b_qoffset offset 在p和b幀間的qp偏差
-i_qoffset offset 在p和i幀間的qp偏差
-rc_eq equation 設置碼率控制方程 默認tex^qComp
-rc_override override 特定間隔下的速率控制重載
-me method 設置運動估計的方法 可用方法有 zero phods log x1 epzs(缺省) full
-dct_algo algo 設置dct的算法 可用的有 0 FF_DCT_AUTO 缺省的DCT 1 FF_DCT_FASTINT 2 FF_DCT_INT 3 FF_DCT_MMX 4 FF_DCT_MLIB 5 FF_DCT_ALTIVEC
-idct_algo algo 設置idct算法。可用的有 0 FF_IDCT_AUTO 缺省的IDCT 1 FF_IDCT_INT 2 FF_IDCT_SIMPLE 3 FF_IDCT_SIMPLEMMX 4 FF_IDCT_LIBMPEG2MMX 5 FF_IDCT_PS2 6 FF_IDCT_MLIB 7 FF_IDCT_ARM 8 FF_IDCT_ALTIVEC 9 FF_IDCT_SH4 10 FF_IDCT_SIMPLEARM
-er n 設置錯誤殘留為n 1 FF_ER_CAREFULL 缺省 2 FF_ER_COMPLIANT 3 FF_ER_AGGRESSIVE 4 FF_ER_VERY_AGGRESSIVE
-ec bit_mask 設置錯誤掩蔽為bit_mask,該值為如下值的位掩碼 1 FF_EC_GUESS_MVS (default=enabled) 2 FF_EC_DEBLOCK (default=enabled)
-bf frames 使用frames B 幀,支持mpeg1,mpeg2,mpeg4
-mbd mode 宏塊決策 0 FF_MB_DECISION_SIMPLE 使用mb_cmp 1 FF_MB_DECISION_BITS 2 FF_MB_DECISION_RD
-4mv 使用4個運動矢量 僅用於mpeg4
-part 使用數據划分 僅用於mpeg4
-bug param 繞過沒有被自動監測到編碼器的問題
-strict strictness 跟標准的嚴格性
-aic 使能高級幀內編碼 h263+
-umv 使能無限運動矢量 h263+
-deinterlace 不采用交織方法
-interlace 強迫交織法編碼 僅對mpeg2和mpeg4有效。當你的輸入是交織的並且你想要保持交織以最小圖像損失的時候采用該選項。可選的方法是不交織,但是損失更大
-psnr 計算壓縮幀的psnr
-vstats 輸出視頻編碼統計到vstats_hhmmss.log
-vhook module 插入視頻處理模塊 module 包括了模塊名和參數,用空格分開
音頻選項
-ab bitrate 設置音頻碼率
-ar freq 設置音頻采樣率
-ac channels 設置通道 缺省為1
-an 不使能音頻紀錄
-acodec codec 使用codec編解碼
音視頻捕獲選項
-vd device 設置視頻捕獲設備。比如/dev/video0
-vc channel 設置視頻捕獲通道 DV1394專用
-tvstd standard 設置電視標准 NTSC PAL(SECAM)
-dv1394 設置DV1394捕獲
-av device 設置音頻設備 比如/dev/dsp
高級選項
-map file:stream 設置輸入流映射
-debug 打印特定調試信息
-benchmark 為基准測試加入時間
-hex 傾倒每一個輸入包
-bitexact 僅使用位精確算法 用於編解碼測試
-ps size 設置包大小,以bits為單位
-re 以本地幀頻讀數據,主要用於模擬捕獲設備
-loop 循環輸入流。只工作於圖像流,用於ffserver測試
出處:https://www.cnblogs.com/schips/p/12161506.html
=======================================================================================
ffmpeg 常用命令
1. 視頻轉換
比如一個avi文件,想轉為mp4,或者一個mp4想轉為ts。
ffmpeg -i input.avi output.mp4
ffmpeg -i input.mp4 output.ts
2. 提取音頻
ffmpeg -i test.mp4 -acodec copy -vn output.aac
上面的命令,默認mp4的audio codec是aac,如果不是,可以都轉為最常見的aac。
ffmpeg -i test.mp4 -acodec aac -vn output.aac
3. 提取視頻
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
4. 視頻剪切
下面的命令,可以從時間為00:00:15開始,截取5秒鍾的視頻。
ffmpeg -ss 00:00:15 -t 00:00:05 -i input.mp4 -vcodec copy -acodec copy output.mp4
-ss表示開始切割的時間,-t表示要切多少。上面就是從15秒開始,切5秒鍾出來。
5. 碼率控制
碼率控制對於在線視頻比較重要。因為在線視頻需要考慮其能提供的帶寬。
那么,什么是碼率?很簡單:
bitrate = file size / duration
比如一個文件20.8M,時長1分鍾,那么,碼率就是:
biterate = 20.8M bit/60s = 20.8*1024*1024*8 bit/60s= 2831Kbps
一般音頻的碼率只有固定幾種,比如是128Kbps,
那么,video的就是
video biterate = 2831Kbps -128Kbps = 2703Kbps。
那么ffmpeg如何控制碼率。
ffmpg控制碼率有3種選擇,-minrate -b:v -maxrate
-b:v主要是控制平均碼率。
比如一個視頻源的碼率太高了,有10Mbps,文件太大,想把文件弄小一點,但是又不破壞分辨率。
ffmpeg -i input.mp4 -b:v 2000k output.mp4
上面把碼率從原碼率轉成2Mbps碼率,這樣其實也間接讓文件變小了。目測接近一半。
不過,ffmpeg官方wiki比較建議,設置b:v時,同時加上 -bufsize
-bufsize 用於設置碼率控制緩沖器的大小,設置的好處是,讓整體的碼率更趨近於希望的值,減少波動。(簡單來說,比如1 2的平均值是1.5, 1.49 1.51 也是1.5, 當然是第二種比較好)
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k output.mp4
-minrate -maxrate就簡單了,在線視頻有時候,希望碼率波動,不要超過一個閾值,可以設置maxrate。
ffmpeg -i input.mp4 -b:v 2000k -bufsize 2000k -maxrate 2500k output.mp4
6. 視頻編碼格式轉換
比如一個視頻的編碼是MPEG4,想用H264編碼,咋辦?
ffmpeg -i input.mp4 -vcodec h264 output.mp4
相反也一樣
ffmpeg -i input.mp4 -vcodec mpeg4 output.mp4
當然了,如果ffmpeg當時編譯時,添加了外部的x265或者X264,那也可以用外部的編碼器來編碼。(不知道什么是X265,可以 Google一下,簡單的說,就是她不包含在ffmpeg的源碼里,是獨立的一個開源代碼,用於編碼HEVC,ffmpeg編碼時可以調用它。當然 了,ffmpeg自己也有編碼器)
ffmpeg -i input.mp4 -c:v libx265 output.mp4
ffmpeg -i input.mp4 -c:v libx264 output.mp4
7. 只提取視頻ES數據
ffmpeg –i input.mp4 –vcodec copy –an –f m4v output.h264
8. 過濾器的使用
8.1 將輸入的1920x1080縮小到960x540輸出:
ffmpeg -i input.mp4 -vf scale=960:540 output.mp4
//ps: 如果540不寫,寫成-1,即scale=960:-1, 那也是可以的,ffmpeg會通知縮放濾鏡在輸出時保持原始的寬高比。
8.2 為視頻添加logo
比如,我有這么一個圖片
想要貼到一個視頻上,那可以用如下命令:
./ffmpeg -i input.mp4 -i iQIYI_logo.png -filter_complex overlay output.mp4
結果如下所示:
要貼到其他地方?看下面:
右上角:
./ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w output.mp4
左下角:
./ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=0:H-h output.mp4
右下角:
./ffmpeg -i input.mp4 -i logo.png -filter_complex overlay=W-w:H-h output.mp4
8.3 去掉視頻的logo
語法:-vf delogo=x:y:w:h[:t[:show]]
x:y 離左上角的坐標
w:h logo的寬和高
t: 矩形邊緣的厚度默認值4
show:若設置為1有一個綠色的矩形,默認值0。
ffmpeg -i input.mp4 -vf delogo=0:0:220:90:100:1 output.mp4
結果如下所示:
9. 截取視頻圖像
ffmpeg -i input.mp4 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
-r 表示每一秒幾幀
-q:v表示存儲jpeg的圖像質量,一般2是高質量。
如此,ffmpeg會把input.mp4,每隔一秒,存一張圖片下來。假設有60s,那會有60張。
可以設置開始的時間,和你想要截取的時間。
ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
-ss 表示開始時間
-t 表示共要多少時間。
如此,ffmpeg會從input.mp4的第20s時間開始,往下10s,即20~30s這10秒鍾之間,每隔1s就抓一幀,總共會抓10幀。
10. 序列幀與視頻的相互轉換
把darkdoor.[001-100].jpg序列幀和001.mp3音頻文件利用mpeg4編碼方式合成視頻文件darkdoor.avi:
$ ffmpeg -i 001.mp3 -i darkdoor.%3d.jpg -s 1024x768 -author fy -vcodec mpeg4 darkdoor.avi
還可以把視頻文件導出成jpg序列幀:
$ ffmpeg -i bc-cinematic-en.avi example.%d.jpg
其他用法
1.輸出YUV420原始數據
對於一下做底層編解碼的人來說,有時候常要提取視頻的YUV原始數據,如下:
ffmpeg -i input.mp4 output.yuv
那如果我只想要抽取某一幀YUV呢?
你先用上面的方法,先抽出jpeg圖片,然后把jpeg轉為YUV。
比如:
你先抽取10幀圖片。
ffmpeg -i input.mp4 -ss 00:00:20 -t 10 -r 1 -q:v 2 -f image2 pic-%03d.jpeg
然后,你就隨便挑一張,轉為YUV:
ffmpeg -i pic-001.jpeg -s 1440x1440 -pix_fmt yuv420p xxx3.yuv
如果-s參數不寫,則輸出大小與輸入一樣。
當然了,YUV還有yuv422p啥的,你在-pix_fmt 換成yuv422p就行啦!
2. H264編碼profile & level控制
背景知識
先科普一下profile&level。(這里討論最常用的H264)
H.264有四種畫質級別,分別是baseline, extended, main, high:
1、Baseline Profile:基本畫質。支持I/P 幀,只支持無交錯(Progressive)和CAVLC;
2、Extended profile:進階畫質。支持I/P/B/SP/SI 幀,只支持無交錯(Progressive)和CAVLC;(用的少)
3、Main profile:主流畫質。提供I/P/B 幀,支持無交錯(Progressive)和交錯(Interlaced),
也支持CAVLC 和CABAC 的支持;
4、High profile:高級畫質。在main Profile 的基礎上增加了8x8內部預測、自定義量化、 無損視頻編碼和更多的YUV 格式;
H.264 Baseline profile、Extended profile和Main profile都是針對8位樣本數據、4:2:0格式(YUV)的視頻序列。在相同配置情況下,High profile(HP)可以比Main profile(MP)降低10%的碼率。
根據應用領域的不同,Baseline profile多應用於實時通信領域,Main profile多應用於流媒體領域,High profile則多應用於廣電和存儲領域。
下圖清楚的給出不同的profile&level的性能區別。
profile
level
2.1 ffmpeg如何控制profile&level
舉3個例子吧
ffmpeg -i input.mp4 -profile:v baseline -level 3.0 output.mp4
ffmpeg -i input.mp4 -profile:v main -level 4.2 output.mp4
ffmpeg -i input.mp4 -profile:v high -level 5.1 output.mp4
如果ffmpeg編譯時加了external的libx264,那就這么寫:
ffmpeg -i input.mp4 -c:v libx264 -x264-params "profile=high:level=3.0" output.mp4
從壓縮比例來說,baseline< main < high,對於帶寬比較局限的在線視頻,可能會選擇high,但有些時候,做個小視頻,希望所有的設備基本都能解碼(有些低端設備或早期的設備只能解碼 baseline),那就犧牲文件大小吧,用baseline。自己取舍吧!
蘋果的設備對不同profile的支持。
2.2. 編碼效率和視頻質量的取舍(preset, crf)
除了上面提到的,強行配置biterate,或者強行配置profile/level,還有2個參數可以控制編碼效率。
一個是preset,一個是crf。
preset也挺粗暴,基本原則就是,如果你覺得編碼太快或太慢了,想改改,可以用profile。
preset有如下參數可用:
ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow and placebo.
編碼加快,意味着信息丟失越嚴重,輸出圖像質量越差。
CRF(Constant Rate Factor): 范圍 0-51: 0是編碼毫無丟失信息, 23 is 默認, 51 是最差的情況。相對合理的區間是18-28.
值越大,壓縮效率越高,但也意味着信息丟失越嚴重,輸出圖像質量越差。
舉個例子吧。
ffmpeg -i input -c:v libx264 -profile:v main -preset:v fast -level 3.1 -x264opts crf=18
(參考自:https://trac.ffmpeg.org/wiki/Encode/H.264)
2.3. H265 (HEVC)編碼tile&level控制
背景知識
和H264的profile&level一樣,為了應對不同應用的需求,HEVC制定了“層級”(tier) 和“等級”(level)。
tier只有main和high。
level有13級,如下所示:
不多說,直接給出怎么用。(supposed你用libx265編碼)
ffmpeg -i input.mp4 -c:v libx265 -x265-params "profile=high:level=3.0" output.mp4
出處:https://www.cnblogs.com/frost-yen/p/5848781.html
=======================================================================================
FFmpeg 命令
一、錄制命令
1.1、獲取支持的設備
要錄制屏幕,首先要知道當前筆記本支持的輸入設備。
ffmpeg -devices
Devices:
D. = Demuxing supported
.E = Muxing supported
--
D avfoundation AVFoundation input device
D lavfi Libavfilter virtual input device
E sdl,sdl2 SDL2 output device
通過 ffmpeg -devices
可以知道我的 Mac 的輸入設備:avfoundation
查詢 avfoundation
視頻和音頻的索引
ffmpeg -f avfoundation -list_devices true -i ""
[AVFoundation input device @ 0x7fb5b340d6c0] AVFoundation video devices:
[AVFoundation input device @ 0x7fb5b340d6c0] [0] FaceTime HD Camera
[AVFoundation input device @ 0x7fb5b340d6c0] [1] Capture screen 0
[AVFoundation input device @ 0x7fb5b340d6c0] AVFoundation audio devices:
[AVFoundation input device @ 0x7fb5b340d6c0] [0] MacBook Pro麥克風
1.2、采集屏幕
ffmpeg -f avfoundation -i 1: -r 30 out.yuv
- -f 指定從哪里采集數據 avfoundation
- -i 1 表示從屏幕獲取數據,0 表示從攝像頭獲取數據
- -r 表示視頻的幀率
- 播放采集視頻數據
ffplay out.yuv
這樣播放 yuv 格式的原始視頻是有問題的,因為沒有指定視頻的分辨率
和視頻的格式
ffplay -s 3360x2100 -pix_fmt uyvy422 out.yuv
- -s 表示視頻的分辨率。
如果 -s 不指定
[IMGUTILS @ 0x700001e58808] Picture size 0x0 is invalid
studyout.yuv: Invalid argument
如果不指定 -pix_fmt
就會出現花屏問題。
- -pix_fmt 表示視頻的格式
1.3、采集音頻
利用 Macbook 的麥克風,采集音頻數據。
ffmpeg -f avfoundation -i :0 out.wav
- -f 指定從哪里采集數據 avfoundation
- -i 指定 avfoundation 的索引,在 : 前面表示視頻索引,在 : 后面表示音頻索引
二、分解與復用命令
2.1、將 mp4 轉化為 flv
ffmpeg -i testfile.mp4 -vcodec copy -acodec copy testfile.flv
or
ffmpeg -i testfile.mp4 -codec copy testfile.flv
2.2、將 mp4 文件的中視頻抽取出來
ffmpeg -i testfile.mp4 -vcodec copy -an testfile.flv
2.3、將 mp4 文件中的音頻抽取出來
ffmpeg -i testfile.mp4 -vn -acodec copy testfile.flv
- -an 表示阻止文件的所有音頻流
- -an 表示阻止文件的所有視頻流
- -acodec 設置音頻編解碼器, copy 表示
- -vcodec 設置視頻編解碼器
- -c 表示編解碼器,包括音視頻編解碼器
三、抽取音視頻原始數據
3.1、抽取 mp4 文件的原始 yuv 視頻數據
ffmpeg -i testfile.mp4 -an -codec:v rawvideo -pix_fmt yuv420p out.yuv
- -codec:v 指定視頻編解碼器 rawvideo 表示原始視頻數據
- -codec:a 指定音頻編解碼器
3.2、抽取 mp4 文件的原始 pcm 音頻數據
ffmpeg -i testfile.mp4 -vn -ar 44100 -ac 2 -f s16le out.pcm
- -ar 指定采樣率
- -ac 指定通道數
- -f 指定數據格式 s16le 有符號,16字節,little end
播放:
ffplay -ar 44100 -ac 2 -f s16le out.pcm
四、濾鏡命令
4.1、設置聲音濾鏡
ffmpeg -i /Users/liaowj/Documents/media/study/Complicated.mp3 -vf volume=1 -acodec copy volume.mp3
- -vf 表示視頻濾鏡
五、視頻裁剪命令
5.1、裁剪命令
從某一個位置00:01:10位置開始裁剪一個 mp4 文件,裁剪時間 10 s。
ffmpeg -i haha.mp4 -ss 00:01:10 -t 10 out.ts
- -t 表示限制從輸入文件讀取數據的時長,單位為 s。
- -ss 表示拖動到某一個時間位置,格式為:12:03:45
5.2、合並視頻命令
合並兩個視頻文件
ffmpeg -f concat -i input.txt out.mp4
- -f 指定輸入或輸出的file format,concat 是 format 的其中一種
-
-i 指定數據的數據源
-
input.txt 指定了兩個文件的路徑,格式為 file absolutefilepath
file out.mp4
file out1.mp4
六、視頻與圖片轉換命令
6.1、將一個視頻每一幀圖片提取出來,fps = 1
ffmpeg -i testfile.mp4 -r 1 -f image2 foo-%03d.jpeg
- -r 1s 為一幀
- -f 指定輸出文件的格式為 image2
6.2、將一組圖片轉化為一個視頻文件
ffmpeg -f image2 -i foo-%03d.jpeg out.avi
出處:https://www.jianshu.com/p/fa79e97b1e51
=======================================================================================