寫在前面
如果您對(duì)音視頻技術(shù)感興趣,可以訂閱我的專題:音視頻專輯
也可以關(guān)注我的簡(jiǎn)書賬戶: 張芳濤,我后期會(huì)發(fā)布更多的音視頻以及圖像處理方面的文章。
正文
加入音頻和視頻文件
有幾種加入媒體文件,它們?cè)诒砀裰忻枋觯?/p>

| 類型 | 描述 | 針對(duì)音頻 | 針對(duì)視頻 |
|---|---|---|---|
| 級(jí)聯(lián) | 編碼文件一個(gè)接一個(gè); 第一個(gè)結(jié)束,第二個(gè)開始 | Yes | Yes |
| 合并 | 將所有音頻流編碼為一個(gè),例如2個(gè)單聲道到1個(gè)立體聲 | Yes | No |
| 混合 | 將2個(gè)或更多音頻通道編碼為1,音量可以調(diào)節(jié) | Yes | No |
| 多路復(fù)用 (mux) | 將2個(gè)或更多文件編碼為1,例如1個(gè)音頻和1個(gè)視頻文件,如果存在更多相同類型的流,則選擇是在用戶 | Yes | Yes |
| 覆蓋/畫中畫 (PiP) | 2個(gè)或更多視頻一次顯示在另一個(gè)旁邊或一個(gè)在另一個(gè)之上 | No | Yes |
連接與shell命令
媒體文件連接的先決條件
| 特殊文件格式 | 連接只能是某些文件格式: 音頻- MP3(第2個(gè)文件的頭將消失),未壓縮的像WAV, PCM,等視頻- MPEG-1, MPEG-2 TS, DV |
|---|---|
| 格式的一致性 | 所有連接的文件都是相同的格式,這意味著可以加入2個(gè)MP3文件,但1個(gè)帶有1個(gè)WAV的MP3不能 |
| 流的一致性 | 所有連接文件: - 包含相同數(shù)量的每種類型的流。 - 音頻流使用相同的編解碼器,采樣率和通道布局 - 視頻流使用相同的分辨率 |
| 為符合此要求,通常需要轉(zhuǎn)換輸入文件,使用-q 1或類似選項(xiàng)來保持初始質(zhì)量,詳細(xì)信息請(qǐng)參閱格式間轉(zhuǎn)換 |
在Windows上,我們可以使用帶有/B標(biāo)志的復(fù)制命令來指示二進(jìn)制模式,在文件之間必須是一個(gè)加號(hào)。連接N文件的復(fù)制命令的一般形式是:
copy /B file1+file2+...+fileN-1+fileN outputFile
例如,連接文件videoclip1。mpg和videoclip2。mpg到文件視頻。mpg,我們可以使用以下命令:
copy /B videoclip1.mpg+videoclip2.mpg video.mpg
在Linux、Unix和OS X上,我們可以在表單中使用cat命令:cat file1 files2 > file3,因此我們可以修改前面的例子:
cat videoclip1.mpg videoclip2.mpg > video.mpg
鏈接concat協(xié)議
另一種選擇是使用concat協(xié)議,先決條件類似于復(fù)制命令。例如,要使用該協(xié)議修改前面的示例,我們可以使用以下命令:
ffmpeg -i concat:"videoclip1.mpg|videoclip2.mpg" -c copy video.mpg
我的測(cè)試命令:
ffmpeg -i concat:"/Users/zhangfangtao/Desktop/test.mp4|/Users/zhangfangtao/Desktop/test2.mp4" -c copy /Users/zhangfangtao/Desktop/test3.mp4
- 顯示效果:
生成了一個(gè)新的視頻,不過我感覺這個(gè)視頻和test1沒有什么差別。
連接concat過濾器
用于音頻和視頻拼接的特殊過濾器是在表中描述的concat過濾器:

