Files

116 lines
3.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Get-Frame.ps1
Extracts a specific frame of a video file to a PNG image by calling [Get-LastFrame.ps1](Get-LastFrame.md) with an automatically derived output filename. The image path is generated from the `-Video` filename by appending a dash and the resolved frame index zero-padded to at least four digits — for example, `P01.mp4` at frame 10 becomes `P01-0010.png` saved alongside the source video.
## Parameters
- **`-Video`** (required): Path to the input video file. Can be absolute or relative to current directory.
- **`-Frame`** (required): 0-based frame index to extract.
- Positive values: Direct frame index (e.g., `0` = first frame, `100` = frame 100)
- Negative values: Count from the end (e.g., `-1` = last frame, `-2` = second-to-last)
- Values are automatically clamped to the valid range (0 to total frames − 1): a positive value past the last frame gives the last frame, and a negative value before the first frame gives frame 0
## Image Filename Derivation
The output filename is derived from the resolved (always positive) frame index:
| Video | `-Frame` | Total frames | Output image |
| --- | --- | --- | --- |
| `P01.mp4` | `10` | any | `P01-0010.png` |
| `P01.mp4` | `0` | any | `P01-0000.png` |
| `P01.mp4` | `-1` | 300 | `P01-0299.png` |
| `P01.mp4` | `-2` | 300 | `P01-0298.png` |
| `render/shot.mp4` | `42` | any | `render/shot-0042.png` |
| `C:\Videos\take01.mp4` | `100` | any | `C:\Videos\take01-0100.png` |
Negative indices are resolved to the actual frame index before building the filename, so the output always reflects the exact frame that was extracted.
## Output Name Digits
The frame index is padded with zeros to **at least** four digits. Frames `0` to `9999` give exactly four digits (`0010`). Larger numbers are written in full: frame `12345` gives `P01-12345.png`.
## Existing Files
An existing PNG with the same name is **replaced**. The image is written by [Get-LastFrame.ps1](Get-LastFrame.md), which overwrites its output.
## Command Wrapper
`Get-Frame.cmd` takes the video and the frame as **positional** arguments. It calls `Get-Frame.ps1` found on `PATH`, so the script folder must be on `PATH`. Arguments after the frame are passed to `Get-Frame.ps1` unchanged. Only `-WhatIf` and `-Confirm` are accepted there. Other options are rejected.
```cmd
Get-Frame.cmd "P01.mp4" 10
```
This is the same call as `.\Get-Frame.ps1 -Video P01.mp4 -Frame 10`.
## Limitations
- `-Image` is not a parameter of `Get-Frame.ps1`, so it cannot choose the output name. To use a custom name or a numbering pattern, call [Get-LastFrame.ps1](Get-LastFrame.md) with `-Image`:
```powershell
.\Get-LastFrame.ps1 -Video P01.mp4 -Frame 10 -Image "P01-%04d.png"
```
## Examples
**Extract a specific frame:**
```powershell
.\Get-Frame.ps1 -Video P01.mp4 -Frame 10
# Creates: P01-0010.png
```
**Extract the first frame:**
```powershell
.\Get-Frame.ps1 -Video P01.mp4 -Frame 0
# Creates: P01-0000.png
```
**Extract the last frame:**
```powershell
.\Get-Frame.ps1 -Video P01.mp4 -Frame -1
# If video has 300 frames, creates: P01-0299.png
```
**Extract the second-to-last frame:**
```powershell
.\Get-Frame.ps1 -Video P01.mp4 -Frame -2
# If video has 300 frames, creates: P01-0298.png
```
**Extract the 10th frame from the end:**
```powershell
.\Get-Frame.ps1 -Video P01.mp4 -Frame -10
# If video has 300 frames, creates: P01-0290.png
```
**Using absolute paths:**
```powershell
.\Get-Frame.ps1 -Video "C:\Videos\P01.mp4" -Frame 50
# Creates: C:\Videos\P01-0050.png
```
## Safe Execution
This script supports `-WhatIf` and `-Confirm` for safe execution (forwarded to `Get-LastFrame.ps1`):
- **`-WhatIf`**: Simulate the operation without extracting the frame. Shows what would be done.
- **`-Confirm`**: Prompt for confirmation before extracting the frame.
**Simulate without extracting:**
```powershell
.\Get-Frame.ps1 -Video P01.mp4 -Frame 10 -WhatIf
```
**Prompt before extraction:**
```powershell
.\Get-Frame.ps1 -Video P01.mp4 -Frame 10 -Confirm
```