# 计算input.mp4的帧数
ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 input.mp4

​ -v error:这隐藏了“info”输出

​ -count_frames:计算每个流的帧数,并在相应的流部分中报告。

​ -select_streams v:0 :仅选择视频流

​ -show_entries stream = nb_read_frames :只显示读取的帧数。

​ -of default = nokey = 1:noprint_wrappers = 1 :将输出格式(也称为“writer”)设置为默认值,不打印每个字段的键(nokey = 1),不打印节头和页脚(noprint_wrappers = 1)。

# 读取test.avi后,用H.264以400kbps码率压缩成test1.mp4文件
ffmpeg -i test.avi -c:v libx264 -b:v -c:a copy -vsync passthrough 400k test1.mp4

​ -i test.avi 输入文件

​ -c:v libx264 编码方式 H.264

​ -b:v 400k 码率400kbps

​ -c:a copy 音频不变

​ -vsync passthrough 每一帧从解码器到编码器,时间戳保持不变

​ cfr 如果指定了输出帧率,输入帧会按照需要进行复制(如果输出帧率大于输入帧率)或丢弃(如果输出帧率小于输入帧率)

​ vfr 输入帧从解码器到编码器,时间戳保持不变;如果出现相同时间戳的帧,则丢弃之

​ drop 同 passthrough,但将所有帧的时间戳清空

# 将两段视频合成为一段concatenate:
ffmpeg -i object_005.mp4 -i background_005.mp4 -filter_complex "[0:v][1:v]concat=n=2:v=1" -vsync vfr output.mp4

​ -i 两段视频

​ -filter_complex video流 concatenate

​ -vsync 自动同步

# 无损改变视频容器
ffmpeg -i 001.mp4 -vcodec copy -acodec copy output.avi

​ -i 输入视频

​ -vcodec 视频编解码器

​ -acodec 音频编解码

​ 输出路径

# 读取视频文件,输出文件的每一帧信息到json
ffprobe -show_frames -select_streams v:0 -print_format json 001.avi > frames_info.json
# 获取视频帧率
ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of default=noprint_wrappers=1:nokey=1 001.avi

​ -v error 设置日志级别为error,以减少输出中的冗余信息。

​ -select_streams v:0 选择第一个视频流(视频流索引从0开始)。如果你的视频文件中包含多个视频流,并且你想获取特定一个的帧率,这个选项就很有用。

​ -show_entries stream=r_frame_rate:仅显示所选流的帧率信息。r_frame_rate是FFmpeg中表示帧率的字段。

​ -of default=noprint_wrappers=1:nokey=1:设置输出格式,去除额外的包装和键名,只保留值。

# 获取视频宽高
ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of default=nokey=1:noprint_wrappers=1 001.avi
# 指定抽取时间戳上的视频帧
ffmpeg -i L_Direct_30.avi -ss 00:00:01.123 -vframes 1 1.jpg

​ -i 输入视频

​ -ss 时间戳

​ -vframes 1 仅抽取一帧,抽完退出

# 按时间裁剪视频
ffmpeg -ss 00:00:00 -i video_tiny_display.mp4 -c copy -t 00:00:10 out.mp4

​ -ss 分割起始时间

​ -i 输入视频

​ -t 分割的持续时间,时分秒