| 描述 | 連接音頻和視頻文件一個(gè)接一個(gè)。該過濾器適用于同步視頻和音頻流的片段(文件),其中所有片段必須具有相同數(shù)量的每種類型的流,例如1個(gè)音頻和1個(gè)視頻,或2個(gè)音頻和1個(gè)視頻,等等 |
|---|---|
| 語法 | concat=a=a_streams:v=v_streams:n=segments[:unsafe] 所有的參數(shù)都是可選的 |
| 參數(shù)的描述 | |
| a | 輸出音頻流的數(shù)量,默認(rèn)值為0 |
| n | 段數(shù),默認(rèn)值為2 |
| unsafe | 安全模式激活,如果設(shè)置,連接將不會(huì)以不同格式的片段失敗 |
| v | 輸出視頻流的數(shù)量,默認(rèn)值為1 |
適當(dāng)篩選結(jié)果的先決條件:
所有段必須從時(shí)間戳0開始。
相應(yīng)的流必須在所有段中使用相同的參數(shù),特別是視頻大小。
-
建議是相同的幀速率,否則輸出將使用可變幀速率。
Concat filter可以加入各種格式,有些例子是:ffmpeg -i input1.avi -i input2.avi -filter_complex concat output.avi ffmpeg -i input1.avi -i input2.avi -filter_complex concat output.mp4 ffmpeg -i input1.avi -i input2.mp4 -filter_complex concat output.webm ffmpeg -i input1.avi -i input2.mp4 -i input3.mkv -filter_complex ^ concat=n=3 output.flv ffmpeg -i input1.avi -i input2.avi -i input3.avi -i input4.avi ^ -filter_complex concat=n=4 output.mp4 f -i 1.avi -vf movie=2.avi[a];[in][a]concat a.mp4
我的測(cè)試命令如下:
ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -i /Users/zhangfangtao/Desktop/test3.mp4 -filter_complex concat /Users/zhangfangtao/Desktop/test4.mp4
- 顯示效果:
生成了一個(gè)視頻,里面包含前兩段的是視頻內(nèi)容,不過,有效時(shí)長(zhǎng)只是第一段視頻的長(zhǎng)度。后面有種無效的感覺。。。。
其他類型的拼接技術(shù)
- 音頻合并(多個(gè)流到1個(gè)多聲道流) - 在數(shù)字音頻一章中介紹
- 將幾個(gè)音頻文件混合到1 - 在數(shù)字音頻一章中有描述
- 多路復(fù)用 - 在“FFmpeg基本介紹”一章中介紹了媒體流的選擇
- overlay-在overlay-畫中畫章節(jié)里面有具體的描述。
移除掉logo
一些視頻包含公司標(biāo)志,通常位于左上角,常見示例是錄制電視節(jié)目。 FFmpeg包含2個(gè)特殊濾鏡以去除徽標(biāo),而最終效果并不總是完美,不過在許多情況下這種移除logo的技術(shù)還是可以接受的。
delogo過濾器

| 描述 | 通過對(duì)周圍像素的簡(jiǎn)單插值來隱藏一個(gè)電視臺(tái)的標(biāo)志。用戶設(shè)置一個(gè)覆蓋該徽標(biāo)的矩形,它通常會(huì)消失(但在某些情況下,標(biāo)識(shí)更明顯)。過濾器接受參數(shù)作為表單“x:y:w:h:band”的字符串,或作為鍵=值對(duì)的列表,由“:”分隔 |
|---|---|
| 語法 | delogo=x=0:y=0:w=width:h=height[:t=band:show={0,1}] []中的參數(shù)是可選的,顯示為0或1 |
| 參數(shù)的描述 | |
| x, y | 標(biāo)志的左上角的坐標(biāo) |
| w, h | 標(biāo)志的寬度和高度 |
| band or t | 該標(biāo)志矩形的模糊邊緣厚度,默認(rèn)值為4 |
| show | 定位的參數(shù),默認(rèn)值為0,如果設(shè)置為1,屏幕上的綠色矩形顯示為幫助查找正確的x、y、w和h參數(shù) |
例如,我們首先從下圖所示的800x600像素大小視頻的右上角移除一個(gè)標(biāo)志,我們通過顯示一個(gè)綠色矩形的顯示選項(xiàng)來估計(jì)logo的位置:
ffmpeg -i eagles.mpg -vf delogo=x=700:y=0:w=100:h=50:t=3:show=1 nologo.mpg
現(xiàn)在我們可以精確地指定位置和標(biāo)識(shí)的存在幾乎是不可見的:
ffmpeg -i eagles.mpg -vf delogo=x=730:y=0:w=70:h=46:t=1 nologo.mpg

