| Title: | 'AV1' Video Encoding for Biological Microscopy Data |
|---|---|
| Description: | Converts microscopy video and image data (H.264/H.265, AVI/MJPEG, TIFF stacks) to the 'AV1' codec for compact storage, and archives 16-bit image stacks and videos losslessly in the 'FFV1' format. Encoding runs on the GPU via 'Vulkan' or 'VAAPI' when available and falls back to the CPU through 'FFmpeg' and 'SVT-AV1'. Whole experiment folders can be converted at once. |
| Authors: | Yuri Baramykov [aut, cre] (ORCID: <https://orcid.org/0009-0000-7627-4217>), The Khronos Group Inc. [cph], FFmpeg developers [cph] |
| Maintainer: | Yuri Baramykov <[email protected]> |
| License: | MIT + file LICENSE |
| Version: | 0.1.4.1 |
| Built: | 2026-10-14 22:31:48 UTC |
| Source: | https://github.com/zabis13/av1r |
Converts microscopy video and image data (H.264/H.265, AVI/MJPEG, TIFF stacks) to the 'AV1' codec for compact storage, and archives 16-bit image stacks and videos losslessly in the 'FFV1' format. Encoding runs on the GPU via 'Vulkan' or 'VAAPI' when available and falls back to the CPU through 'FFmpeg' and 'SVT-AV1'. Whole experiment folders can be converted at once.
Maintainer: Yuri Baramykov [email protected] (ORCID)
Other contributors:
The Khronos Group Inc. [copyright holder]
FFmpeg developers [copyright holder]
Useful links:
Encodes a 16-bit grayscale TIFF stack to FFV1 version 3 (RFC 9043) in a Matroska container. Compression is lossless: decoding the archive gives back the original sample values bit for bit. Frames are processed in chunks, so stacks larger than RAM can be archived.
archive_tiff( input, output = NULL, fps = 25, slices = c(2L, 2L), context_model = 0L, verify = FALSE, sidecar = TRUE, verbose = TRUE, backend = c("auto", "vulkan", "cpu") )archive_tiff( input, output = NULL, fps = 25, slices = c(2L, 2L), context_model = 0L, verify = FALSE, sidecar = TRUE, verbose = TRUE, backend = c("auto", "vulkan", "cpu") )
input |
Path to a multi-page 16-bit grayscale TIFF. |
output |
Path to the output |
fps |
Frame rate written to the container. |
slices |
Integer vector |
context_model |
|
verify |
If |
sidecar |
If |
verbose |
Print progress messages. |
backend |
Encoder: |
OME-XML found in the TIFF ImageDescription tag is stored as an MKV
attachment (metadata.ome.xml) and in the sidecar file.
Invisibly, the path to the archive.
## Not run: # Requires the 'tiff' package archive_tiff("stack.tif", verify = TRUE) ## End(Not run)## Not run: # Requires the 'tiff' package archive_tiff("stack.tif", verify = TRUE) ## End(Not run)
Decodes a video with FFmpeg and encodes its luma (Y) channel, converted to 16-bit grayscale, to FFV1 version 3 (RFC 9043) in a Matroska container. Frames are decoded and encoded on the fly in chunks, so videos larger than RAM can be archived.
archive_video( input, output = NULL, slices = c(2L, 2L), context_model = 0L, audio = FALSE, verify = FALSE, sidecar = TRUE, verbose = TRUE, backend = c("auto", "vulkan", "cpu") )archive_video( input, output = NULL, slices = c(2L, 2L), context_model = 0L, audio = FALSE, verify = FALSE, sidecar = TRUE, verbose = TRUE, backend = c("auto", "vulkan", "cpu") )
input |
Path to a video file FFmpeg can decode. |
output |
Path to the output |
slices |
Integer vector |
context_model |
|
audio |
If |
verify |
If |
sidecar |
If |
verbose |
Print progress messages. |
backend |
Encoder: |
The archive is lossless with respect to the 16-bit grayscale frames that
FFmpeg produces from the source (-pix_fmt gray16le): colour
(chroma) is not stored, and 8-bit luma is scaled to 16 bits by FFmpeg.
Every decoded frame is stored exactly once, at the source's nominal frame
rate; variable frame rate timing is not preserved.
Use it for lossless or uncompressed sources (raw or uncompressed AVI, scientific camera recordings). FFV1 keeps every pixel of the decoded frames, including the noise and artefacts of a lossy codec, so for lossy sources (MPEG-4, H.264, H.265, ...) the archive is much larger than the original; keep the original file as the master copy instead.
Invisibly, the path to the archive.
## Not run: archive_video("recording.avi", verify = TRUE) archive_video("recording.avi", audio = TRUE) # keep the sound track ## End(Not run)## Not run: archive_video("recording.avi", verify = TRUE) archive_video("recording.avi", audio = TRUE) # keep the sound track ## End(Not run)
AV1R encoding options
av1r_options( crf = 28L, preset = 8L, threads = 0L, bitrate = NULL, tiff_crf = 5L, tiff_scale = NULL, verbose = TRUE, backend = "auto" )av1r_options( crf = 28L, preset = 8L, threads = 0L, bitrate = NULL, tiff_crf = 5L, tiff_scale = NULL, verbose = TRUE, backend = "auto" )
crf |
Constant Rate Factor: 0 (best) to 63 (worst). Default 28.
Lower = better quality, larger file. Used as fallback when |
preset |
Encoding speed preset: 0 (slowest/best) to 13 (fastest). Default 8 (good balance for microscopy batch jobs). |
threads |
Number of CPU threads. 0 = auto-detect. |
bitrate |
Target video bitrate in kbps (e.g. |
tiff_crf |
CRF for TIFF/image sequence input. Default 5
(near-lossless, suitable for microscopy data). Overrides |
tiff_scale |
Scale factor or target size for TIFF/image input.
|
verbose |
Logical. If |
backend |
|
A named list of encoding parameters.
# Default options (auto-detect backend and bitrate) av1r_options() # High-quality lossless-ish for publication figures av1r_options(crf = 15, preset = 4) # Explicit bitrate (GPU VAAPI) av1r_options(bitrate = 2000, backend = "vaapi") # Fast batch conversion of large TIFF stacks av1r_options(crf = 32, preset = 12, threads = 16)# Default options (auto-detect backend and bitrate) av1r_options() # High-quality lossless-ish for publication figures av1r_options(crf = 15, preset = 4) # Explicit bitrate (GPU VAAPI) av1r_options(bitrate = 2000, backend = "vaapi") # Fast batch conversion of large TIFF stacks av1r_options(crf = 32, preset = 12, threads = 16)
Prints the active encoding backend and available GPU/CPU capabilities.
av1r_status()av1r_status()
Invisibly returns the active backend string.
av1r_status()av1r_status()
Finds all supported video files in input_dir and converts them to
AV1. Output files are written to output_dir with the same base name
and .mp4 extension.
convert_folder( input_dir, output_dir = input_dir, options = av1r_options(), ext = c("mp4", "avi", "mkv", "mov", "flv", "mpg", "mpeg", "webm", "tif", "tiff"), skip_existing = TRUE, recursive = FALSE, max_depth = 5L )convert_folder( input_dir, output_dir = input_dir, options = av1r_options(), ext = c("mp4", "avi", "mkv", "mov", "flv", "mpg", "mpeg", "webm", "tif", "tiff"), skip_existing = TRUE, recursive = FALSE, max_depth = 5L )
input_dir |
Path to folder with input files. |
output_dir |
Path to folder for output files. Created if it does not
exist. Defaults to |
options |
An |
ext |
Character vector of input extensions to process.
Default: |
skip_existing |
If |
recursive |
If |
max_depth |
Maximum subfolder depth when |
When a folder contains only single-page TIFF images (e.g. a microscopy image sequence), they are automatically combined into a single video named after the input folder.
When recursive = TRUE, subfolders (up to max_depth levels)
are scanned. Each subfolder containing only TIFF images is combined into
a single video named after the subfolder. Subfolders with video files are
processed file-by-file. All output is written flat into output_dir,
with subfolder names used as prefixes to avoid collisions.
Invisibly returns a data.frame with columns input,
output, input_size (bytes), status
("ok", "skipped", or "error"), and message.
## Not run: # Requires FFmpeg installed convert_folder("~/data/microscopy", file.path(tempdir(), "av1_output")) # Recursive: each subfolder with TIFFs becomes a separate video convert_folder("~/data/plates", "~/av1_output", recursive = TRUE) ## End(Not run)## Not run: # Requires FFmpeg installed convert_folder("~/data/microscopy", file.path(tempdir(), "av1_output")) # Recursive: each subfolder with TIFFs becomes a separate video convert_folder("~/data/plates", "~/av1_output", recursive = TRUE) ## End(Not run)
Converts biological microscopy video files (MP4/H.264, H.265, AVI/MJPEG)
or TIFF stacks to AV1 format. Automatically selects the best available
backend: Vulkan GPU (VK_KHR_VIDEO_ENCODE_AV1) when a compatible
device is found, otherwise CPU via FFmpeg (libsvtav1).
convert_to_av1(input, output, options = av1r_options())convert_to_av1(input, output, options = av1r_options())
input |
Path to input file. Supported: .mp4, .avi, .mkv, .mov, .flv, .mpg, .mpeg, .webm,
.tif/.tiff (multi-page), or printf pattern like |
output |
Path to output file (.mp4 or .mkv). |
options |
An |
Invisibly returns 0L on success. Stops with an error on failure.
# List available options str(av1r_options()) ## Not run: # Requires FFmpeg installed convert_to_av1("recording.mp4", file.path(tempdir(), "recording_av1.mp4")) ## End(Not run)# List available options str(av1r_options()) ## Not run: # Requires FFmpeg installed convert_to_av1("recording.mp4", file.path(tempdir(), "recording_av1.mp4")) ## End(Not run)
Priority order: "vaapi" (VAAPI AV1 GPU via ffmpeg, best
speed/quality ratio) > "vulkan" (Vulkan AV1 GPU, fastest but
CQP only) > "cpu" (SVT-AV1 via ffmpeg).
detect_backend(prefer = "auto")detect_backend(prefer = "auto")
prefer |
|
Character string: "vaapi", "vulkan", or "cpu".
detect_backend() detect_backend(prefer = "cpu")detect_backend() detect_backend(prefer = "cpu")
Compares encoded video against the original using SSIM. Values close to 1.0 indicate high similarity.
measure_ssim(original, encoded, duration = NULL)measure_ssim(original, encoded, duration = NULL)
original |
Path to original video file. |
encoded |
Path to encoded video file. |
duration |
Seconds to compare. |
Numeric SSIM score (0-1), or NA on failure.
Does not load pixel data into R – only inspects the file. Useful for checking frame count and dimensions before encoding.
read_tiff_stack(path)read_tiff_stack(path)
path |
Path to a multi-page TIFF file or printf-pattern
(e.g. |
A list with elements: path, n_frames,
width, height, size_mb.
# Create a small temporary TIFF and inspect it tmp <- tempfile(fileext = ".tif") writeBin(raw(1024), tmp) info <- read_tiff_stack(tmp) str(info) unlink(tmp)# Create a small temporary TIFF and inspect it tmp <- tempfile(fileext = ".tif") writeBin(raw(1024), tmp) info <- read_tiff_stack(tmp) str(info) unlink(tmp)
Check Vulkan AV1 availability
vulkan_available()vulkan_available()
TRUE if the package was compiled with Vulkan AV1 encode support
and at least one device supports VK_KHR_VIDEO_ENCODE_AV1.
vulkan_available()vulkan_available()
List Vulkan-capable GPU devices
vulkan_devices()vulkan_devices()
Character vector of device names. Devices supporting
VK_KHR_VIDEO_ENCODE_AV1 are marked with [AV1].
vulkan_devices()vulkan_devices()