Skip to contents

Keep one continuous section of the input with FFmpeg's fast -ss and -to seek options. It does not use the trim filter of ffm_trim. Unlike the filter, seeking can use stream copy, so it is the tool for fast, lossless cuts. The glossary in vignette("tidymedia") explains media terms such as keyframe, re-encode and stream copy.

Usage

ffm_seek(object, start = NULL, end = NULL, reencode = TRUE)

Arguments

object

An FFmpeg pipeline (ffm) object created by ffm_files().

start

The start of the kept section, in seconds or in FFmpeg time duration syntax. NULL keeps the section from the beginning.

end

The end of the kept section, in seconds or in FFmpeg time duration syntax. NULL keeps the section to the end.

reencode

A logical. TRUE (the default) re-encodes for a frame-accurate cut. FALSE makes a fast seek that is safe to copy, and its cut points move to keyframes.

Value

object with an added instruction to cut the input by seeking.

Details

The reencode argument trades accuracy against speed:

  • reencode = TRUE (the default) is frame-accurate. The section is re-encoded, so it starts and ends on the exact frames you ask for. This is the safe default.

  • reencode = FALSE is a fast, lossless copy. But the cut points move to the nearest keyframes. So the output duration can differ from the request by up to the gap between two keyframes. Use it with ffm_copy for the fastest path.

References

https://ffmpeg.org/ffmpeg.html#Main-options

Examples

video <- system.file("extdata", "sample.mp4", package = "tidymedia")
# Fast, lossless copy cut (snaps to keyframes)
ffm_files(video, "output.mp4") |>
  ffm_seek(start = 1, end = 5, reencode = FALSE) |>
  ffm_copy() |>
  ffm_compile()
#> [1] "-y -ss 1 -to 5 -i \"/home/runner/work/_temp/Library/tidymedia/extdata/sample.mp4\" -codec:v copy -codec:a copy -avoid_negative_ts make_zero -map \"0\" \"output.mp4\""