我的測(cè)試命令如下(沒有t參數(shù),我這邊不識(shí)別這個(gè),報(bào)錯(cuò)):
ffmpeg -i /Users/zhangfangtao/Desktop/ornage.jpeg -vf "delogo=x=15:y=678:w=218:h=20:show=1" /Users/zhangfangtao/Desktop/ornage2.jpeg
-
顯示效果(有沒有看到一個(gè)綠色的框):
有沒有看到一個(gè)綠色的框ffmpeg -i /Users/zhangfangtao/Desktop/ornage.jpeg -vf "delogo=x=10:y=700:w=300:h=35" /Users/zhangfangtao/Desktop/ornage3.jpeg 顯示效果(水印沒了):

抖動(dòng)視頻部分的固定
沒有三腳架或車輛拍攝的視頻的一些部分通常包括抖動(dòng) - 水平和垂直移動(dòng)的小變化,在某些情況下可以使用去抖濾波器進(jìn)行修正:

| 描述 | 修正水平和垂直位移的小變化,當(dāng)視頻沒有三腳架或移動(dòng)車輛時(shí)有用 |
|---|---|
| 語法 | deshake=x:y:w:h:rx:ry:edge:blocksize:contrast:search:filename 所有的參數(shù)是可選的 |
| 參數(shù)的描述 | |
| x, y, w, h | 矩形區(qū)域的坐標(biāo)和大小,搜索運(yùn)動(dòng)向量,x和y是左上角的坐標(biāo),w是寬度,h是高度。這些參數(shù)與drawbox過濾器具有相同的含義,可用于可視化邊界框的位置。當(dāng)物體在框架內(nèi)同時(shí)運(yùn)動(dòng)時(shí),運(yùn)動(dòng)矢量搜索可能會(huì)混淆攝像機(jī)的運(yùn)動(dòng),這是很有用的。如果x, y, w和h都被設(shè)為-1那么整個(gè)框架就被使用了。這允許在不指定運(yùn)動(dòng)向量搜索的邊界框的情況下設(shè)置后續(xù)選項(xiàng)。默認(rèn)-搜索整個(gè)框架。 |
| rx, ry | 在0 - 64像素范圍內(nèi)指定x和y方向的最大運(yùn)動(dòng)范圍,默認(rèn)值為16 |
| edge | 指定如何生成像素來填充框架邊緣的空白,值為從0到3的整數(shù): 0 -在空白位置填充零 1 -原始圖像在空白位置 2 -在空白位置的擠壓邊值 3 -鏡像邊緣在空白位置,默認(rèn)值 |
| blocksize | 指定用于運(yùn)動(dòng)搜索的塊大小,其值為4 - 128像素,默認(rèn)值為8 |
| contrast | 指定塊的對(duì)比度閾值。只有超過指定對(duì)比度的塊(最黑和最輕的像素之間的區(qū)別)才會(huì)被考慮。該值來自范圍1 - 255,默認(rèn)值為125 |
| search | 指定搜索策略: 0 =徹底搜索,默認(rèn)值 1 =不徹底搜索 |
| filename | 如果包含,則將動(dòng)作搜索的詳細(xì)日志寫入指定的文件 |
參數(shù)可以按順序進(jìn)入默認(rèn)順序或以任何順序指定名稱:
ffmpeg -i travel.avi -vf deshake fixed_travel.avi
ffmpeg -i travel.avi -vf deshake=contrast=160 fixed.avi
ffmpeg -i travel.avi -vf deshake=blocksize=4:filename=log.txt fixed.avi
我的測(cè)試命令:
ffmpeg -i /Users/zhangfangtao/Desktop/1527143197.mp4 -vf deshake /Users/zhangfangtao/Desktop/1527143198.mp4
ffmpeg -i /Users/zhangfangtao/Desktop/1527143197.mp4 -vf deshake=contrast=160 /Users/zhangfangtao/Desktop/1527143199.mp4
ffmpeg -i /Users/zhangfangtao/Desktop/1527143197.mp4 -vf deshake=blocksize=4:filename=/Users/zhangfangtao/Desktop/log.txt /Users/zhangfangtao/Desktop/1527143200.mp4
- 顯示效果:其實(shí),我并沒有看出來什么效果。。。可能我用手機(jī)拍的抖得太厲害了。。。
第三條指令打印出來的txt信息截圖如下:

將顏色框添加到視頻
使用drawbox,我們可以在矩形區(qū)域找到精確的坐標(biāo),以在其中搜索運(yùn)動(dòng)矢量,它用于除霧過濾器。 其他用途包括各種圖表,方案等。

