欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

6、FFmpeg 视频处理

程序员文章站 2024-01-16 19:56:04
...

1、剪切获取指定时间段的视频

# 剪切获取从视频的第 50s 开始(-ss 50)往后的 20s 的视频
# 将获取的视频存入 output.mp4,且不进行重编码
ffmpeg -i input.mp4 -ss 50 -codec copy -t 20 output.mp4

2、视频合并

# Cam.txt 文件内容格式如下:
# 	file /input/file-1.mp4
# 	file '/input/file 2.mp4'  			 # 文件名中有空格的情况
# 	file '/input/file 3'\''.mp4'  		 # 文件名中有单引号的情况
# 注意:Cam.txt文件必须和要合并的文件位于同一目录下

ffmpeg -f concat -i Cam.txt -c copy Cam01.mp4

3、视频抽取(即不要音频,只获取视频)

# 抽取input.mp4文件的视频存入output.mp4 -an表示不处理音频
ffmpeg -i input.mp4 -an -vcodec copy output.mp4

4、对视频进行拉伸补齐

eg:如果将一个 1 分钟的视频拉伸为 130 秒(相当于对视频进行了慢放)
例如:对一个帧率为 241 分钟视频进行拉伸,拉伸为 2 分钟:

# 1、将视频帧率修改为原来的 2 倍
ffmpeg -i input.mp4 -r 48 input_1.mp4

# 2、修改视频的 pts
ffmpeg -i input_1.mp4 -filter:v "setpts=2*PTS" input_2.mp4

# input_2.mp4的播放时长就是 input.mp4的两倍,且帧率相同。

5、缩放视频

# 假设原始视频的尺寸为 1080p (即 1920 * 1080 px),下面的命令可以将视频缩小到 480p

ffmpeg -i a.mp4 -vf scale=853:480 -acodec aac -vcodec h264 out.mp4

参数解析:

# -i a.mp4 指定待处理的视频文件
# -vf scale=853:480  vf:用于指定视频滤镜,其中 scale 表示缩放,后面的数字表示缩放至 853*480 是等比例缩放的。
# -acodec aac 指定音频使用 aac 编码
# -vcodec h264 指定视频使用 h264 编码。
# out.mp4 为输出文件名
# scale设置缩放比例时,也可以让其根据原始视频的宽高比自动计算。scale=-1:480 或 scale=480:-1

6、裁剪视频

# 例如:有个竖向的视频 1080*1920,如果只想保留中间的 1080*1080 部分,可以使用如下的命令:
ffmpeg -i a.mp4 -strict -2 -vf crop=1080:1080:0:420 out.mp4

# 视频的缩放和裁剪是可以同时进行的:
ffmpeg -i a.mp4 -strict -2 -vf scale=853:480,crop=480:480:186:0 out.mp4

参数解析:

crop=width:height:x:y 其中 width 和 height 表示裁剪后视频的尺寸,x:y 表示参见区域的左上角坐标。
# 比如上面的裁剪需求,我们只需要保留属相视频的中间部分,所以 x 不用偏移,故传入 0,而 y 则需要乡下偏移:(1920-1080)/ 2 = 420

7、改变视频播放速度

# 将视频的播放速度提高一倍
ffmpeg -i input.mp4 -filter:v "setpst=0.5*PTS" -an out.mp4
# 滤波器通过改变视频帧的呈现时间戳(PTS)来改变视频的播放速度
# 注意: 此方法是使用丢帧的方式来实现所需的播放速度的

# 可以通过制定比输入更高的输出帧速率来避免丢帧
# 例如:从 4 FPS 的输入到加速 4 倍(16 FPS)的输入:
ffmpeg -i input.mp4 -r 16 -filter:v "setpts=0.25PTS" -an out.mp4

# 将视频的播放速度变为原来的 2 倍
ffmpeg -i input.mp4 -filter:v "setpts=2*PTS" -an out.mp4

### 上面的这些方法中,音频流并不会更改,因此使用 -an 禁用

8、给视频添加/删除水印

# 添加水印
ffmepg -i input.mp4 -vf "movie=logo.png,scale=64:48[watermask];[in][watermask] overlay=30:10 [out]" water.mp4
# -vf中的 movie 指定 logo 的位置,scale 指定 logo 的大小,overlay 指定 logo 的位置(logo左上角坐标),x 的作为为 30,y 的坐标为 10

# 删除水印
# 先通过 ffplay 找到要删除的 logo
ffplay -i input.mp4 -vf delogo=x=806:y=20:w=70:h=80:show=1
# x,y 表示 logo 的左上角坐标,w,h 表示 logo 的宽和高

# 使用 delogo 过滤器删除 logo
ffmpeg =i input.mp4 -vf delogo=x=806:y=20:w=70:h=80 output.mp4

9、对称视频

ffmepg -i input.mp4 -filter_complex "[0:v]pad=w=2*iw[a];[0:v]hflip[b];[a][b]overlay=x=w" output.mp4
# hflip 水平翻转
# 如果想要改为垂直翻转可以用 vflip

10、视频抽帧

# 规律抽帧:每秒几帧或几秒一帧
# -vf 视频过滤器, fps=fps=1 表示抽帧的频率,1表示1秒抽一张,如果fps=fps=2 表示一秒抽2张,fps=fps=1/2表示 2s 一张
# 使用-r同样可以达到-vf fps=fps=1的效果,但是使用后者更准确
ffmpeg -i test.mp4 -f image2 -vf fps=fps=1 image-%3d.jpg
ffmpeg -i test.mp4 -r 1 -f image2 image-%5d.jpg

# 从指定时刻开始,规律抽帧
# 从10s开始,每秒抽一帧
ffmpeg -i test.mp4 -ss 00:00:10 -f image2 -vf fps=fps=1 image-%3d.jpg

# 指定时刻抽取一帧
# -ss 从指定时间(秒)开始抽取一帧
# -y 表示覆盖已有文件
ffmpeg -i input.mp4 -y -f image2 -ss 00:01:00 -vframes 1 output.jpg

# 抽取指定时刻内所有帧
# 抽取指定时间段内的所有帧
# 从00:00:01开始,抽取时长1s以内的所有帧
# -t指定时长
ffmpeg -i test.mp4 -f image2 -ss 00:00:01 -t 1 image-%5d.jpg