前言
在Android音視頻開發中,網上知識點過于零碎,自學起來難度非常大,不過音視頻大牛Jhuster提出了《Android 音視頻從入門到提高 - 任務列表》,結合我自己的工作學習經歷,我準備寫一個音視頻系列blog。本文是音視頻系列blog的其中一個, 對應的要學習的內容是:如何使用FFmpeg命令行進行濾鏡的處理。
音視頻系列blog
音視頻系列blog: 點擊此處跳轉查看.
目錄
1 FFmpeg濾鏡Filter描述格式
1.1 FFmpeg濾鏡Filter的參數排列方式
在FFmpeg中,濾鏡(Filters)是用于處理音頻和視頻流的效果和轉換的工具。濾鏡可以通過一系列的參數來配置其行為。參數排列方式在不同版本的FFmpeg中可能有所不同,但一般情況下,濾鏡的參數可以按照以下方式排列:
ffmpeg -i input.mp4 -vf filter1=value1:param1=value2,filter2=value3:param2=value4 output.mp4
在這里,-vf
是用于指定視頻濾鏡的選項,后面緊跟著一系列的濾鏡和參數。每個濾鏡及其參數都以逗號分隔。例如,假設你想要應用一個調整亮度和對比度的濾鏡,你可以這樣寫:
ffmpeg -i input.mp4 -vf brightness=0.5:contrast=1.2 output.mp4
這里的 brightness
和 contrast
是濾鏡名稱,后面的數字是對應的參數值。參數之間使用冒號分隔。
如果一個濾鏡有多個參數,你可以按照如下方式傳遞它們:
ffmpeg -i input.mp4 -vf filter_name=param1=value1:param2=value2:param3=value3 output.mp4
請注意,濾鏡的參數名和取值根據具體的濾鏡而定,不同的濾鏡可能有不同的參數要求和命名。
對于音頻濾鏡,也可以使用 -af
選項來指定,參數排列方式與視頻濾鏡類似:
ffmpeg -i input.mp3 -af filter1=value1:param1=value2,filter2=value3:param2=value4 output.mp3
需要根據你所使用的具體濾鏡的文檔來了解其參數的正確排列方式。你可以通過在命令行中運行 ffmpeg -filters
來查看所有可用的濾鏡及其參數。
總之,FFmpeg的濾鏡參數排列方式是通過在 -vf
(視頻濾鏡)和 -af
(音頻濾鏡)選項后使用逗號分隔的鍵值對來實現的。
1.2 FFmpeg濾鏡Filter時間內置變量
在FFmpeg中,濾鏡(Filters)可以使用內置的時間相關變量來進行時間相關的操作。這些變量允許你在濾鏡處理過程中訪問和操作輸入流的時間信息。以下是一些常用的時間內置變量:
t
:當前幀的時間戳,以秒為單位。n
:當前幀的索引。pts
:當前幀的顯示時間戳(Presentation Timestamp)。prev_pts
:前一幀的顯示時間戳。start_pts
:輸入流的開始時間戳。prev_selected_pts
:前一幀的顯示時間戳,已通過濾鏡選擇(通常與prev_pts
不同,因為可能會有幀被濾鏡丟棄)。tb
:時間基準(timebase),用于計算時間戳。例如,如果時間基準是1/90000,那么1個時間單位表示1/90000秒。
這些時間內置變量可以在濾鏡鏈中使用,用于創建基于時間的效果、調整播放速度、裁剪、剪輯等操作。以下是一個簡單的示例,演示如何使用時間內置變量來創建一個變速效果:
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" output.mp4
在這個示例中,setpts
濾鏡用于調整每一幀的顯示時間戳,使其變為原來的一半,從而實現視頻的兩倍速播放。
2 FFmpeg為視頻加水印
2.1 文字水印
在FFmpeg中為視頻添加文字水印,可以使用 drawtext
濾鏡。該濾鏡允許你在視頻中指定位置添加自定義文本,并且可以設置字體、顏色、大小等屬性。以下是一個基本示例:
ffmpeg -i input.mp4 -vf "drawtext=text='Your Watermark Text':x=10:y=10:fontsize=24:fontcolor=white" output.mp4
在這個示例中,drawtext
濾鏡被應用于輸入視頻。參數解釋如下:
text
:設置水印文本內容。x
和y
:指定水印的位置,以像素為單位,從左上角計算。fontsize
:設置字體大小。fontcolor
:設置字體顏色。
你可以根據需要進行調整以滿足你的要求。請注意,字體和顏色的名稱、路徑等取決于你系統中的可用字體和顏色設置。
如果你希望水印在視頻的不同時間段內逐漸出現或消失,你可以結合使用時間內置變量來實現。例如,以下示例會在視頻的前5秒內淡入水印:
ffmpeg -i input.mp4 -vf "drawtext=text='Your Watermark Text':x=10:y=10:fontsize=24:fontcolor=white:enable='between(t,0,5)'" output.mp4
在這個示例中,enable
參數用于設置水印的顯示時間范圍。在上述示例中,水印會在時間范圍為0到5秒內逐漸淡入。
2.2 圖片水印
在FFmpeg中為視頻添加圖片水印,可以使用 overlay
濾鏡。這個濾鏡允許你將一個視頻或圖片疊加到另一個視頻上,從而實現水印效果。以下是一個基本的示例:
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" output.mp4
在這個示例中,overlay
濾鏡被用于將 watermark.png
圖片疊加到 input.mp4
視頻上。參數解釋如下:
overlay
:指定水印的位置,以像素為單位。這里的10:10
表示在視頻的左上角添加水印。
你可以根據需要進行調整以滿足你的要求。如果你想要水印在視頻的不同時間段內逐漸出現或消失,你可以結合使用時間內置變量來實現,類似于之前提到的 drawtext
濾鏡的方法。
另外,你可以使用 x
和 y
參數來進一步調整水印的位置,以及使用 alpha
參數來設置水印的透明度。以下是一個更復雜的示例:
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=x=main_w-overlay_w-10:y=10:alpha=0.5" output.mp4
在這個示例中,水印被放置在視頻的右上角,同時設置了透明度為0.5。
3 FFmpeg生成畫中畫
在FFmpeg中生成畫中畫效果,可以使用 overlay
濾鏡。這個濾鏡可以將一個視頻或圖片疊加到另一個視頻上,從而實現畫中畫效果。以下是一個生成畫中畫效果的基本示例:
ffmpeg -i background.mp4 -i overlay.mp4 -filter_complex "[0:v][1:v]overlay=10:10[out]" -map "[out]" output.mp4
在這個示例中,background.mp4
是背景視頻,overlay.mp4
是要疊加的畫中畫視頻。overlay
濾鏡將畫中畫視頻疊加到背景視頻上,并指定了疊加的位置為 (10, 10)
像素。
你可以根據需要對疊加的位置、大小、透明度等進行調整。如果你想要畫中畫在視頻的不同時間段內逐漸出現或消失,你可以結合使用時間內置變量來實現。
另外,你還可以通過設置 x
和 y
參數,以及使用 alpha
參數來調整疊加的位置和透明度。以下是一個更復雜的示例,生成一個放大的畫中畫效果:
ffmpeg -i background.mp4 -i overlay.mp4 -filter_complex "[0:v][1:v]overlay=x=(main_w-overlay_w)/2:y=(main_h-overlay_h)/2:zoom=2:alpha=0.5[out]" -map "[out]" output.mp4
在這個示例中,zoom
參數設置為2,使得畫中畫視頻放大兩倍,同時 alpha
參數設置為0.5,使得畫中畫具有一定的透明度。
4 FFmpeg視頻多宮格處理
要在FFmpeg中進行視頻多宮格處理,也就是將多個視頻并排或縱向排列在一個畫面中,你可以使用 tile
濾鏡。這個濾鏡可以將多個輸入視頻分割并排列在一個畫面中。以下是一個基本的示例:
ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -filter_complex "[0:v][1:v][2:v]tile=3x1" output.mp4
在這個示例中,input1.mp4
、input2.mp4
和 input3.mp4
是要合并的多個輸入視頻。tile
濾鏡將這三個視頻按照3列1行的形式排列在一起。
你可以根據需要進行調整,比如改變排列的行數和列數,以及調整間隔等。如果輸入視頻的大小不同,你可能還需要進行尺寸調整以確保宮格處理后的輸出視頻大小是一致的。
以下是一個更復雜的示例,將四個輸入視頻按照2行2列的形式排列,并在每個視頻之間添加一些間隔:
ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -i input4.mp4 -filter_complex "[0:v][1:v][2:v][3:v]tile=2x2:margin=10" output.mp4
在這個示例中,margin
參數用于設置視頻之間的間隔。
5 FFmpeg音頻流濾鏡操作
5.1 雙聲道、單聲道,雙音頻流概念
當涉及音頻處理時,雙聲道、單聲道和雙音頻流是一些基本的概念。先簡單的介紹一下它們:
- 雙聲道(Stereo):
雙聲道是一種音頻格式,它模擬了我們兩只耳朵的聽覺感受。你可以將其想象為音樂或聲音從不同的方向傳入,就像你左耳聽到的聲音可能略有不同于右耳聽到的聲音。這種分離讓你能夠更好地感知聲音的位置和空間。在雙聲道音頻中,通常會有兩個聲道,一個代表左聲道,另一個代表右聲道。這使得音頻更具層次感和立體感。 - 單聲道(Mono):
單聲道是一種音頻格式,其中所有聲音都混合在一個聲道中。這意味著不會有左右聲道的分離,所有聲音都在一個平面上。你可以將其想象為聲音似乎來自于一個唯一的方向。單聲道通常用于廣播、電話等場景,因為它更簡單且易于處理。 - 雙音頻流:
雙音頻流是指一個視頻文件中包含兩個獨立的音頻流。這兩個音頻流可以分別是不同的聲道,例如一個用于音樂,另一個用于配音。當你播放這樣的視頻時,你通常可以在設置中選擇要聽的音頻流,或者在播放時切換音頻流。這在多語言環境或者需要混合不同聲音的情況下非常有用。
總之,雙聲道提供了立體聲音的感覺,單聲道將所有聲音混合在一起,而雙音頻流則允許在一個視頻中包含多個獨立的音頻流。這些概念有助于我們更好地理解和處理不同類型的音頻。
5.2 雙聲道合并單聲道
在FFmpeg中,可以使用 amix
音頻濾鏡來將兩個單聲道音頻流合并成一個雙聲道音頻流。這個濾鏡允許你在時間上混合多個音頻流。以下是一個將兩個單聲道音頻合并成雙聲道音頻的示例:
ffmpeg -i input_mono1.wav -i input_mono2.wav -filter_complex "[0:a][1:a]amix=inputs=2:duration=first:dropout_transition=2" output_stereo.wav
在這個示例中,input_mono1.wav
和 input_mono2.wav
是兩個單聲道音頻文件。amix
濾鏡將這兩個音頻流合并成一個雙聲道音頻文件。
參數解釋如下:
inputs
:設置輸入的音頻流數量,這里是2。duration
:指定合并后音頻流的持續時間,這里選擇第一個輸入流的持續時間。dropout_transition
:設置混合過渡的時間,這里是2秒。這個參數可以調整,以平滑地過渡從一個聲道到另一個聲道。
你可以根據需要進行調整,以適應不同的音頻文件和要求。請注意,amix
濾鏡適用于將單聲道音頻合并成雙聲道音頻。
5.3 雙聲道提取
在FFmpeg中,可以使用 pan
音頻濾鏡來從雙聲道音頻流中提取單聲道音頻。這個濾鏡允許你調整聲道的分布,從而提取所需的聲道。以下是一個將雙聲道音頻中的左聲道提取為單聲道音頻的示例:
ffmpeg -i input_stereo.wav -filter_complex "[0:a]pan=1c|c0=c0[a]" -map "[a]" output_mono_left.wav
在這個示例中,input_stereo.wav
是一個雙聲道音頻文件。pan
濾鏡將左聲道提取為一個單聲道音頻文件。
參數解釋如下:
pan
:指定聲道的調整。這里使用1c|c0=c0
來提取左聲道的內容。-map
:用于選擇濾鏡處理后的音頻流。
可以根據需要進行調整,以提取右聲道或者其他聲道的內容。
5.4 雙聲道轉雙音頻流
在FFmpeg中,可以使用 channelsplit
音頻濾鏡來將雙聲道音頻流拆分為兩個獨立的音頻流,從而生成雙音頻流。以下是一個將雙聲道音頻流轉換為雙音頻流的示例:
ffmpeg -i input_stereo.wav -filter_complex "[0:a]channelsplit=channel_layout=stereo[a1][a2]" -map "[a1]" output_left.wav -map "[a2]" output_right.wav
在這個示例中,input_stereo.wav
是一個雙聲道音頻文件。channelsplit
濾鏡將左聲道和右聲道拆分為兩個獨立的音頻流。
參數解釋如下:
channelsplit
:用于拆分聲道。channel_layout
:指定拆分的聲道布局。這里使用stereo
表示雙聲道。
通過 -map
參數,可以將拆分后的左聲道音頻流和右聲道音頻流分別保存到不同的輸出文件中。
5.5 單聲道轉雙聲道
在FFmpeg中,可以使用 pan
音頻濾鏡來將單聲道音頻流轉換為雙聲道音頻流。這個濾鏡可以讓你在不同的聲道中復制或調整聲音。以下是一個將單聲道音頻轉換為雙聲道音頻的示例:
ffmpeg -i input_mono.wav -filter_complex "[0:a]pan=stereo|c0=c0|c1=c0[a]" -map "[a]" output_stereo.wav
在這個示例中,input_mono.wav
是一個單聲道音頻文件。pan
濾鏡將單聲道音頻轉換為雙聲道音頻,其中左聲道和右聲道都使用單聲道音頻的內容。
參數解釋如下:
pan
:用于調整聲道分布。這里使用stereo|c0=c0|c1=c0
來復制單聲道的內容到左右聲道。
通過 -map
參數,可以將處理后的雙聲道音頻流保存到輸出文件中。
5.6 兩個音頻源合并雙聲道
在FFmpeg中,可以使用 amerge
音頻濾鏡來將兩個音頻源合并成一個雙聲道音頻流。這個濾鏡用于將多個音頻流混合在一起。以下是一個將兩個音頻源合并為雙聲道音頻的示例:
ffmpeg -i input_audio1.wav -i input_audio2.wav -filter_complex "[0:a][1:a]amerge=inputs=2[a]" -map "[a]" output_stereo.wav
在這個示例中,input_audio1.wav
和 input_audio2.wav
是兩個音頻文件。amerge
濾鏡將這兩個音頻流混合成一個雙聲道音頻文件。
參數解釋如下:
amerge
:用于混合音頻流。inputs
:指定輸入的音頻流數量,這里是2。
通過 -map
參數,可以將混合后的雙聲道音頻流保存到輸出文件中。
5.7 多個音頻合并為多聲道
在FFmpeg中,可以使用 amerge
音頻濾鏡來將多個音頻合并成一個多聲道音頻流。這個濾鏡允許你將多個音頻流混合在一起,生成具有多個聲道的音頻。以下是一個將三個音頻源合并為一個三聲道音頻的示例:
ffmpeg -i input_audio1.wav -i input_audio2.wav -i input_audio3.wav -filter_complex "[0:a][1:a][2:a]amerge=inputs=3[a]" -map "[a]" output_3channel.wav
在這個示例中,input_audio1.wav
、input_audio2.wav
和 input_audio3.wav
是三個音頻文件。amerge
濾鏡將這三個音頻流混合成一個三聲道音頻文件。
參數解釋如下:
amerge
:用于混合音頻流。inputs
:指定輸入的音頻流數量,這里是3。
通過 -map
參數,你可以將混合后的多聲道音頻流保存到輸出文件中。請注意,混合多個音頻為多聲道時,確保輸入的音頻文件的聲道數和聲道布局是一致的,這樣才能得到正確的多聲道音頻。
6 FFmpeg音頻音量探測
6.1 音頻音量獲得
在FFmpeg中,可以使用 volumedetect
音頻濾鏡來探測音頻的音量級別。這個濾鏡允許你獲取音頻流的音量信息,以便進一步分析或處理。以下是一個獲取音頻音量的示例:
ffmpeg -i input_audio.wav -af "volumedetect" -vn -f null /dev/null
在這個示例中,input_audio.wav
是音頻文件。volumedetect
濾鏡會分析音頻流的音量信息。
參數解釋如下:
-af "volumedetect"
:將volumedetect
濾鏡應用于音頻流。-vn
:禁用視頻流。-f null /dev/null
:將輸出重定向到空設備,因為我們只關心音量信息而不需要實際輸出文件。
運行命令后,你會在輸出中看到類似以下的信息:
[Parsed_volumedetect_0 @ 0x7fcb44a03dc0] mean_volume: -24.0 dB
[Parsed_volumedetect_0 @ 0x7fcb44a03dc0] max_volume: -15.0 dB
[Parsed_volumedetect_0 @ 0x7fcb44a03dc0] histogram_15db: 5
[Parsed_volumedetect_0 @ 0x7fcb44a03dc0] histogram_14db: 11
這些行中的 mean_volume
是平均音量的值,max_volume
是最大音量的值。值越小,音量越低。你可以根據需要將這些值用于進一步的音量分析或處理。
請注意,音量值是以負分貝(dB)為單位表示的。如果需要將這些值轉換為正分貝或其他音量單位,可以使用相應的數學轉換公式。
6.2 繪制音頻波形
要在FFmpeg中繪制音頻波形,可以使用 showwaves
音頻濾鏡。這個濾鏡允許你在視頻中繪制音頻波形圖,以可視化音頻的振幅變化。以下是一個繪制音頻波形的示例:
ffmpeg -i input_audio.wav -filter_complex "[0:a]showwaves=s=1280x720:colors=red:mode=line" -frames:v 1 output_waveform.png
在這個示例中,input_audio.wav
是音頻文件。showwaves
濾鏡將在一個幀中繪制音頻波形。
參數解釋如下:
s=1280x720
:設置波形圖的分辨率為1280x720像素。colors=red
:設置波形圖的顏色為紅色。mode=line
:設置波形圖的顯示模式為線性波形。
通過 -frames:v 1
參數,你可以生成一個幀,然后將波形圖保存為輸出圖片文件 output_waveform.png
。
運行命令后,你會得到一個繪制了音頻波形的圖片文件。請注意,showwaves
濾鏡提供了許多其他的參數和選項,你可以根據需要進行調整以獲得不同的波形效果。如果想要在視頻中繪制音頻波形,可以使用類似的方法,只需將濾鏡應用到視頻流而不是圖像幀上。
7 FFmpeg為視頻加字幕
7.1 什么是ASS字幕流
ASS字幕流是一種高級的字幕格式,全名是"Advanced SubStation Alpha"。它與普通的字幕文件(如SRT格式)相比,提供了更多的樣式和特效選項,使字幕看起來更加漂亮和富有創意。
想象一下,你在看電影或視頻時,會出現在屏幕上方或下方的文字,這些文字是為了幫助你理解說話內容或提供其他信息的。ASS字幕就是一種能夠讓這些文字變得更豐富多彩的方式。
ASS字幕流不僅可以顯示文字,還可以調整字幕的字體、顏色、大小、位置等。甚至可以為字幕添加動畫、漸變效果、陰影和描邊,讓字幕看起來更生動。這就像是在電影中添加了一層視覺效果,讓字幕更好看、更有趣。
因此,ASS字幕流是一種讓電影和視頻中的字幕更有個性、更具吸引力的方式,通過使用它,字幕可以成為視頻內容的一部分,增加了觀眾的體驗。
7.2 ASS字幕流寫入視頻流
在FFmpeg中,要將ASS字幕流寫入視頻流,可以使用 ass
濾鏡。這個濾鏡可以將ASS字幕疊加到視頻上,使得字幕成為視頻的一部分。以下是一個將ASS字幕流寫入視頻流的示例:
ffmpeg -i input.mp4 -vf "ass=subtitle.ass" output_with_subtitles.mp4
在這個示例中,input.mp4
是視頻文件,subtitle.ass
是ASS字幕文件。ass
濾鏡將ASS字幕疊加到視頻上。
參數解釋如下:
subtitle.ass
:指定ASS字幕文件的路徑和名稱。
你可以根據需要調整字幕的樣式、位置、字體、大小等,這些都可以在ASS字幕文件中設置。要了解更多關于ASS字幕文件的設置和樣式,你可以查閱相關的ASS字幕格式文檔。
請注意,ASS字幕文件需要符合ASS字幕格式,這種格式允許你在字幕文件中指定字幕的樣式、特效和動畫。
7.3 ASS字幕流寫入封裝容器
將ASS字幕流寫入封裝容器(例如MKV、MP4)需要使用一些特殊的選項。在FFmpeg中,可以使用 -c:s
參數來指定字幕流的編碼器,并使用 -scodec
參數來指定字幕流的編碼器類型。以下是一個將ASS字幕流寫入MKV封裝容器的示例:
ffmpeg -i input.mp4 -i subtitle.ass -c:s mov_text output_with_subtitles.mkv
在這個示例中,input.mp4
是視頻文件,subtitle.ass
是ASS字幕文件。-c:s mov_text
參數指定使用 mov_text
編碼器來寫入字幕流。
要將字幕寫入其他封裝容器,你可以更換 -c:s
參數中的編碼器類型。例如,對于MP4封裝容器,你可以使用 srt
編碼器:
ffmpeg -i input.mp4 -i subtitle.ass -c:s srt output_with_subtitles.mp4
參數解釋如下:
-c:s
:用于指定字幕流的編碼器。mov_text
或srt
:分別是MKV和MP4封裝容器所使用的字幕編碼器。
通過這樣的方式,可以將ASS字幕流寫入封裝容器中。?
8 FFmpeg視頻摳圖合并
摳圖合并是指將一個視頻中的某個部分(如人物、物體等)摳出,然后將其合并到另一個視頻或背景中。這通常用于實現特殊效果,比如把一個人物放到不同的背景中,創造出虛擬場景。
要在FFmpeg中實現視頻摳圖合并,通常需要以下步驟:
- 視頻摳圖:首先,你需要通過使用類似于
chromakey
或colorkey
濾鏡來摳出視頻中的部分。這些濾鏡可以根據顏色信息將特定顏色范圍的區域摳出。例如,如果你要摳出一個綠色背景的人物,你可以使用chromakey
濾鏡。 - 背景視頻:你需要準備一個背景視頻,這是摳出的部分將要合并的地方。
- 合并:使用
overlay
濾鏡將摳出的部分疊加到背景視頻上。這個濾鏡可以控制疊加的位置、大小等。
以下是一個基本的示例,展示了如何將摳圖后的人物疊加到背景視頻中:
ffmpeg -i person.mp4 -i background.mp4 -filter_complex "[0:v]chromakey=green:0.1:0.2 [chroma]; [1:v][chroma]overlay[out]" -map "[out]" output_merged.mp4
在這個示例中,person.mp4
是包含綠色背景的人物視頻,background.mp4
是背景視頻。chromakey
濾鏡用于摳圖,然后使用 overlay
濾鏡將摳圖后的人物疊加到背景上。
9 FFmpeg 3D視頻處理
9.1 stereo3d處理3D視頻
在FFmpeg中,可以使用 stereo3d
濾鏡來處理3D視頻,包括將單個視頻轉換為3D格式、調整3D效果以及將3D視頻轉換回2D。以下是一些 stereo3d
濾鏡的用法示例:
- 將單個視頻轉換為3D格式:
ffmpeg -i input.mp4 -vf "stereo3d=al:sbsl" output_3d.mp4
在這個示例中,input.mp4
是輸入視頻文件。stereo3d
濾鏡將視頻轉換為3D格式。參數 al:sbsl
表示將左眼圖像放在左邊,右眼圖像放在右邊。
- 調整3D效果:
你可以使用不同的參數來調整3D效果,例如調整眼距和視差。下面是一個示例:
ffmpeg -i input_3d.mp4 -vf "stereo3d=sbsr:eyepar=4:width=1920" output_adjusted_3d.mp4
在這個示例中,input_3d.mp4
是一個3D視頻文件。stereo3d
濾鏡使用參數 sbsr
表示將右眼圖像放在左邊,eyepar
參數用于調整眼距,width
參數指定輸出視頻的寬度。
- 將3D視頻轉換回2D:
如果你想將3D視頻轉換回2D,你可以使用以下示例:
ffmpeg -i input_3d.mp4 -vf "stereo3d=abl" output_2d.mp4
在這個示例中,input_3d.mp4
是一個3D視頻文件。stereo3d
濾鏡使用參數 abl
表示只保留左眼圖像,從而將3D視頻轉換為2D。
請注意,stereo3d
濾鏡有許多不同的參數,可以用于不同的3D效果和轉換。
9.2 3D圖像轉換舉例
在FFmpeg中,可以使用 stereo3d
濾鏡來處理3D圖像,包括將單個圖像轉換為3D格式、調整3D效果以及將3D圖像轉換回2D。以下是一些 stereo3d
濾鏡的用法示例:
- 將單個圖像轉換為3D格式:
ffmpeg -i input.jpg -vf "stereo3d=al:sbsl" output_3d.jpg
在這個示例中,input.jpg
是輸入圖像文件。stereo3d
濾鏡將圖像轉換為3D格式。參數 al:sbsl
表示將左眼圖像放在左邊,右眼圖像放在右邊。
- 調整3D效果:
你可以使用不同的參數來調整3D效果,例如調整眼距和視差。下面是一個示例:
ffmpeg -i input_3d.jpg -vf "stereo3d=sbsr:eyepar=4:width=1920" output_adjusted_3d.jpg
在這個示例中,input_3d.jpg
是一個3D圖像文件。stereo3d
濾鏡使用參數 sbsr
表示將右眼圖像放在左邊,eyepar
參數用于調整眼距,width
參數指定輸出圖像的寬度。
- 將3D圖像轉換回2D:
如果你想將3D圖像轉換回2D,你可以使用以下示例:
ffmpeg -i input_3d.jpg -vf "stereo3d=abl" output_2d.jpg
在這個示例中,input_3d.jpg
是一個3D圖像文件。stereo3d
濾鏡使用參數 abl
表示只保留左眼圖像,從而將3D圖像轉換為2D。
這些示例演示了如何在FFmpeg中使用 stereo3d
濾鏡來處理3D圖像,可以根據需要進行調整。
10 FFmpeg定時視頻截圖
10.1 vframe參數截取一張圖片
在FFmpeg中,可以使用 -vframes
參數來指定要截取的幀數,從而截取視頻中的一張或多張圖片。以下是一個截取一張圖片的示例:
ffmpeg -i input.mp4 -vframes 1 output.jpg
在這個示例中,input.mp4
是輸入視頻文件,output.jpg
是輸出圖片文件。-vframes 1
參數表示只截取一幀,即一張圖片。
如果你想要在特定的時間點截取一張圖片,你可以使用 -ss
參數來指定時間點。例如,要在視頻的第10秒處截取一張圖片,可以這樣做:
ffmpeg -i input.mp4 -ss 00:00:10 -vframes 1 output.jpg
在這個示例中,-ss 00:00:10
參數表示從視頻的第10秒開始截取。
請注意,使用 -vframes
參數來截取圖片會非常快速,因為它只截取指定數量的幀而不需要完整地解碼整個視頻。這使得截取圖片變得非常高效。
如果你想要截取多張圖片,只需將 -vframes
參數的值設置為所需的幀數即可。
10.2 fps濾鏡定時獲得圖片
要在特定的時間間隔內從視頻中定時獲取圖片,可以使用 fps
濾鏡。這個濾鏡允許你以指定的幀率從視頻流中獲取幀,然后保存為圖片。以下是一個根據指定的幀率定時獲取圖片的示例:
ffmpeg -i input.mp4 -vf "fps=1/5" -vsync 0 output_%03d.jpg
在這個示例中,input.mp4
是輸入視頻文件。fps=1/5
濾鏡指定了幀率為每秒5幀,這樣就會定時每隔0.2秒從視頻中獲取一幀。-vsync 0
參數禁用了同步幀處理,以確保準確的幀率。
output_%03d.jpg
表示輸出圖片的文件名,%03d
表示用三位數字來編號輸出圖片文件。這會生成類似 output_001.jpg
、output_002.jpg
等的文件名。
通過這個命令,你將會定時每隔0.2秒從視頻中獲取一幀,并將其保存為圖片。你可以根據需要調整幀率、文件名模式和輸出圖片格式。
如果你需要更多的定時控制,你也可以結合使用 -ss
參數來指定起始時間點。例如,要從視頻的第10秒開始,每隔1秒獲取一幀,你可以這樣做:
ffmpeg -i input.mp4 -vf "fps=1" -ss 10 -vsync 0 output_%03d.jpg
通過調整參數,你可以實現不同時間間隔的定時截圖操作。
11 FFmpeg生成測試元數據
11.1 FFmpeg生成音頻測試流
要在FFmpeg中生成音頻測試流,可以使用 aevalsrc
音頻濾鏡。這個濾鏡允許你生成包含特定音頻模式和聲音的音頻流。以下是一個生成音頻測試流的示例:
ffmpeg -f lavfi -i "aevalsrc=sin(400*2*PI*t):d=5" -c:a pcm_s16le output.wav
在這個示例中,aevalsrc
濾鏡用于生成一個包含正弦波的音頻流。參數解釋如下:
sin(400*2*PI*t)
:這是正弦波的表達式,其中 400 是頻率(赫茲),2*PI 是周期,t
是時間。d=5
:表示音頻持續時間為5秒。
通過 -c:a pcm_s16le
參數,你可以指定音頻流的編碼格式為16位線性PCM。最后,將生成的音頻流保存為輸出文件 output.wav
。
這個示例生成了一個包含特定頻率和持續時間的音頻測試流。
11.2 FFmpeg生成視頻測試流
要在FFmpeg中生成視頻測試流,可以使用 testsrc
視頻源濾鏡。這個濾鏡允許你生成不同類型的測試圖像和圖案,用于視頻流的測試和調試。以下是一個生成視頻測試流的示例:
ffmpeg -f lavfi -i testsrc=duration=5:size=1280x720:rate=30 output.mp4
在這個示例中,testsrc
濾鏡用于生成一個測試視頻流。參數解釋如下:
duration=5
:表示視頻的持續時間為5秒。size=1280x720
:設置視頻分辨率為1280x720像素。rate=30
:設置視頻幀率為30幀/秒。
通過 -f lavfi
參數,你可以指定輸入為lavfi(libavfilter)源。最后,將生成的視頻流保存為輸出文件 output.mp4
。
這個示例生成了一個包含測試圖像的視頻測試流。你可以根據需要調整分辨率、幀率和其他參數來生成不同類型的測試圖像。 ?
12 FFmpeg對音視頻倍速處理
12.1 atempo音頻倍速處理
在FFmpeg中,你可以使用 atempo
音頻濾鏡來進行音頻的倍速處理,即加快或減慢音頻的播放速度。這個濾鏡可以用于在不改變音調的情況下調整音頻的播放速度。以下是一個使用 atempo
濾鏡的示例:
ffmpeg -i input.mp3 -filter:a "atempo=1.5" output_fast.mp3
在這個示例中,input.mp3
是輸入音頻文件。atempo=1.5
濾鏡參數表示將音頻的播放速度加快到原速度的1.5倍。
如果你想要將音頻的播放速度減慢,可以使用小于1的值,例如 atempo=0.8
表示將音頻的播放速度減慢到原速度的0.8倍。
請注意,使用 atempo
濾鏡可以改變音頻的播放速度,但不會改變音頻的音調。但是,過于快速或減慢音頻可能會導致音頻失真或質量下降,所以在調整倍速時需要注意音質。 ?
12.2 setpts視頻倍速處理
在FFmpeg中,可以使用 setpts
視頻濾鏡來進行視頻的倍速處理,即加快或減慢視頻的播放速度。這個濾鏡可以用于在不改變音頻的情況下調整視頻的播放速度。以下是一個使用 setpts
濾鏡的示例:
ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" output_fast.mp4
在這個示例中,input.mp4
是輸入視頻文件。setpts=0.5*PTS
濾鏡參數表示將視頻的播放速度加快到原速度的2倍(0.5倍的PTS意味著播放速度加快為2倍)。
如果你想要將視頻的播放速度減慢,可以使用大于1的值,例如 setpts=2*PTS
表示將視頻的播放速度減慢為原速度的一半。
需要注意的是,使用 setpts
濾鏡可以改變視頻的播放速度,但不會改變音頻的播放速度。
?