| 描述 | 在輸入的選定區(qū)域繪制指定顏色和指定大小的框 |
|---|---|
| 語法 | drawbox[=x:y:width:height:color:thickness] |
| 參數(shù)的描述 | |
| color, c | 格式0xRRGGBB[AA]中的標(biāo)準(zhǔn)顏色名稱或十六進(jìn)制值 |
| height, h | 框的高度,默認(rèn)值為0 |
| thickness, t | 邊框邊緣的寬度以像素為單位,默認(rèn)值為4 |
| width, w | 框的寬度,默認(rèn)值為0 |
| x, y | 方框的左上角坐標(biāo),默認(rèn)值為0 |
例如,要在SVGA大小的輸入上添加一個(gè)尺寸為600x400像素的黃色框,其大小為左側(cè)150像素和頂部0像素,我們可以使用以下命令:
ffmpeg -i ship.avi -vf drawbox=x=150:w=600:h=400:c=yellow ship1.avi

我的測(cè)試命令:
ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf drawbox=x=150:w=600:h=400:c=yellow /Users/zhangfangtao/Desktop/test3.mp4
- 顯示效果

檢測(cè)幀數(shù)
如果您需要知道有多少幀包含您的視頻文件,您可以使用以下命令:
ffmpeg -i input.mpg -f null /dev/null
顯示輸出的最后兩行是:
frame= 250 fps=0.0 q=0.0 Lsize= 0kB time=00:00:10.00 bitrate= 0.0kbits/s
video:16kB audio:0kB subtitle:0 global headers:0kB muxing overhead -100.000000%
幀數(shù)為250,表示視頻幀的總數(shù),也可以從幀速率和持續(xù)時(shí)間計(jì)算,但結(jié)果并不總是準(zhǔn)確。
我的測(cè)試命如下:
ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -f null /dev/null
- 顯示效果如下:

檢測(cè)廣告,部分轉(zhuǎn)換或損壞的編碼
從電視,互聯(lián)網(wǎng)等錄制的較長(zhǎng)視頻可以包含帶有廣告,轉(zhuǎn)場(chǎng),不完整幀和其他不需要內(nèi)容的短片。 如果此部分包含黑色框架,則可以使用表中描述的黑色檢測(cè)過濾器檢測(cè)它們。

| Description | 檢測(cè)幾乎全黑的視頻部分,并輸出包含檢測(cè)到的黑色間隔的開始,結(jié)束和持續(xù)時(shí)間的行,以秒為單位表示。 如果日志級(jí)別設(shè)置為低于AV_LOG_INFO值,則不顯示行 |
|---|---|
| 語法 | blackdetect[=d=duration:pic_th=pbr_threshold:pix_th=px_threshold] |
參數(shù)的描述(所有的參數(shù)都是可選的)
| 參數(shù)名稱 | 單位 | 描述 | 默認(rèn)值 |
|---|---|---|---|
| black_min_duration, d | 秒 | 正浮點(diǎn)數(shù)確定視頻中黑色幀的最小持續(xù)時(shí)間 | 2.0 |
| picture_black_ratio_th, pic_th | 浮點(diǎn)數(shù)在0到1.0之間 | 例如,如果幀大小為400x300(總共12萬像素),12000像素不是黑色,那么這個(gè)比例是0.9 | 0.98 |
| pixel_black_th, pix_th | 浮點(diǎn)數(shù)在0到1.0之間 | Treshold設(shè)置像素為黑色,它等于表達(dá)式: (absolute_threshold–luminance_minimum_value) luminance_range_size) |
0.1 |
例如,要從源mptestsrc中檢測(cè)黑幀,命令是(控制臺(tái)輸出如下):
ffmpeg -f lavfi -i mptestsrc -vf blackdetect -f sdl 'test'

我的測(cè)試命令:
ffmpeg -f lavfi -i mptestsrc -vf blackdetect -f sdl 'test'
*顯示效果:

用黑幀過濾器進(jìn)行檢測(cè)
檢測(cè)黑幀的另一個(gè)過濾器是表中描述的黑幀過濾器:

