如何使用 ffmpeg 便宜地 "undo" 马赛克(即将图像分成两半或象限)?

How to cheaply "undo" a mosaic (i.e. split an image into halves or quadrants) with ffmpeg?

FFMPEG 可以轻松获取多个输入并将它们堆叠到马赛克视频中。我正在寻找一种相反的方法,具体来说,我想拍摄一个由四个流组成的视频流,这些流堆叠成象限,并将其分成四个由坐标

组成的独立视频
video1 = [0, 0.5*w, 0, 0.5*h]
video2 = [0.5*w, w, 0, 0.5*h]
video3 = [0, 0.5*w, 0.5*h, h]
video4 = [0.5*w, w, 0.5*h, h]

我知道我可以使用 crop 过滤器通过四个单独的 ffmpeg 调用来做到这一点,但这似乎不必要地昂贵。有没有办法在一个电话中做到这一点?

裁剪过滤器

您可以在一条命令中使用四个 crop 过滤器:

ffmpeg -i input -filter_complex "[0]crop=iw/2:ih/2:0:0[tl];[0]crop=iw/2:ih/2:ow:0[tr];[0]crop=iw/2:ih/2:0:oh[bl];[0]crop=iw/2:ih/2:ow:oh[br]" -map "[tl]" topleft.mp4 -map "[tr]" topright.mp4 -map "[bl]" bottomleft.mp4 -map "[br]" bottomright.mp4

比特流过滤器

比特流过滤器不同于普通过滤器。普通过滤器需要解码和编码。比特流过滤器对编码流数据进行操作,并在不执行解码的情况下执行比特流级修改。

h264_metadata and hevc_metadata 比特流过滤器可以在 H.264 和 H.265/HEVC 的 SPS 中编辑 window 裁剪偏移。这意味着它可以更改这些值而无需重新编码视频。文件大小将保持不变,但播放器将根据您设置的裁剪值裁剪视频。

H.264 320x240 输入示例:

ffmpeg -i input.mp4 -bsf:v h264_metadata=crop_right=160:crop_bottom=120 -c copy topleft.mp4 -bsf:v h264_metadata=crop_left=160:crop_bottom=120 -c copy topright.mp4  -bsf:v h264_metadata=crop_right=160:crop_top=120 -c copy bottomleft.mp4 -bsf:v h264_metadata=crop_left=160:crop_top=120 -c copy bottomright.mp4

这些字段以像素为单位设置。请注意,如果对色度进行二次采样,则某些尺寸可能无法表示(这基本上意味着您应该只对典型视频使用偶数值)。

要编写脚本,您可以 use ffprobe to get the width and height