【音视频】ffmpeg实现图片放缩效果
ffmpeg实现动态缩放图像效果
·
ffmpeg实现图片放缩效果
zoompan filter实现
zoompan滤镜可以直接图片的放大缩小,范围是原图的1倍~10倍之间,
官方文档:https://ffmpeg.org/ffmpeg-filters.html#zoompan
Apply Zoom & Pan effect.
This filter accepts the following options:
zoom, z
Set the zoom expression. Range is 1-10. Default is 1.
其他参数参考官方文档即可,下面是一个例子:
ffmpeg -r 25 -y -i 1.jpg -filter_complex "scale=-2:10*ih,zoompan=z='if(lte(zoom,1.0),2,max(1.001,zoom-0.0065))':d=100:s=900x1280:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)',scale=-2:ih" -t 4 fa.mp4
效果如下(已转为gif):
放大效果同理,只需要交换下命令即可,可以自己尝试探索一下。
geq filter实现
geq则是ffmpeg另一个强大的滤镜,可以直接操作像素点来实现效果。
当然放大缩小也可以根据这个滤镜来实现。
官方文档:https://ffmpeg.org/ffmpeg-filters.html#geq
ffmpeg -y -i 2.jpg -filter_complex "[0:v]scale=-1:1280,pad=720:1280:0:0,loop=loop=-1:size=2,format=yuv444p,drawbox=color=black,geq='p(X*(2.0-1.5*T/2)+1.0*(1-(2.0-1.5*T/2))*W,Y*(2.0-1.5*T/2)+0.5*(1-(2.0-1.5*T/2))*H)',setsar=1[v]" -map '[v]' -pix_fmt yuv420p -t 2 out.mp4
OpenGL手写滤镜实现
定义相应的顶点着色器和片元着色器,ffmpeg手动定义AVFilter,自定义参数后,即可进行逐帧渲染,下面为一个简单的随时长从0到1的一个放大效果实现,熟悉矩阵的情况下,可以修改其中的mat来实现不同的效果。
这个方法还需要下载源码,添加新的AVFilter文件并重新编译,故此处只贴了着色器代码。
attribute vec2 position;
varying vec2 TextureCoordsVarying;
uniform float playTime;
uniform float durt;
void main(void) {
float progress = mod(playTime, durt) / durt; // 实现0~1放大
float zoom = 1.0 * progress;// 当前放大倍数
mat4 zoomMat = mat4(
zoom, 0.0, 0.0, 0.0,
0.0, zoom, 0.0, 0.0,
0.0, 0.0, zoom, 0.0,
0.0, 0.0, 0.0, 1.0
);
gl_Position = zoomMat * vec4(position, 0.0, 1.0);
TextureCoordsVarying.x = position.x * 0.5 + 0.5;
TextureCoordsVarying.y = position.y * 0.5 + 0.5;
}
//precision highp float;
uniform sampler2D tex;
varying vec2 TextureCoordsVarying;
void main() {
//TextureCoordsVarying.x = TextureCoordsVarying.x * 0.5 + 0.5;
//TextureCoordsVarying.y = TextureCoordsVarying.y * 0.5 + 0.5;
vec4 mask = texture2D(tex, TextureCoordsVarying);
gl_FragColor = vec4(mask);
}
效果如下所示:
更多推荐
已为社区贡献1条内容
所有评论(0)