| 描述 | 檢測(cè)幾乎為黑色的幀,并輸出包含: - 檢測(cè)幀的幀數(shù) - 黑色部分的百分比 - 如果已知?jiǎng)t在文件中定位,否則為-1 - 時(shí)間戳 |
|---|---|
| 語法 | blackframe[=amount:[treshold]] 所有的參數(shù)都是可選的 |
| 參數(shù) | |
| amount | 在閾值下的像素百分比,默認(rèn)值為98 |
| threshold | 下面是被認(rèn)為是黑色的像素,默認(rèn)值是32 |
過濾器blackdetect和blackframe類似,但每個(gè)顯示不同的信息。 圖像上顯示使用與黑檢測(cè)濾鏡相同的視頻源的黑幀濾鏡輸出:
ffmpeg -f lavfi -i mptestsrc -vf blackframe -f sdl 'test'

我的測(cè)試命令如下:
ffmpeg -f lavfi -i mptestsrc -vf blackframe -f sdl 'test'
- 顯示效果:

只選擇指定的幀進(jìn)行輸出
特殊的多媒體過濾器可以選擇音頻并選擇視頻啟用,以精確指定哪些幀將保留,哪些從輸出中排除。

| 描述 | 選擇輸出幀,對(duì)每個(gè)輸入幀評(píng)估表達(dá)式,如果表達(dá)式的值不為零,則選擇幀,否則跳過幀 |
|---|---|
| 語法 | select=expression expression默認(rèn)值是1 |
| 可用的參數(shù) | |
| n | 從0開始的過濾幀的連續(xù)編號(hào) |
| selected_n | 所選幀的序號(hào),從0開始 |
| prev_selected_n | 如果未定義,則最后一個(gè)選定幀的序列號(hào)為NAN |
| TB | 輸入時(shí)間戳的時(shí)基 |
| pts | 如果NAN未定義,那么經(jīng)過濾波的視頻幀的PTS(表示時(shí)間戳)以TB為單位表示 |
| t | 如果NAN未定義,則濾波的視頻幀的PTS以秒表示 |
| prev_pts | 先前過濾的視頻幀的PTS,如果未定義則為NAN |
| prev_selected_pts | 如果NAN未定義,則最后一個(gè)先前過濾的視頻幀的PTS |
| prev_selected_t | 如果NAN未定義,則最后選擇的最后一個(gè)視頻幀的PTS |
| start_pts | 如果NAN未定義,視頻中第一個(gè)視頻幀的PTS |
| start_t | 如果NAN未定義,第一個(gè)視頻幀的時(shí)間在視頻中 |
| pict_type (只局限在視頻中) |
過濾幀的類型,可以采用以下值之一: I ...幀內(nèi)預(yù)測(cè)幀, P ... 前向預(yù)測(cè)幀, B ...雙向預(yù)測(cè)幀, S ...交換幀,SI ...切換I幀,SP ...切換P幀,BI ...特殊幀內(nèi)幀,不是關(guān)鍵幀(VC-1視頻編解碼器) |
| interlace_type (只局限在視頻中) |
幀間型,可采用下列值之一: PROGRESSIVE, TOPFIRST, BOTTOMFIRST |
| PROGRESSIVE | 幀是漸進(jìn)的(不是交錯(cuò)的) |
| TOPFIRST | 幀是top-field-first |
| BOTTOMFIRST | 幀是bottom-field-first |
| key | 如果經(jīng)過篩選的幀是一個(gè)關(guān)鍵幀,否則為0 |
| pos | 如果信息不可用(例如合成視頻),在過濾幀的文件中位置為-1 |
| scene (僅局限于視頻) |
0和1之間的值表示一個(gè)新的場(chǎng)景;低值反映了當(dāng)前幀引入新場(chǎng)景的低概率,而更高的值意味著當(dāng)前幀更可能是一個(gè) |
| consumed_sample_n | 在當(dāng)前幀之前選擇的樣本數(shù)目 |
| samples_n | 當(dāng)前幀中的樣本數(shù)目 |
| sample_rate | 輸入采樣率 |
由于select表達(dá)式的默認(rèn)值為1,因此選擇過濾器使用的接下來的兩個(gè)示例會(huì)產(chǎn)生相同的結(jié)果 - 所有幀將被選擇為輸出(值如果是0將不會(huì)選擇任何內(nèi)容):
ffmpeg -i input.avi -vf select output.avi
ffmpeg -i input.avi -vf select=1 output.avi
我的測(cè)試命令如下:
ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf select /Users/zhangfangtao/Desktop/test3.mp4
ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf select=1 /Users/zhangfangtao/Desktop/test3.mp4
ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf select=0 /Users/zhangfangtao/Desktop/test3.mp4
- 實(shí)現(xiàn)效果,前兩個(gè)命令生成的是和原來一樣的視頻,最后一個(gè)命令,只有音頻信息,沒有界面。
要選擇20到25秒的部分,我們可以使用以下命令:
ffmpeg -i input.avi -vf select="gte(t\,20)*lte(t\,25)" output.avi
我的測(cè)試命令如下:
ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf select="gte\(t\,20\)*lte\(t\,25\)" /Users/zhangfangtao/Desktop/test3.mp4
- 實(shí)現(xiàn)效果:
時(shí)間的限制不是太準(zhǔn)確,,,還是從頭給我播放到了最后。。。
若要選擇幀內(nèi)僅為輸出,我們可以使用以下命令:
ffmpeg -i input.avi -vf select="eq(pict_type\,I)" output.avi
我的測(cè)試命令如下:
ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf select="eq\(pict_type\,I\)" /Users/zhangfangtao/Desktop/test3.mp4
- 實(shí)現(xiàn)的結(jié)果:
視頻長(zhǎng)短沒有變,但是視頻的大小幾乎減少了一半。而且視頻少了很多細(xì)節(jié)。
通過改變縱橫比來縮放輸入
調(diào)整和伸縮視頻章節(jié)描述了縮放視頻幀的縮放過濾器。 另一種方法是使用改變顯示寬高比DAR和樣本寬高比SAR的setdar和setsar濾波器,它們的關(guān)系用公式表示(關(guān)于寬高比的細(xì)節(jié)在詞匯表中):
DAR = width/height * SAR

