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
2
3
#scale后面可以指定具体的分辨率宽:高,作用同-s,也可以只指定宽或者高,
#另一者用-d代替,ffmpeg就会自动缩放,保持原比例
ffmpeg -i input.mp4 -vf "scale=480:-1" out3.gif

从原来的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
2
ffmpeg -i input.mp4 -ss 73.5 -t 12 out.gif
ffmpeg -i input.mp4 -ss 00:01:13.500 -t 12 out.gif

图片处理

返回目录

Resize图片

1
2
3
4
ffmpeg -i image_source -vf scale=width:height out_source
#width为压缩后的图片宽度
#height为压缩后的图片高度
#当width或height其中有一个数值为-1时将保持原来图片尺寸比例压缩

图片裁剪

1
2
3
4
5
6
ffmpeg -i image_source -vf crop=width:height:from_x:from_y out_source
#width是要裁剪出的图片的宽度
#height是要裁剪出的图片的高度
#from_x是裁剪的起始X轴的位置
#from_y是裁剪的起始Y轴的位置
#如果不指定from_x和from_y表示从原始图片中心位置开始裁剪

图片添加水印

1
2
3
4
5
6
7
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
#logo_source为水印图片地址
#logo_width为水印图片的宽度
#logo_height为水印图片的高度
#opacity_num为水印图片的透明度
#from_x为水印的起始X轴的位置
#from_y为水印的起始Y轴的位置

图片添加中文水印

1
2
3
4
5
6
7
8
9
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
#font_ttf_path为字体路径,此项必须设置否则会出现字体无法找到的错误;
#字体路径要设置绝对路径并且要注意路径正反斜线转义(例如C\\:/Windows/Fonts/simhei.ttf)
#font_color为字体的颜色
#font_size为字体的大小
#message_info为水印文字内容
#from_x为水印的起始X轴的位置
#from_y为水印的起始Y轴的位置
#如果水印内容是中文需要设置中文字体否则会文字显示乱码

图片旋转指定的角度

1
2
3
4
5
6
7
8
9
ffmpeg -i image_source -vf rotate=route_num*PI/180 -y  out_source
#route_num是要旋转的角度
#当route_num大于0的时候顺时针旋转,当route_num小于0的时候逆时针旋转

ffmpeg -i image_source -vf transpose=route_number -y out_source
#route_number=0顺时针旋转90度再左右镜像
#route_number=1顺时针旋转90度
#route_number=2逆时针旋转90度
#route_number=3逆时针旋转90度再左右镜像

图片上下左右镜像

1
2
3
ffmpeg -i image_source -vf hflip out_source

ffmpeg -i image_source -vf vflip out_source

视频裁剪

主代码

1
2
3
4
5
6
video_path=''
fps=25
crop="1300:1300:0:120"
resize=512
out_name="out"
ffmpeg -y -i $video_path -vf "fps=$fps, crop=$crop, scale=$resize:$resize" -c:v libx264 $video_folder/"$out_name_cropped.mp4"

裁剪位置测试

对于输入的视频,如果不知道如何设置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
2
3
4
crop="1300:1300:0:120"
input_name="inputs.jpg"
output_name="outputs.jpg"
ffmpeg -i $input_name -vf crop=$crop $output_name -y

查看视频的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
2
3
4
./configure --enable-libmp3lame --enable-libx264 --enable-gpl --prefix={自定义的路径}
# 比较关键的在于--prefix,由于我们没有管理员权限,所以设置的安装位置在本地
make
make install

安装完成后会在prefix所指示目录下生成bin, include, lib, share几个文件夹,然后开始编辑.bashrc文件,让其可以访问到bin中的内容即可。

作者

Jiawei Li

发布于

2024-05-30

更新于

2024-06-02

许可协议