Crop many videos to a rectangular region, using one jobs table. This is the
batch form of crop_video(), for when you have more than one file. Each
row is one input. The function is a thin wrapper over
ffm_batch. It builds one reproducible command for each input,
with the same crop steps as crop_video(). This function checks each
row's crop size and position before any command runs. So a bad cell is
refused with an error that names this function. The glossary in
vignette("tidymedia") explains media terms such as codec, container
and stream copy.
Usage
crop_video_batch(
jobs,
width = NULL,
height = NULL,
x = "(in_w-out_w)/2",
y = "(in_h-out_h)/2",
video_codec = NULL,
audio_codec = "copy",
hardware = c("none", "nvenc", "videotoolbox"),
fallback = FALSE,
quality = NULL,
audio_stream = NULL,
run = TRUE,
parallel = FALSE,
...
)Arguments
- jobs
A data frame with one row per input. It needs at least an
inputcolumn, the source path. An optionaloutputcolumn names the destination. Without it, each row's output name adds_croppedto the input's base name and keeps its extension. For example,clip.mp4becomesclip_cropped.mp4. Awidth,height,xorycolumn overrides that argument for each row. A dimension with no column uses the argument. Avideo_codeccolumn overrides that argument for each row, andNAleaves the codec unset. That is the column form of the argument'sNULL. Anaudio_codeccolumn works the same way. Anaudio_streamcolumn overrides that argument for each row, andNAkeeps every audio track. That is the column form of that argument'sNULL. Two rows with the same destination path are refused before any row runs. That happens with a repeatedoutput, or with a repeatedinputwhen there is nooutputcolumn. A numericqualitycolumn overrides thequalityargument per row (seequality). Any other columns are ignored.- width, height
The output crop size in pixels, for every row unless
jobshas a column of the same name. Each is required: pass it as an argument or as a column. There is no default crop size.- x, y
The offset in pixels of the crop's left and top edge, for every row unless
jobshas a column of the same name. The default centers the crop.- video_codec
A string naming the output video codec, applied to every row lacking a
video_codeccolumn.NULL(default) leaves it unset, so each output keeps its container's default encoder.- audio_codec
A string naming the output audio codec, for every row when
jobshas noaudio_codeccolumn."copy"(default) stream-copies the audio. Name an encoder to transcode it.NULLleaves the codec unset, so each output keeps its container's default encoder.- hardware, fallback
The encoder backend and its fallback behavior, applied to the whole batch. They are a property of the machine, not of a row, so neither is read as a
jobscolumn. Seecrop_video(). Resolving a hardware backend asks this FFmpeg build which encoders it has. So the first such call that re-encodes the video runs FFmpeg while the command is built, even underrun = FALSE. The answer is remembered for the rest of the R session. Seerefresh_ffmpeg_capabilitiesto discard it. This function checks that the encoder is available before any row runs. So an unavailable encoder aborts naming this function, not the internal step that runs the rows. A call can also have a per-rowwidthorheightthat is neither a positive number nor an FFmpeg expression. Such a call is refused for the value first, whether or not this machine has the encoder.- quality
A number, or
NULL(default), applied to each row unlessjobscarries a numericqualitycolumn. In that column,NAleaves that row's encoder default in place, whatever the argument says. The value is the encoder's own rate-control value, passed through unchanged. Each cell is checked against the encoder its own row resolves to. A wrong cell is refused before any row runs, and the error names this function and the row. Seecrop_video()for the encoders, their flags and ranges, and the values it refuses.- audio_stream
The audio track to carry into each output, as a number that counts from
0among the audio tracks of each row's input.0is the first audio track and1is the second. Other streams in the file, such as video, do not count.NULL(default) carries every audio track. Without anaudio_streamcolumn, the argument applies to every row. AnNAcell in that column meansNULLfor that row. It does not fall back to the argument. The every-track family readsNULLas every audio track:separate_audio_video,standardize_video,anonymize_video,crop_video,segment_videoandformat_for_web, and their_batchforms. The first-track family reads it as the first audio track only:extract_audio,convert_audioandnormalize_audio, and their_batchforms. The function does not carry subtitle or data streams in either case. A track the input does not have gives an FFmpeg error, not an R one. Seeaudio_streamfor how this differs fromaudio_input, the input index oncompare_videosandpicture_in_picture. (default =NULL)- run
A logical: run each command through FFmpeg (
TRUE, default) or only compile them for inspection (FALSE).- parallel
A logical: process the jobs in parallel with furrr (
TRUE) or one at a time (FALSE, default). Seeffm_batchfor the future plan requirement.- ...
Additional arguments forwarded to
ffm_batch(e.g.verify,manifest,progress).
Value
The jobs tibble with an added command column. When run = TRUE, it also has a success column, plus verified or a provenance manifest, each when requested through .... See ffm_batch.
See also
crop_video(), the single-input form it wraps; ffm_batch(),
the batch runner; has_hardware_encoder() for the hardware toggle;
standardize_video_batch() to re-encode in batch.
Other task functions:
anonymize_video(),
anonymize_video_batch(),
compare_videos(),
compare_videos_batch(),
concatenate_videos(),
concatenate_videos_batch(),
convert_audio(),
convert_audio_batch(),
crop_video(),
extract_audio(),
extract_audio_batch(),
extract_frame(),
extract_frame_batch(),
format_for_web(),
format_for_web_batch(),
normalize_audio(),
normalize_audio_batch(),
picture_in_picture(),
picture_in_picture_batch(),
sample_frames(),
sample_frames_batch(),
segment_video(),
segment_video_batch(),
separate_audio_video(),
separate_audio_video_batch(),
standardize_video(),
standardize_video_batch(),
strip_metadata(),
strip_metadata_batch()
Other audio selection functions:
anonymize_video(),
anonymize_video_batch(),
audio_stream,
compare_videos(),
compare_videos_batch(),
convert_audio(),
convert_audio_batch(),
crop_video(),
extract_audio(),
extract_audio_batch(),
format_for_web(),
format_for_web_batch(),
normalize_audio(),
normalize_audio_batch(),
picture_in_picture(),
picture_in_picture_batch(),
segment_video(),
segment_video_batch(),
separate_audio_video(),
separate_audio_video_batch(),
standardize_video(),
standardize_video_batch()
Examples
video <- system.file("extdata", "sample.mp4", package = "tidymedia")
jobs <- tibble::tibble(input = c(video, video), output = c("a.mp4", "b.mp4"),
width = c(160, 80), height = c(120, 60))
crop_video_batch(jobs, run = FALSE)
#> # A tibble: 2 × 5
#> input output width height command
#> <chr> <chr> <dbl> <dbl> <chr>
#> 1 /home/runner/work/_temp/Library/tidymedia/extdata… a.mp4 160 120 "-y -i…
#> 2 /home/runner/work/_temp/Library/tidymedia/extdata… b.mp4 80 60 "-y -i…