| 描述 | setdar過濾器設(shè)置顯示縱橫比和setsar的樣本縱橫比 |
|---|---|
| 語法 | setdar[=r=aspect_ratio[:max=number]] setdar[=aspect_ratio[:number]] |
| 參數(shù)的描述 | |
| r, ratio | 縱橫比,值可以是浮點(diǎn)數(shù)或表達(dá)式,默認(rèn)值為0 |
| max | 在將縱橫比設(shè)為一個(gè)有理數(shù)時(shí),表示分子和分母的最大整數(shù)值,默認(rèn)值為100 |
示例如何使用setdar和setsar過濾器:
ffplay -i input.avi -vf setdar=r=16/9
ffplay -i input.avi -vf setdar=16/9
ffplay -i input.avi -vf setsar=r=1.234
ffplay -i input.avi -vf setsar=1.234
我的測(cè)試命令如下:
ffplay -i /Users/zhangfangtao/Desktop/test.mp4 -vf setdar=r=16/9
ffplay -i /Users/zhangfangtao/Desktop/test.mp4 -vf setdar=16/9
ffplay -i /Users/zhangfangtao/Desktop/test.mp4 -vf setsar=r=1.234
ffplay -i /Users/zhangfangtao/Desktop/test.mp4 -vf setsar=1.234
- 顯示效果如下:

屏幕抓取
為了將顯示輸出記錄到視頻文件中,例如創(chuàng)建一個(gè)教程,我們可以使用安裝了UScreenCapture直接顯示源過濾器的dshow輸入設(shè)備,下面是下載地址。
http://www.umediaserver.net/bin/UScreenCapture.zip
為了抓取全屏內(nèi)容,我們可以使用以下命令:
ffmpeg -f dshow -i video="UScreenCapture" -t 60 screen.mp4
如果我們想抓取一個(gè)特定的屏幕區(qū)域。我們必須使用regedit Windows工具來修改某些注冊(cè)表項(xiàng),相信信息在downloaded UScreenCapture.zip文件里面的README文件里面。
因?yàn)槲矣玫腗AC電腦,所以我的錄屏命令如下:
ffmpeg -f avfoundation -r 30 -i "1:0" -t 20 /Users/zhangfangtao/Desktop/test2.mp4
- 顯示效果如下:

視頻幀的詳細(xì)信息
為了顯示每個(gè)視頻幀的信息,我們可以使用表格中描述的showinfo過濾器:

