《FFmpeg Basics》中文版-23- 先進(jìn)的技術(shù)點(diǎn)

寫在前面

如果您對(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ù)

移除掉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 
    
  • 顯示效果(水印沒了):

水印沒了.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信息截圖如下:
log.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

過濾器blackdetectblackframe類似,但每個(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
  • 顯示效果如圖:

語音合成

通過包含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">
描述 從媒體(電影)容器讀取音頻和/或視頻流。 必需參數(shù)是媒體文件的文件名,可選鍵=值對(duì)由冒號(hào)分隔
語法 movie=video_name[:options]
amovie=audio_name[:options]
Available key = 值選項(xiàng)參數(shù)中的值對(duì)
f, format_name 視頻容器或輸入設(shè)備的格式,如果未指定,則從擴(kuò)展名確定或者探測(cè)
loop 按順序讀取數(shù)據(jù)流的次數(shù),如果為-1,則選擇最佳視頻(具有amovie的音頻)數(shù)據(jù)流
sp, seek_point 以秒為單位查找點(diǎn),如果設(shè)置,則輸入從給定時(shí)間開始
s, streams - 要選擇的流,用+符號(hào)指定多個(gè)流,順序很重要
- 特殊名稱dv(電影)和da(amovie)指定默認(rèn)(最佳)視頻/音頻流
- 第一章介紹了如何指定特定流的語法
si, stream_index 要讀取的流的索引,如果為-1,則選擇最佳流,這是默認(rèn)值(不建議使用,s參數(shù)為首選)

例如,要在輸入視頻上顯示徽標(biāo),我們可以使用以下命令:

ffmpeg -i video.mpg -vf movie=logo.png[a];[in][a]overlay video1.mp4

我的測(cè)試命令:

ffmpeg -i /Users/zhangfangtao/Desktop/test.mp4 -vf "movie=/Users/zhangfangtao/Desktop/fruit.jpg[a];[in][a]overlay" /Users/zhangfangtao/Desktop/test3.mp4

*顯示效果(logo太大了,把視頻蓋住了):


例如,sp(seek_point)選項(xiàng)設(shè)置為5時(shí),徽標(biāo)將從開始5秒后顯示:

ffmpeg -i video.mpg -vf movie=logo.png:sp=5[a];[in][a]overlay video1.mp4

我的測(cè)試命令:

 ffmpeg -i /Users/zhangfangtao/Desktop/001.mp4 -vf "movie=/Users/zhangfangtao/Desktop/fruit.jpg:sp=0[a];[in][a]overlay" /Users/zhangfangtao/Desktop/test3.mp4
  • 報(bào)錯(cuò):
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容