如何在ffmpeg-python的filter_()中使用输入参数实现视频裁剪?
解决ffmpeg-python中使用crop滤镜裁剪为输入尺寸一半的问题
嘿,我之前在使用ffmpeg-python处理crop滤镜时也遇到过同样的困惑,其实核心问题在于要让ffmpeg而不是Python去解析in_w和in_h这些内置变量,下面是两种正确的实现方式:
方式一:直接传递完整的crop表达式字符串
你可以把FFmpeg命令里的crop参数直接作为字符串传给filter_()方法,这样ffmpeg会自动处理其中的in_w和in_h变量:
import ffmpeg # 读取输入视频 input_stream = ffmpeg.input("your_input_video.mp4") # 应用crop滤镜,尺寸为输入的一半 cropped_stream = input_stream.filter_("crop", "1/2*in_w:1/2*in_h") # 输出处理后的视频 cropped_stream.output("your_output_video.mp4").run()
方式二:使用命名参数传递(更清晰)
如果你习惯用命名参数的写法,需要注意把每个参数的表达式用字符串包裹,避免Python试图解析不存在的变量(比如in_w不是Python变量,直接写会报错):
import ffmpeg input_stream = ffmpeg.input("your_input_video.mp4") # 通过命名参数w和h指定裁剪尺寸,表达式用字符串传递 cropped_stream = input_stream.filter_("crop", w="1/2*in_w", h="1/2*in_h") cropped_stream.output("your_output_video.mp4").run()
额外扩展:自定义裁剪位置
如果需要调整裁剪的起始位置(默认是居中裁剪),同样可以用表达式指定x和y参数,比如保持居中的写法:
cropped_stream = input_stream.filter_( "crop", w="1/2*in_w", h="1/2*in_h", x="(in_w - w)/2", y="(in_h - h)/2" )
为什么之前的尝试会失败?
因为如果直接写w=1/2*in_w,Python会尝试计算这个表达式,但in_w不是Python环境中的变量,所以会抛出NameError。必须把表达式作为字符串传递,让ffmpeg在处理时解析这些内置的输入尺寸变量。
内容的提问来源于stack exchange,提问作者Linkyu
相关产品推荐
相关产品推荐

