Video FFMPEG:在不损失质量的情况下裁剪视频

Video FFMPEG:在不损失质量的情况下裁剪视频,video,ffmpeg,Video,Ffmpeg,我有1920x1080的mp4视频。我想将视频裁剪到480x270,而不丢失质量 我正在使用以下命令: ffmpeg -i input.mp4 -filter:v "crop=480:270:200:200" -crf 23 output.mp4 我还尝试: ffmpeg -i input.mp4 -filter:v "crop=480:270:200:100" -c:a copy -qp 0 output.mp4 我使用-crf 23和-qp 0进行无损视频裁剪,但裁剪后视频质量下降 有人

我有
1920x1080
的mp4视频。我想将视频裁剪到
480x270
,而不丢失质量

我正在使用以下命令:

ffmpeg -i input.mp4 -filter:v "crop=480:270:200:200" -crf 23 output.mp4
我还尝试:

ffmpeg -i input.mp4 -filter:v "crop=480:270:200:100" -c:a copy -qp 0 output.mp4
我使用
-crf 23
-qp 0
进行无损视频裁剪,但裁剪后视频质量下降


有人知道我如何裁剪视频而不丢失质量吗?

在基本层面上,你不能使用有损编码,然后在解码后再次编码时期望它不会丢失质量。唯一有效的方法是使用无损编解码器,例如Quicktime和动画编解码器。这只是数字视频制作的一个基本事实,您不能仅仅通过将命令行选项传递给ffmpeg来解决这一问题。

当编码为有损格式时,您无法执行任何过滤而不损失质量,但您有一些选择

把你的球员裁掉 一个可能的解决方案是在播放过程中进行裁剪,这样您甚至不需要重新编码。预览作物也很有用

此方法不会创建输出文件。这将使用视频播放器在播放时进行裁剪。如果需要输出文件,请参阅下面的其他方法之一。

ffmpeg -i input.mp4 -vf "crop=480:270:200:100" -c:v ffv1 -c:a copy output.mkv
使用
ffplay
和:

使用
vlc
(或
cvlc
):

或者您可以使用VLC GUI:Tools进行裁剪→ 效果与过滤器→ 视频效果→ 收成

接受一些质量损失(您甚至可能没有注意到差异) 给它足够的位元,你可能看不出有质量差异:

ffmpeg -i input -vf "crop=480:270:200:100" -c:v libx264 -crf 17 -c:a copy ouput.mp4
有关更多信息,请参阅

使用位流过滤器 和位流过滤器可以设置裁剪尺寸,而无需修改视频本身

注意:您的玩家可能不支持此方法。

ffmpeg -i input.mp4 -vf "crop=480:270:200:100" -c:v ffv1 -c:a copy output.mkv
H.264视频示例:

ffmpeg -i input.mp4 -c copy -bsf:v h264_metadata=crop_left=100:crop_right=20:crop_top=10:crop_bottom=10 output.mp4
  • 设置SPS中的帧裁剪偏移。如果流已被裁剪,则这些值将替换当前值

  • 这些字段以像素为单位设置。请注意,如果色度被二次采样或流被隔行扫描,则某些尺寸可能无法表示(参见H.264第7.4.2.1.1节)

使用无损格式
ffmpeg
可以使用几种无损编码器进行编码:ffv1、huffyuv、ffvhuff、utvideo、libx264(使用或
-qp 0
)。输出将是无损的,但输出文件将是巨大的

注意:您的玩家可能不支持此方法。

ffmpeg -i input.mp4 -vf "crop=480:270:200:100" -c:v ffv1 -c:a copy output.mkv

如果您的输入是MJPEG
,使用
jpegtran
无损地剪切它们,然后使用
ffmpeg
重新复制它们。这不会导致丢失,但您将被限制为古老的MJPEG格式。

使用ffmpeg是不可能的

作为替代方案,您可以将视频嵌入Matroska(.mkv)容器中,但是


据报道,对于H264编码的视频也可以使用,但我仍然需要弄清楚如何使用它…

至少对于某些视频格式,基于元数据的软解决方案应该可以使用FFmpeg,也可以使用libavcodec的位流过滤器,例如,或

与and
cropdetect
等过滤器不同,这不需要解码。不过,语法略有不同,因为您只能设置四条边的裁剪量,而不能设置目标矩形的大小。对于1920×1080全高清帧中左上角位置(200200)处OP的480×270区域,我们得到:

  • ffmpeg-i input.mp4-codec copy-bsf:v h264_metadata=crop_left=200:crop_right=1240:crop_top=200:crop_bottom=610 output.mp4
因为这是编解码器元数据,所以无论容器格式如何,这都应该有效,即不仅在MP4中有效,在MKV或AVI中也有效。唉,我还没有亲自测试过它,也不能说任何关于软件和硬件播放器支持的事情。(不过,第一次简单的检查失败得很惨。)

关于更详细的信息,FFmpeg的文档分别参考了H.265和H.264规范的第7.4.3.2.1节和第7.4.2.1.1节,这些规范可从ITU免费获得,基本等同于:

  • frame\u croping\u flag
    等于1指定帧裁剪偏移参数在序列参数集中紧跟其后。 frame_cropping_标志等于0指定不存在帧裁剪偏移参数
  • frame\u crop\u left\u offset
    frame\u crop\u right\u offset
    frame\u crop\u top\u offset
    frame\u crop\u bottom\u offset指定解码过程中输出的编码视频序列中的图片样本,以矩形表示
    在帧坐标中为输出指定的区域。
    变量
    CropUnitX
    CropUnitY
    的推导如下:

    –如果ChromaArrayType等于0,则CropUnitX和CropUnitY的推导公式为:
    CropUnitX=1
    CropUnitY=2− 仅帧标记
    –否则(
    ChromaArrayType
    等于1、2或3),
    CropUnitX
    CropUnitY
    派生为:
    CropUnitX=SubWidthC
    CropUnitY=subweightc*(2)− 帧(仅限帧标志)

“帧裁剪矩形”包含具有来自的水平帧坐标的luma样本
CropUnitX*帧\u裁剪\u左\u偏移到PicWidthInSamplesL− (CropUnitX*帧\裁剪\右\偏移+1)
和垂直框架坐标
CropUnitY*帧\裁剪\顶部\偏移到(16*帧高inMbs)−
(CropUnitY*帧\裁剪\底部\偏移+1)
,包括在内

frame\u crop\u left\u offset的值应在0范围内
至
(PicWidthInSamplesL/CropUnitX)− (帧\u裁剪\u右\u偏移+1)
,包括在内; 而
frame\u crop\u top\u offset
shal的值
ffmpeg -i input.mp4 -vf "crop=480:270:200:100" -c:v libx264 -crf 0 -c:a copy output.mp4