ffmpeg geq滤镜无法识别位运算符,如何实现像素低6位掩码操作
报错根因
你遇到的报错是两个原因共同导致的:
- FFmpeg的表达式语法不支持直接使用
&作为按位与运算符,需要调用内置的and()函数完成位与操作 - 即使语法支持直接写
&,shell环境下未转义的&会被识别为后台执行标记,导致命令参数被截断,无法被FFmpeg正确识别
解决方法(两种可选)
方法1:使用移位运算实现(更简洁,无符号冲突)
P010格式低6位置0的操作等价于将像素值先右移6位丢弃低6位,再左移6位补0,运算结果和&0xffc0完全一致,FFmpeg表达式原生支持>>和<<移位运算符,不会出现符号冲突。
完整命令示例:
ffmpeg -i 输入文件 -pix_fmt p010le \ -vf "geq=lum_expr='lum(X,Y)>>6<<6':cb_expr='cb(X,Y)>>6<<6':cr_expr='cr(X,Y)>>6<<6'" \ 输出文件
注意输出指定-pix_fmt p010le避免FFmpeg自动转成8位格式丢失精度。
方法2:使用内置and()函数实现位与操作
如果需要明确使用位与逻辑,可以调用FFmpeg表达式内置的and(数值1, 数值2)函数完成按位与运算:
完整命令示例:
ffmpeg -i 输入文件 -pix_fmt p010le \ -vf "geq=lum_expr='and(lum(X,Y), 0xffc0)':cb_expr='and(cb(X,Y), 0xffc0)':cr_expr='and(cr(X,Y), 0xffc0)'" \ 输出文件
内容的提问来源于stack exchange,提问作者tedx
相关产品推荐
相关产品推荐

