109 lines
4.9 KiB
Markdown
109 lines
4.9 KiB
Markdown
# Stitch-InBetween.ps1
|
|
|
|
Generates interpolated in-between frames between two images using RIFE and encodes them into a video.
|
|
|
|
## Synopsis
|
|
|
|
Uses `rife-ncnn-vulkan` to interpolate frames between a first and last image, then encodes the result into an H.264 video using ffmpeg.
|
|
|
|
The script:
|
|
|
|
1. Validates that the input image files exist
|
|
2. Creates a dedicated temporary directory for input images
|
|
3. Copies the first and last images to the dedicated temp directory
|
|
4. Runs `rife-ncnn-vulkan.exe` to generate interpolated frames
|
|
5. Filters the generated frames to keep only the desired in-between sequence
|
|
6. Encodes the remaining frames into a video at the specified FPS
|
|
|
|
## Parameters
|
|
|
|
- **`-First`** (required): Full or relative path to the first image file (e.g., `First.png` or `D:\Images\First.png`)
|
|
- **`-Last`** (required): Full or relative path to the last image file (e.g., `Last.png` or `D:\Images\Last.png`)
|
|
- **`-TempDir`** (optional): Full absolute path to a temporary directory for intermediate PNG frames. Must end with `\`. Defaults to a system-generated temp subdirectory. This is separate from the dedicated input temp directory.
|
|
- **`-Frames`** (required): Number of frames to generate in the output video. Must be greater than 0
|
|
- **`-Video`** (required): Output video filename. If relative, resolved against current directory
|
|
- **`-FPS`** (optional): Frames per second for the output video (default: `24`)
|
|
|
|
## Frame Generation
|
|
|
|
The number of frames passed to `rife-ncnn-vulkan` is computed as:
|
|
|
|
```text
|
|
Count = 4 + (($Frames - 1) * 2)
|
|
EndsAt = Count / 2
|
|
```
|
|
|
|
After generation, `rife-ncnn-vulkan` outputs files named `%08d.png`. The script deletes:
|
|
|
|
- `00000001.png` (copy of the first input image)
|
|
- All files with index greater than `EndsAt` (copy of the last input image and beyond)
|
|
|
|
Only the true interpolated frames (`00000002.png` through `00000{EndsAt}.png`) are passed to ffmpeg.
|
|
|
|
## Examples
|
|
|
|
**Basic interpolation:**
|
|
|
|
```powershell
|
|
.\Stitch-InBetween.ps1 -First "frame1.png" -Last "frame2.png" -Frames 30 -Video "output.mp4"
|
|
```
|
|
|
|
**Full paths with custom FPS:**
|
|
|
|
```powershell
|
|
.\Stitch-InBetween.ps1 -First "D:\Images\start.png" -Last "D:\Images\end.png" -Frames 60 -Video "result.mp4" -FPS 30
|
|
```
|
|
|
|
**Absolute paths for input and output:**
|
|
|
|
```powershell
|
|
.\Stitch-InBetween.ps1 -First "C:\Work\Frames\A.png" -Last "C:\Work\Frames\B.png" -Frames 24 -Video "D:\Output\clip.mp4"
|
|
```
|
|
|
|
**Custom temp directory:**
|
|
|
|
```powershell
|
|
.\Stitch-InBetween.ps1 -First "A.png" -Last "B.png" -Frames 24 -Video "clip.mp4" -TempDir "D:\Temp\rife\"
|
|
```
|
|
|
|
## Safe Execution
|
|
|
|
This script supports `-WhatIf` and `-Confirm` for safe execution:
|
|
|
|
- **`-WhatIf`**: Simulate the operation without actually generating frames or creating the video. Shows what would be done.
|
|
- **`-Confirm`**: Prompt for confirmation before clearing temp directory, generating frames, and creating the video.
|
|
|
|
**Simulate without making changes:**
|
|
|
|
```powershell
|
|
.\Stitch-InBetween.ps1 -First "frame1.png" -Last "frame2.png" -Frames 30 -Video "output.mp4" -WhatIf
|
|
```
|
|
|
|
**Prompt before operations:**
|
|
|
|
```powershell
|
|
.\Stitch-InBetween.ps1 -First "frame1.png" -Last "frame2.png" -Frames 30 -Video "output.mp4" -Confirm
|
|
```
|
|
|
|
## Existing Files and Temporary Directory
|
|
|
|
- **`-Video`**: if a file already exists at this path, it is deleted before generation starts. The old file is gone even if the generation fails later. Use `-WhatIf` to see the deletion first.
|
|
- **`-TempDir`**: if the folder already exists, **everything inside it is deleted recursively** before generation starts. Pass a dedicated folder that holds nothing you need. The default is a new folder under the system temporary directory, so no existing file is deleted.
|
|
- The input frames are copied to a second temporary folder under the system temporary directory. This folder is deleted after rife-ncnn-vulkan finishes successfully.
|
|
- Intermediate frames in `-TempDir` are deleted as described in [Frame Generation](#frame-generation).
|
|
|
|
## Notes
|
|
|
|
- Requires `rife-ncnn-vulkan.exe` (TNTwise fork, RIFE 4.26) in the system PATH
|
|
- Requires `ffmpeg` in the system PATH
|
|
- Requires the `RIFE_HOME` environment variable pointing to the rife-ncnn-vulkan install directory (the same folder that is on PATH). The script resolves the model directory from `%RIFE_HOME%\rife-v4.26`.
|
|
- Requires the `NCNN_GPU_ID` environment variable set to the desired GPU device ID passed to rife-ncnn-vulkan via the `-g` flag:
|
|
- `-1` — CPU only (no Vulkan GPU required).
|
|
- `0` — First GPU.
|
|
- `1`, `2`, etc. — Additional GPUs.
|
|
- The script creates a dedicated temporary directory for input images, separate from the `-TempDir` parameter
|
|
- Input images can be located anywhere on the filesystem and are copied to the dedicated temp directory
|
|
- The dedicated input temp directory is automatically cleaned up after frame generation
|
|
- The output temp directory (`-TempDir`) is created if it does not exist; its contents are always cleared before each run
|
|
- Output codec: libx264, CRF 8, pixel format yuv420p
|