由于ffmpeg对我来说不常用,所以基本每次用都得百度一会,而且好用的命令并不多,所以记录一下我用过的命令。
截取mp4
ffmpeg -ss 1:18 -t 4:07 -accurate_seek -i input.mp4 -codec copy -avoid_negative_ts 1 out.mp4
其中, -ss 1:18 -t 4:07 表示从从视频的第1:18开始截取4:07的视频提取音频
ffmpeg -i input.mp4 -vn -y -acodec copy bt.aac
合并mp4
1 2 3 4
#转成ts后拼接 ffmpeg -i 1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 1.ts ffmpeg -i 2.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb 2.ts ffmpeg -i "concat:1.ts|2.ts" -acodec copy -vcodec copy -absf aac_adtstoasc output.mp4
MP4 -> GIF
ffmpeg -ss 2 -t 10 -i out.ogv -s 649x320 -r 15 out.gif
其中, -ss 2 -t 12 表示从从视频的第2秒开始转换, 转换时间长度为10秒. -s用于设定大小, -r 用于设定帧数.
使用默认的ffmpeg转换后的gif图片像素会有抖动,因此需要使用滤镜:
1 2 3 4 5
#!/bin/sh palette="/tmp/palette.png" filters="fps=15,scale=320:-1:flags=lanczos" ffmpeg -v warning -i $1 -vf "$filters,palettegen" -y $palette ffmpeg -v warning -i $1 -i $palette -lavfi "$filters [x]; [x][1:v] paletteuse" -y $2
将上述命令保存为a.sh,使用
./a.sh input.mp4 out.gif
生成更清楚的gif图像,其中scale用来调整尺寸,可自行更改单张图片和一段音频合成视频
ffmpeg -r 1 -f image2 -loop 1 -i in.jpg -i in.aac -s 1920x1200 -pix_fmt yuvj420p -t 336 -vcodec mpeg4 out.mp4
-r 是帧数,因为只有一张图片所以设置为1,我原本用的是15,成品画质极差而且转码时间很长。
-loop 由于只有一张图片,循环
-s 分辨率,可随意设置,最好和图片等比
-t 视频时长 单位秒,必须和音频等长,若短则后面被剪切。若长还不是后面没声音,而是音轨出现漂移时有时无音视频合并
分两种情况, 命令不相同原视频没有音频
ffmpeg -i video.mp4 -i audio.wav -c:v copy -c:a aac -strict experimental output.mp4
原视频有音频,使用新的音频替换视频中的音频
ffmpeg -i video.mp4 -i audio.wav -c:v copy -c:a aac -strict experimental -map 0:v:0 -map 1:a:0 output.mp4