# DAIN - 深度感知影片畫格插補程式 ## 簡介 DAIN (Depth-Aware Video Frame Interpolation)。AI 影片畫格(幀)插補程式,有以 Vulkan API 實現的版本,支援 AMD、NVIDIA、Intel GPU。 ## 下載 DAIN ncnn Vulkan https://github.com/nihui/dain-ncnn-vulkan ## 使用說明 **基本用法** 輸出 input1.png 與 input2.png 的中間畫面 output.jpg ```powershell dain-ncnn-vulkan -0 input1.png -1 input2.jpg -o output.jpg ``` 輸入目錄 輸出目錄 ```powershell dain-ncnn-vulkan -i input_frames/ -o output_frames/ ``` **選項說明** -h 顯示說明 -v 詳細輸出 -i input-path 設定輸入路徑,可為檔案路徑或目錄。 -o output-path 設定輸入路徑,可為檔案路徑或目錄路徑。 -n num-frame 設定目標影格數量,預設值為輸入的兩倍。 -t tile-size 設定分塊大小,>=32/0皆為自動, 預設為0。使用較小的值來減少 GPU 記憶體使用,預設值為自動。 -g gpu-id 使用 GPU,預設為0。可用 0,1,2 對於多 GPU。 -j load:proc:save 三階段執行續數量 (圖片解碼 + dain 插值 + 圖片編碼)。預設為 1:2:2,使用較大的值可能增加 GPU 使用率與消耗更多 GPU 記憶體。對於小尺寸圖片可用 4:4:4,而大尺寸圖片可用 2:2:2,預設值通常對於大多數情況都不錯。如果發現 GPU 負載很低,則嘗試增加執行續數量以加快處裡。 -f pattern-format 設定輸出的檔名規則與圖片格式 (%08d.jpg/png/webp, 預設為ext/%08d.png),例如`frame-%08d.png` 即 frame-00000000.png,frame-00000001.png, frame-00000002.png, ......。對於 png 格的支援性較好,webp 編碼輸出的檔案則較小,以上兩者皆為無損。 ## 應用 由於 DAIN 不支援影片格式輸入,必須先將影片轉換成連續圖片再用 DAIN 處理圖片,由於是作為暫時的檔案,建議使用建議使用無損格式。最後將處理過的圖片轉成影片,再與片源音訊重新封裝合成新的影片檔即可。以下示範使用 ffmpeg 將影片轉換成圖片再轉回影片。 > 注意:CMD 中使用 %% 表示 %。 基本用法 ffmpeg [options for input] -i inputfile [options for output] outputfile **前置步驟** 由於將影片轉成連續會流失以下訊息: * 顯示寬高比 (Display Aspect Ratio) * 影格速率 (Frame Rate) * 像素格式 (Pixel Format) 檢查 input.mpg 內容: ```powershell ffmpeg -hide_banner -i input.mpg ``` 從主控台輸出訊息找到視訊串流的規格,例如下列這樣: ```text Stream #0:0: Video: mpeg2video, yuv420p, 704x480 [SAR 40:33 DAR 16:9], 24000/1001 fps ``` 記錄下所需的訊息,yuv420p、DAR 16:9、24000/1001 fps,之後會用到。 **影片轉換成連續圖片** 為了方便之後將連續圖片轉換成影片,使用 `-r` 指定任意 fps 轉換為為固定不變的 fps 即 CFR。輸出檔名 `%07d` 為圖片的編號,由 0 起始,往前補 0 為 7 位數。 ```powershell ffmpeg -i input.mpg -r 24000/1001 -f image2 "frames_original\%07d.png" ``` 由於 `yuv420p` 與 png 不相容,ffmpeg 將自動轉換成其他合適格式,以及 png 不支援非 1:1 的 SAR,將輸出錯誤的 DAR (顯示比例): `704x480 [SAR 1:1 DAR 44:30]`。因此,之後將圖片轉回影片時可使用 `-pix_fmt` 與 `-aspect` 選項,來轉換像素格式與強制指定顯示比例。 **插補影格** 假設 png 圖片檔的數量是 35964 目標 fps 值為 60 TargetFrames = SourceFrames * TargetFPS / SourceFPS = 35964 * 60 / (24000 / 1001) = 90000 ```powershell dain-ncnn-vulkan -i frames_original -o frames_doubled -n 90000 ``` 由於圖片的數量變化,之後將圖片轉回影片時必須強制指定 fps 為 60 (而非 24000/1001),以維持正確的播放速度。 **連續圖片轉換成影片** 輸入是連續圖片檔必須使用 `-r` 來強制指定正確的輸入 fps;使用 `-pix_fmt` 轉換像素格式與片源相同;使用 `-aspect` 修正錯誤的顯示比例。對 input.mpg 使用 `-vn` 禁用影像,並使用 `-c:a copy` 複製音訊。 將 frames_doubled 目錄下的 PNG 圖片轉換成影片 ```powershell ffmpeg -f image2 -r 60 -i "frames_doubled\%8d.png" -vn -i input.mpg -c:v libx264 -refs:v 5 -preset:v slower -crf:v 18 -pix_fmt yuv420p -aspect 16/9 -c:a copy output.mkv ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up