FFmpeg官方文档
https://ffmpeg.org/ffmpeg-all.html
https://ffmpeg.org/ffmpeg.html
视频信息
ffmpeg -i input.mp4
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: mp42mp41
creation_time : 2022-01-12T11:23:45.000000Z
Duration: 00:00:59.52, start: 0.000000, bitrate: 12123 kb/s
Stream #0:0[0x1](eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1080x1920 [SAR 1:1 DAR 9:16], 11802 kb/s, 25 fps, 25 tbr, 25k tbn (default)
Metadata:
creation_time : 2022-01-12T11:23:45.000000Z
handler_name : ?Mainconcept Video Media Handler
vendor_id : [0][0][0][0]
encoder : AVC Coding
Stream #0:1[0x2](eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 317 kb/s (default)
Metadata:
creation_time : 2022-01-12T11:23:54.000000Z
handler_name : #Mainconcept MP4 Sound Media Handler
vendor_id : [0][0][0][0]
- Metadata
- Stream #0:0 Video
- 视频h264编码
- yuv420p存储格式
- 分辨率 1080x1920
- 采样纵横比 SAR 1:1
- 显示宽高比 DAR 9:16
- 码率 11802 kb/s
- 平均帧率 25 fps
- 帧率 该参数倾向于一个基准,往往tbr跟fps相同 25 tbr
- 视频流 timebase 25k tbn
- Stream #0:1 Audio
- 音频aac编码
- 采样率 48000Hz
- 声道是立体声 stereo
- 重采样 fltp格式
- 码率 317 kb/s
- Stream #0:0 Video
- 视频大小描述
- 视频文件大小:(11802 + 317) * 59.52 / 8 | (音频码率 + 视频码率) x 时长 / 8
- 码率:视频文件大小 * 8 / 时长 (秒)
Command Line (视频基于H.264Encode)
压缩
Reference
画质 | 视频分辨率 | H.264转码码率 | H.265转码码率(比H.264下降30%) |
---|---|---|---|
流畅(360P) | 640*360 | 400Kbps | 280Kbps |
标清(480P) | 854*480 | 600Kbps | 420Kbps |
高清(720P) | 1280*720 | 1000Kbps | 700Kbps |
超清(1080P) | 1920*1080 | 2000Kbps | 1400Kbps |
2K | 2560*1440 | 7000Kbps | 4900Kbps |
4K | 3840*2160 | 8000Kbps | 5600Kbps |
# 固定目标码率模式
# 压缩视频码率为 3096k 35 fps 视频采用h264编码 音频采用aac编码
# -threads 核心线程数 (auto,0) 默认为auto
# -b:v 视频码率 b=bit rate v=video 3096 kbit/s
# -r 帧率 r=frame rate 35 fps
# -c:v 视频编码 c=codec v=video libx264=h264
# -acodec 音频编码 a=audio aac
# -y 直接覆盖文件不用询问
ffmpeg -y -threads 0 -i input.mp4 -b:v 3096k -r 35 -c:v libx264 -acodec aac result.mp4
# 参考下面几篇文章 讲解很棒
# 恒定速率因子模式 crf
# -crf 取值范围 0-51
# https://trac.ffmpeg.org/wiki/Encode/H.264
# https://www.cnblogs.com/dhcn/p/7130474.html
# https://www.cnblogs.com/dhcn/p/7130474.html
ffmpeg -y -i input.mp4 -c:v libx264 -crf 28 -acodec aac result.mp4
推流
# rtmp推流 隐藏banner concat拼接多个视频
# -stream_loop -1 循环推流
# video_list.txt 格式
# file '1.mp4'
# file '2.mp4'
ffmpeg -hide_banner -safe 0 -re -stream_loop -1 -f concat -i video_list.txt -c:v libx264 -c:a aac -f flv rtmp://127.0.0.1
转码 mov转mp4
ffmpeg -y -i input.mov -c:v libx264 result.mp4
绿幕抠图
ffmpeg -i input_video.mp4 -i background.jpg -filter_complex "[0:v]scale=688:1188,chromakey=0x00FF00:0.1:0.2[fg];[1:v][fg]overlay[outv]" -map "[outv]" -c:v libx264 -preset ultrafast -crf 23 -c:a copy output_video.mp4
裁剪
# 两个例子都是从0秒开始截一张图
# -ss 从0秒开始 把-ss 0 放到第一个参数的位置,速度比放到放到其他位置快
# -vframes 截图帧数 或者使用-t : 截图时长 seconds
# -s 图片宽高比
ffmpeg -ss 0 -i input.mp4 -r 1 -vframes 1 -s 352x240 -y result%d.jpg
ffmpeg -ss 00:00:00 -i input.mp4 -r 1 -t 1 -y result%d.jpg
# 截音频 0-10秒
ffmpeg -ss 00:00:00 -i input.mp3 -to 00:00:10 -acodec copy result.mp3
# 截音频 10秒后
ffmpeg -ss 00:00:10 -i input.mp3 -acodec copy result.mp3
视频转图片(每隔一秒截取一张图)
# -q:v Quality factor. Lower is better.
ffmpeg -y -i input.mp4 -f image2 -r 1 -q:v 10 result%3d.jpg
音视频倍速
# 2倍速
ffmpeg -y -i input.mp4 -filter:v "setpts=0.5*PTS" -filter:a "atempo=2.0" result.mp4
视频添加水印
# x和y表示水印在视频中的位置,视频左上角坐标为(0,0),向右向下延伸
ffmpeg -y -i input.mp4 -i watermark.png -filter_complex "overlay=x=0:y=0" result.mp4
# main_w(W):主画面的宽度
# main_h(H):主画面的高度
# overlay_w(w):水印宽度
# overlay_h(h):水印高度
# overlay=x=W-w:y=0 右上角
# overlay=x=0:y=H-h 左下角
# 水印位置的写法:
# 绝对位置:50:50 以左上角为0:0定位
# 图片水印
# 左下角50x50:x=50:y=main_h-overlay_h-50
# 左上角50x50:x=50:y=50
# 右下角50x50:x=main_w-overlay_w-50:y=main_h-overlay_h-50
# 右上角50x50:x=main_w-overlay_w-50:y=50
# 顶部居中:x=main_w/2-overlay_w/2:y=50
# 底部居中:x=main_w/2-overlay_w/2:y=main_h-overlay_h-50
# 左垂直居中:x=50:y=main_h/2-overlay_h/2
# 右垂直居中:x=main_w-overlay_w-50:y=main_h/2-overlay_h/2
# 完全居中:x=main_w/2-overlay_w/2:y=main_h/2-overlay_h/2
# 文字水印:
# overlay_w 换成 text_w
# overlay_h 换成 line_h
# 顶部居中:x=main_w/2-text_w/2:y=50
# 底部居中:x=main_w/2-text_w/2:y=main_h-line_h-50
# 左垂直居中:x=50:y=main_h/2-line_h/2
# 右垂直居中:x=main_w-text_w-50:y=main_h/2-line_h/2
# 完全居中:x=main_w/2-text_w/2:y=main_h/2-line_h/2
ffmpeg -y -i input.mp4 -i watermark.png -filter_complex "overlay=x=0:y=H-h" result.mp4
# gif水印
# -ignore_loop为0,让gif保持循环播放
# -shortest 将输出文件的时长设置为第一个视频文件的时长,如果不设置,你会发现命令会一直执行根本不会停下来,因为gif图的循环是无限的
ffmpeg -y -i input.mp4 -ignore_loop 0 -i watermark.gif -filter_complex overlay -shortest result.mp4
# 左上 左下 两个水印
ffmpeg -y -i input.mp4 -i watermark.png -i watermark2.png -filter_complex "overlay=x=0:y=0,overlay=x=0:y=H-h" result.mp4
# 水印显示5秒,5秒后消失
ffmpeg -y -i input.mp4 -i watermark.png -filter_complex "overlay=enable='lte(t,5)'" result.mp4
# 第一个水印显示4秒后消失,2秒后第二个水印显示4秒后消失。
ffmpeg -y -i input.mp4 -i watermark.png -i watermark2.png -filter_complex "overlay=enable='lte(mod(t,10),4)',overlay=enable='gt(mod(t,10),6)'" result.mp4
# 让水印每秒向右移动20像素,直到消失
ffmpeg -y -i input.mp4 -ignore_loop 0 -i watermark.gif -lavfi "overlay=x=t*20" -shortest result.mp4
# 让水印一直旋转
ffmpeg -y -i input.mp4 -loop 1 -i watermark.png -lavfi "[1:v]format=rgba,rotate='PI/2*t:c=0x00000000:ow=hypot(iw,ih):oh=ow'[out];[0:v][out]overlay=10:10" -shortest result.mp4
# 去除水印
# x —— 水印横坐标
# y —— 水印纵坐标
# w —— 水印宽
# h—— 水印高
ffmpeg -y -i input.mp4 -vf "delogo=x=x:y=y:w=w:h=h" result.mp4