ffmpeg 基础
摘要: 本文介绍了从互联网上搜集到的多种对ffmpeg工具应用的知识, 汇总后以便简单的查阅。
§ Table of Contents §
用ffmpeg将视频转成gif
基础命令
1 | ffmpeg -i 你的视频文件.mp4 生成的文件名.gif |
进阶命令
有时候30多M的mp4视频在转为gif后可能大小会去到100+M,非常夸张,我们不希望动图那么大,因为我们一般是要放到ppt或者什么地方使用的,因此,我们需要修改一些参数,使得生产的gif更小。通常,我们可以改变gif的帧率或者分辨率来实现数据大小压缩。
降低动图的帧率
用-r
参数来降低征率,比如原始的input.mp4是30帧的,可以用-r 15
来降低成15帧。具体效果也是很明显的,生成的文件大小从原来的86MB下降到56MB。
1 | ffmpeg -i input.mp4 -r 15 out1.gif |
关于ffmpeg的-r
参数,有个很小坑,**-r
参数一定要放到-i
参数后面**,它在前在后的作用是不一样的。
调整视频的码率
在压缩视频大小而不影响画质的目标下会比较有用
1 | ffmpeg -i input.mp4 -b:v 500k output.mp4 |
这里的 -b:v
表示视频比特率。
调整画面分辨率
比如原始视频是1080p的,我们可以将其减低到480p,从而显著降低最终的gif文件大小,这里可以使用-s
参数,后面跟具体的分辨率大小比如480x272
具体命令如下:
1 | ffmpeg -i input.mp4 -ss 00:01:13.500 -t 12 -s 480x272 out2.gif |
有些时候,我们不知道原始的视频分辨率,如果贸然指定目标分辨率的话,可能会导致画面被拉伸,观感下降,这时候可以使用一个更高级的参数-vf
,-vf
其实就比较复杂了,这里我们只看如何用-vf
参数实现宽高等比例缩放吧,具体命令如下:
1 | scale后面可以指定具体的分辨率宽:高,作用同-s,也可以只指定宽或者高, |
从原来的1080p降低到了480p后,文件大小变化更加明显,从原来的86MB降低到了6MB。看来还是将分辨率的效果比较明显,但是6MB作为表情包还是太大了,这时候我们可以将上面两种方式结合到一起,降分辨率的同时降帧率,命令行如下:
1 | ffmpeg -i input.mp4 -vf "scale=480:-1" -r 15 out4.gif |
最后生成的文件只有4MB了。
截取其中的一段视频生成gif
使用-ss
和-t
两个参数,-ss
代表的是start time,也就是开始时间,你可以指定开始的具体秒数,也可以用时:分:秒.毫秒的格式,比如00:12:14.500。-t
是要截取的时长,单位是秒。假设我们想从input.mp4里的第73.5秒开始,截取12秒的视频内容生成动图,命令行你可以写成如下的方式:
1 | ffmpeg -i input.mp4 -ss 73.5 -t 12 out.gif |
图片处理
Resize图片
1 | ffmpeg -i image_source -vf scale=width:height out_source |
图片裁剪
1 | ffmpeg -i image_source -vf crop=width:height:from_x:from_y out_source |
图片添加水印
1 | ffmpeg -i image_source -vf movie=logo_source,scale=logo_width:logo_height,lut=a=val*opacity_num[watermask];[in][watermask] overlay=from_x:from_y[out] -y out_source |
图片添加中文水印
1 | ffmpeg -i image_source -vf drawtext=fontfile=font_ttf_path:fontcolor=font_color:fontsize=font_size:text=message_info:x=from_x:y=from_y out_source |
图片旋转指定的角度
1 | ffmpeg -i image_source -vf rotate=route_num*PI/180 -y out_source |
图片上下左右镜像
1 | ffmpeg -i image_source -vf hflip out_source |
视频裁剪
主代码
1 | video_path='' |
裁剪位置测试
对于输入的视频,如果不知道如何设置crop参数,不知道怎么设置起始的点位,及长宽,首先我们可以先截取视频的首帧图像来做实验:
【起始点位】:截取框的左上角角点在原图内的坐标位置
【长宽】:向下及向右截取的范围
1 | ffmpeg -i video.mp4 -vf "select=eq(n\,0)" -vframes 1 first_frame.jpg |
-i video.mp4
:指定要处理的输入视频文件名称。
-vf "select=eq(n\,0)"
:使用视频过滤器选择帧。该过滤器选择第 n 帧,其中 n 的值为 0。因此,此过滤器选择视频的第一帧。
-vframes 1
:指定要提取的帧数为 1。
first_frame.jpg
:指定输出文件的名称。提取的帧将保存为 JPG 格式的图像文件。
然后我们在首帧图像上实施crop操作,观察结果:
1 | crop="1300:1300:0:120" |
查看视频的FPS
1 | ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of default=noprint_wrappers=1:nokey=1 video_file.mp4 | bc |
MacOS安装FFmpeg
返回目录
目前直接brew安装即可,但是执行前,首先确保xcode工具已经更新,是最新,然后确保brew工具更新到最新
1 | brew update |
最后直接brew安装ffmpeg即可
1 | brew install ffmpeg |
Linux无Root权限安装FFmpeg
返回目录
首先,我们在http://ffmpeg.org/releases
这个网址找到可用的ffmpeg版本,并下载
wget http://ffmpeg.org/releases/ffmpeg-{指定版本号}.tar.bz2
进入文件夹
1 | ./configure --enable-libmp3lame --enable-libx264 --enable-gpl --prefix={自定义的路径} |
安装完成后会在prefix所指示目录下生成bin, include, lib, share几个文件夹,然后开始编辑.bashrc
文件,让其可以访问到bin中的内容即可。