| 描述 | 顯示包含有關(guān)每個(gè)輸入視頻幀信息的行,數(shù)據(jù)采用鍵:值對(duì)的形式。 該過濾器沒有參數(shù),應(yīng)與-report選項(xiàng)一起使用 |
|---|---|
| 語法 | -vf showinfo |
| 顯示參數(shù)的描述 | |
| n | 輸入框的序號(hào),從0開始 |
| pts | 輸入框的表示時(shí)間戳,表示為若干時(shí)間基單元;時(shí)間基單元依賴于過濾器輸入板 |
| pts_time | 輸入框的表示時(shí)間戳,表示為若干秒 |
| pos | 輸入流中幀的位置,如果該信息不可用或沒有意義(例如在合成視頻中) |
| fmt | 像素格式名稱 |
| sar | 輸入幀的采樣寬高比,以分子/分母的形式表示 |
| s | 輸入框的大小,以寬*長(zhǎng)的形式表示 |
| i | 隔行掃描模式:P表示漸進(jìn)式,T表示前場(chǎng)第一,B表示后場(chǎng)第一 |
| iskey | 如果該幀是關(guān)鍵幀,則為1,否則為0 |
| type | 輸入幀的圖像類型:I代表I幀,P代表P幀,B代表B幀,? 對(duì)于未知類型(更多的信息見AVPictureType枚舉的文檔) |
| checksum | 輸入幀的所有平面的Adler-32校驗(yàn)和(十六進(jìn)制) |
| plane_checksum | 輸入幀的每個(gè)平面的Adler-32校驗(yàn)和(十六進(jìn)制),表示形式為[c0 c1 c2 c3] |
例如,下一個(gè)命令會(huì)生成下面打印的信息,其中包括前三行:
ffmpeg -report -f lavfi -i testsrc -vf showinfo -t 10 showinfo.mpg
n:0 pts:0 pts_time:0 pos:-1 fmt:rgb24 sar:1/1 s:320x240 i:P iskey:1 type:I checksum:88C4D19A plane_checksum:[88C4D19A]
n:1 pts:1 pts_time:0.04 pos:-1 fmt:rgb24 sar:1/1 s:320x240 i:P iskey:1 type:I checksum:C4740AD1 plane_checksum:[C4740AD1]
n:2 pts:2 pts_time:0.08 pos:-1 fmt:rgb24 sar:1/1 s:320x240 i:P iskey:1 type:I checksum:B6DD3DEB plane_checksum:[B6DD3DEB]
我的測(cè)試命令如下:
ffmpeg -report -f lavfi -i testsrc -vf showinfo -t 10 /Users/zhangfangtao/Desktop/test.mp4
- 顯示效果:


音頻頻譜
為了使音頻頻譜可視化,我們可以使用表中描述的示波器濾波器:

| 描述 | 將音頻輸入轉(zhuǎn)換為視頻輸出 |
|---|---|
| 語法 | showspectrum[=s=widthxheight[:slide=number]] |
| 參數(shù)的描述 | |
| size, s | 輸出視頻大小,默認(rèn)值為640x480 |
| slide | 設(shè)置頻譜是否沿窗口滑動(dòng),默認(rèn)值為0 |
例如,下面的圖片顯示了該命令創(chuàng)建的聲譜:
ffmpeg -i audio.mp3 -vf showspectrum audio_spectrum.mp4

我的測(cè)試命令如下:
ffmpeg -i /Users/zhangfangtao/Desktop/DYZDJ.mp3 -lavfi showspectrum /Users/zhangfangtao/Desktop/test3.mp4
-
效果圖
音頻波形可視化
| 描述 | 將輸入音頻轉(zhuǎn)換為包含音頻波表示的視頻 |
|---|---|
| 語法 | showwaves[=n=number[:r=rate[:s=video_size]]] |
| 參數(shù)的描述 | |
| n | 打印在同一列上的樣本數(shù)量越大,數(shù)值越大會(huì)降低幀速率,因此不能與速率參數(shù)結(jié)合使用 |
| rate, r | 幀速率,默認(rèn)值為25,不能與n參數(shù)組合使用 |
| size, s | 視頻大小,默認(rèn)值是640x480 |
來自音頻輸入的波形可以通過表格中描述的showwaves濾波器進(jìn)行可視化:

| 描述 | 將輸入音頻轉(zhuǎn)換為包含音頻波表示的視頻 |
|---|---|
| 語法 | showwaves[=n=number[:r=rate[:s=video_size]]] |
| 參數(shù)的描述 | |
| n | 打印在同一列上的樣本數(shù)量越大,數(shù)值越大會(huì)降低幀速率,因此不能與速率參數(shù)結(jié)合使用 |
| rate, r | 幀速率,默認(rèn)值為25,不能與n參數(shù)組合使用 |
| size, s | 視頻大小,默認(rèn)值是640x480 |
例如,要將music.mp3文件中的波形可視化為waves.mp4文件,我們可以使用以下命令:
ffmpeg -i music.mp3 -vf showwaves waves.mp4

