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



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调用来实现这一点,但这似乎不必要地昂贵。有没有办法在一次通话中做到这一点?

作物过滤器

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

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和hevc_metadata比特流过滤器可以编辑H.264和H.265/hevc的SPS中的窗口裁剪偏移。这意味着它可以在不需要重新编码视频的情况下更改这些值。文件大小将保持不变,但播放器将根据您设置的裁剪值裁剪视频。

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

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

要编写此脚本,可以使用ffprobe来获取宽度和高度。