# [FFmpeg] 子母畫面、多重畫面、浮水印 ## 說明 若要製作實作 子母畫面 (PIP) 或 多重畫面 (PBP) 可以使用 `overlay` 篩選器,`overlay` 的功能是將一個輸入影像與另一個輸入影像重疊合成一個影像輸出,通過控制每個輸入影像在輸出畫面的座標即可實現 PIP 與 PBP。 ## 子母畫面 (PIP) 若要製作子母畫面 (PIP),可以使用 `scale` 篩選器將副畫面縮小後用 `overlay` 篩選器將它覆蓋至主畫面某處作為子畫面。 例如將第二個(#1)輸入檔的影像寬高都縮小為 1/4 然後覆蓋到第一個(#0)輸入檔的影像,也就是 `1:v` 作為子畫面而 `0:v` 作為主畫面,並使子畫面距離左邊界與上邊界各 16 像素: 篩選器流程圖: ```powershell [1:v]scale='w=iw/4:h=ih/4'[pip],[0:v][pip]overlay='x=16:y=16' ``` FFmpeg 將持續輸出影片至主畫面與子畫面都結束時才停止。若要使主畫面結束同時也停止輸出,可使用 `shortest=1` 選項。 承上,在主畫面結束同時停止輸出: ```powershell [1:v]scale='w=iw/4:h=ih/4'[pip],[0:v][pip]overlay='x=16:y=16:shortest=1' ``` 又或者對子畫面輸入影片使用 `-t` 或 `-to`,指定持續時間。假設主畫面影像的長度為 05:30,則對第子畫面輸入影片使用 `-t 05:30` 或 `-to 05:30`。 承上,使用 `-t` 或 `-to`,指定子畫面的持續時間。完整命令如下: ```powershell ffmpeg -i input.mkv -t 05:30 -i input_1.mkv -filter_complex "[1:v]scale='w=iw/4:h=ih/4'[pip],[0:v][pip]overlay='x=16:y=16:shortest=1'" output.mkv ``` > x, y 參數包含這些常數: `main_w main_h` `overlay_w overlay_h`,你可以使用這些常數來寫出計算式作為 x 或 y 的設定值。 承上,若要使子畫面距離右邊界與下邊界各 16 像素,則令 x 為主畫面寬度減去子畫面寬度與16,y 為主畫面高度減去子畫面高度與16。 承上,令子畫面距離右邊界與下邊界各 16 像素: ```powershell ffmpeg -i input.mkv -i input_1.mkv -filter_complex "[1:v]scale='w=iw/4:h=ih/4'[pip],[0:v][pip]overlay='x=main_w-overlay_w-16:y=main_h-overlay_h-16:shortest=1'" output.mkv ``` ## 子畫面時間軸控制與淡入/淡出 ### 控制子畫面顯示時間 若要控制子畫面的顯示與結束時間可以使用 `enable` 選項。若要在 00:10 - 01:30 顯示子畫面,並播放輸入的 00:10 - 01:30,則設定值使用 `between(t,10,90)`。 篩選器流程圖: ```powershell [0:v][1:v]overlay='enable=between(t,10,90)' ``` > 主畫面與子畫面輸入影像會被同時解碼,在輸出到達 `00:10` 之前只會使用主畫面輸入影像直接輸出,到達 `00:10` 才會啟用 `overlay` 篩選器覆蓋作業,即開啟子畫面並從輸入的 `00:10` 開始播放。在輸出到達 01:30 後,`overlay` 篩選器會停止覆蓋作業,即關閉了子畫面。 ### 控制輸出影片結束時機 在子畫面關閉後,FFmpeg 依然會繼讀取子畫面輸入影片到結束,這可能導致主畫面結束後 FFmpeg 依然持續輸出。使用 `overlay` 的 `shortest=1` 選項,使主畫面結束同時停止輸出。或者對子畫面的輸入影片使用 `-t` 或 `-to`,使 `overlay` 停止覆蓋作業時也停止讀取子畫面輸入影片。 承上,在主畫面影像結束時停止輸出。完整命令如下: ```powershell ffmpeg -i input.mkv -i input_1.mkv -filter_complex "[0:v][1:v]overlay='enable=between(t,10,90):shortest=1'" output.mkv ``` 或者使用 `-t` 停止讀取輸入在指定長度: ```powershell ffmpeg -i input.mkv -t 01:30 -i input_1.mkv -filter_complex "[0:v][1:v]overlay='enable=between(t,10,90)'" output.mkv ``` ### 控制子畫面播放起點 若要使子畫面在開啟時,從輸出影像的起點開始播放,則可以對輸入使用 `-itsoffset` 選項,延後輸入影像的時間與 `overlay` 的啟動時間相同。 承上,在 00:10 時開啟子畫面,從頭開始播放: ```powershell ffmpeg -i input.mkv -itsoffset 00:10 -i input_1.mkv -filter_complex "[0:v][1:v]overlay='enable=between(t,10,90):shortest=1'" output.mkv ``` ```powershell ffmpeg -i input.mkv -itsoffset 00:10 -t 01:20 -i input_1.mkv -filter_complex "[0:v][1:v]overlay='enable=between(t,10,90)'" output.mkv ``` ### 淡入淡出 當使用淡出功能隱藏子畫面時,由於淡出並不會結束影像,若想要在主畫面結束同時停止輸出,必須設定 `overlay` 的 `shortest=1` 選項。不能使用 `-t` 或 `-to` 指定子畫面的結束時間,因為會導致淡出功能無法正常工作,無論指定任何時間點。 承上,在子畫面開始與結束時使用 0.5 秒淡入與淡出效果: ```powershell ffmpeg -i input.mkv -itsoffset 00:10 -i input_1.mkv -filter_complex "[1:v]fade='st=10:d=0.5',fade='t=out:st=89.5:d=0.5'[pip],[0:v][pip]overlay='enable=between(t,10,90):shortest=1'" output.mkv ``` ## 浮水印 (Watermark) 如果要將要圖片烙印到輸出畫面上作為浮水印,同樣也可用 `overlay` 篩選器將輸入圖片覆蓋到主畫面之上即可。 完整的命令如下: ```powershell ffmpeg -i input.mp4 -i logo.png -filter_complex "[0:v][1:v]overlay='x=main_w-overlay_w-16:y=16'" output.mp4 ``` 承上,控制浮水印顯示時間 00:10 - 01:30: ```powershell ffmpeg -i input.mp4 -loop 1 -itsoffset 10 -t 01:20 -i logo.png -filter_complex "[0:v][1:v]overlay='x=main_w-overlay_w-16:y=16:enable=between(t,10,90)'" output.mp4 ``` 承上,控制顯示時間 00:10 - 01:30,0.5 秒淡入、淡出效果: ```powershell ffmpeg -i input.mp4 -loop 1 -i logo.png -filter_complex "[1:v]fade='st=10:d=0.5',fade='t=out:st=89.5:d=0.5'[logo],[0:v][logo]overlay='x=main_w-overlay_w-16:y=16:shortest=1'" output.mp4 ``` ## 多重畫面 (PBP) 如果要做出2x2多重畫面的效果,可以用 `nullsrc` 篩選器建立一個空白影像,並使用 `scale` 篩選器將輸入片源的寬高都縮放為空白影像的 1/2,然後使用 `overlay` 篩選器將4個輸入片源分別覆蓋在左上方、右上方、左下方、右下方。 完整的命令例如這樣: ```powershell ffmpeg -i input1.m2ts -i input2.m2ts -i input3.m2ts -i input4.m2ts -filter_complex "nullsrc='size=1280x720'[base],[0:v]scale='640x360'[upperleft],[1:v]scale='640x360'[upperright],[2:v]scale='640x360'[lowerleft],[3:v]scale='640x360'[lowerright],[base][upperleft] overlay='shortest=1'[tmp1],[tmp1][upperright]overlay='x=640'[tmp2],[tmp2][lowerleft] overlay='y=360'[tmp3],[tmp3][lowerright]overlay='x=640:y=360'" output.mkv ``` > 注意:必須使用 `shortest=1` 來避免無限空白影像。 ## 篩選器流程圖腳本 篩選器流程圖腳本允許將冗長的篩選器流程圖分行,以方便閱讀與編輯。 承上,篩選器流程圖腳本 (pbp_2x2.txt) 如下: ```txt nullsrc = 'size = 1280x720' [base], [0:v] scale = '640x360' [upperleft], [1:v] scale = '640x360' [upperright], [2:v] scale = '640x360' [lowerleft], [3:v] scale = '640x360' [lowerright], [base][upperleft] overlay = 'shortest = 1' [tmp1], [tmp1][upperright] overlay = 'x = 640' [tmp2], [tmp2][lowerleft] overlay = 'y = 360' [tmp3], [tmp3][lowerright] overlay = 'x = 640: y=360' ``` 腳本使用方式: ```powershell ffmpeg -i input1.m2ts -i input2.m2ts -i input3.m2ts -i input4.m2ts -filter_complex_script pbp_2x2.txt output.mkv ``` ###### tags: `ffmpeg`