我的測(cè)試命令:
ffmpeg -i /Users/zhangfangtao/Desktop/NWDSL.mp3 -lavfi showwaves /Users/zhangfangtao/Desktop/test3.mp4
- 顯示效果如圖:

語音合成
- 沒有Windows環(huán)境,下面的沒測(cè)試,不過AVFoundation做這個(gè)相當(dāng)簡(jiǎn)單,想了解AVFounadtion怎么實(shí)現(xiàn)的點(diǎn)擊這里
通過包含libflite外部庫,人聲可以與來自Flite(Festival Lite)(一種小型可嵌入TTS(文本到語音)引擎)的flite音頻源合成。 它由美國(guó)卡內(nèi)基梅隆大學(xué)CMU Speech Group開發(fā)。 Flite完全用C語言編寫,重新實(shí)現(xiàn)了音樂節(jié)體系結(jié)構(gòu)的核心部分,以實(shí)現(xiàn)為每個(gè)系統(tǒng)設(shè)計(jì)的聲音之間的兼容性。 愛丁堡大學(xué)的節(jié)日語音合成系統(tǒng)是構(gòu)建語音合成系統(tǒng)的框架。 有關(guān)Flite的更多詳細(xì)信息,請(qǐng)?jiān)L問http://www.speech.cs.cmu.edu/flite

| 描述 | 由于其大尺寸,使用未包含在官方Windows二進(jìn)制文件中的libflite庫來合成具有選定語音類型的人類語音 |
|---|---|
| 語法 | flite="text"[:v=voice[:n=n_samples]] flite=textfile=filename[:v=voice[:n=n_samples]] |
| 參數(shù)的描述 | |
| list_voices | 如果設(shè)置為1,則顯示可用語音列表 |
| n, nb_samples | 每幀最大采樣數(shù),默認(rèn)值為512 |
| text | 演講的源文本 |
| textfile | 包含文本的文件名 |
| v, voice | 可用的聲音:女 - slt,男 - awb,kal,kal16,rms; 默認(rèn)語音為kal,其采樣率(頻率)為8000 Hz,其他語音使用16000 Hz |
由于flite庫增加了10 MB以上的ffmpeg.exe文件,因此它不在官方二進(jìn)制文件中,而Windows二進(jìn)制文件可以從http://ffmpeg.tv/flite.php下載(Linux和OS X用戶可以編譯它們)。 要顯示可用語音列表,我們可以使用以下命令:
ffmpeg -f lavfi -i flite=list_voices=1
要讓計(jì)算機(jī)使用女性聲音從Message.txt文件中讀取文本,該命令為:
ffplay -f lavfi -i flite=textfile=Message.txt:v=slt
例如,要將文字“Happy New Year to all”保存到wish.wav文件中,我們可以使用以下命令:
ffmpeg -f lavfi -i flite=text="Happy New Year to all":v=kal16 wish.wav
如果我們想減慢講話速度以獲得更好的聽力,我們可以使用以下命令:
ffmpeg -f lavfi -i flite=textfile=text.txt -af atempo=0.5 speech.mp3
一次將輸出保存為多種格式
雖然從第一章中解釋的命令語法可以清楚看出,但我們可以通過一個(gè)命令將處理結(jié)果保存為多種格式,例如我們可以將flite語音引擎的輸出保存為MP3,WAV和WMA 格式在一個(gè)命令中:
ffmpeg -f lavfi -i flite=textfile=speech.txt speech.mp3 speech.wav speech.wma
我們還可以結(jié)合音頻和視頻格式,如果我們從視頻輸入格式指定音頻格式,則只包含音頻流,下一個(gè)示例中的文件clip.mp3只包含音頻流:
ffmpeg -i clip.avi clip.flv clip.mov clip.mp3 clip.mp4 clip.webm

額外的媒體輸入到filtergraph
默認(rèn)情況下,在任何具有-i選項(xiàng)的過濾器之前指定輸入文件,并且第一個(gè)輸入在帶有[in]鏈接標(biāo)簽的過濾器圖中可用。 如果我們想要過濾額外的文件,我們可以使用amovie來源作為視頻文件的音頻和電影來源,它們?cè)诒砀裰忻枋觯?div id="u0z1t8os" class="image-package">



