命令格式:
全局选项 + 输入文件选项 + 输出文件选项
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...
1 常用参数
主要参数:
-i 设定输入流
-ss 开始时间
-t 截取周期
-c copy 不转码
-preset ultrafast 最快速 , 放在-i输入文件后
-y 覆盖已存在同名文件
视频参数:
-b 设定视频流量(码率),默认为200Kbit/s -b:a 128k 设定音频码率 -b:v 2048k 设定视频码率
-r 设定帧速率,默认为25
-s 设定画面的宽与高
-aspect 设定画面的比例
-vn 不处理视频
-vcodec 设定视频编解码器,未设定时则使用与输入流相同的编解码器
音频参数:
-ar 设定采样率
-ac 设定声音的Channel数
-acodec 设定声音编解码器,未设定时则使用与输入流相同的编解码器
-an 不处理音频
2 常用命令示例
视频格式转换
#avi转mp4
ffmpeg -i input.avi output.mp4
#mp4转ts
ffmpeg -i input.mp4 output.ts
提取视频中的音频
#(-vn 不处理视频 ),-acodec copy , 表示音频不转码,直接copy
ffmpeg -i input.mp4 -acodec copy -vn output.aac
去除视频中音频
#-an 不处理音频,-vcodec copy表示视频不转码,直接copy,速度快
ffmpeg -i input.mp4 -vcodec copy -an output.mp4
合并音视频(给视频添加背景音乐)
# -c copy 表示不转码 直接copy
ffmpeg -i input.mp4 -i input.aac -c copy output.mp4
视频剪切截取
#-ss表示开始切割的时间,-t表示要切多少。上面就是从开始,切5秒钟出来
ffmpeg -ss 00:00:15 -t 00:00:05 -i input.mp4 -vcodec copy -acodec copy output.mp4
#时间参数也可如下:
ffmpeg -ss 15 -t 5 -i input.mp4 -vcodec copy -acodec copy output.mp4
切换分辨率及视频裁剪
ffmpeg -i input.mp4 -s 640x360 output.mp4 #切换分辨率
ffmpeg -i input.avi -vf scale=320:240 output.avi #-vf滤镜方式,指定分辨率宽高
ffmpeg -i input.avi -vf scale=320:-1 output.avi #只指定宽,高等比缩放
ffmpeg -i input.mp4 -vf crop=1920:1080:0:0 out.mp4 #裁剪宽高1920x1080,起始坐标x y(0,0)
增加上下黑边
ffmpeg -i input.mp4 -vf pad=720:1280:0:100:black output.mp4 #720:1280是输出视频的宽高,0:100是输入视频的起始位置,black是默认的
旋转
ffmpeg -i input.mp4 -metadata:s:v rotate="90" -codec copy output.mp4
修改码率
#指定输出视频码率4096
ffmpeg -i input.mp4 -b 4096k output.mp4
字幕
ffmpeg -y -i input.mp4 -vf subtitles=input.srt -c:v libx264 -c:a libvo_aacenc -preset slow -crf 10 output.mp4 #支持srt lrc字幕
ffmpeg -i input.mp4 -vf “ass=subtitle.ass” output.mp4 #ass字幕
ffmpeg -i subtitle.srt subtitle.ass #字幕转换
ffmpeg -i input.mp4 -i test.png -filter_complex “overlay=x=main_w-273:y=main_h-113,subtitles=test.srt:force_style=‘Shadow=1,Fontsize=12,MarginV=50’” output.mp4 #同时叠加水印图片及字幕
ffmpeg -i input.mp4 -filter_complex "subtitles=1.srt:force_style='Shadow=1,Fontsize=12,MarginV=50'" output.mp4 #字幕大小 阴影 下边距
文字水印
#添加文字水印
ffmpeg -i input.mp4 -vf "drawtext=fontfile=msyh.ttc: text='科学技术是第一生产力':x=100:y=100:fontsize=48:fontcolor=red:shadowy=3" output.mp4
去除水印
#去水印,delogo滤镜,模糊指定区域
ffmpeg -i 1.mp4 -preset ultrafast -filter_complex "delogo=x=1000:y=1:w=279:h=200" out.mp4
ffmpeg -i 1.mp4 -preset ultrafast -vf "delogo=x=1000:y=1:w=279:h=200" out.mp4
叠加图片
ffmpeg -i 1.mp4 -i 1.png -preset ultrafast -filter_complex "overlay=x=main_w-w:y=main_h-h" out.mp4
#overlay参数说明:main_w,main_h表视频的宽高; w,h表图片的宽高,可以省略x=还有y=, 写成如overlay=100:200, 相当于x=100:y=200, 再如overlay=100,相当于x=100:y=0
分屏
ffmpeg -i input.mp4 -i input1.mp4 -filter_complex vstack=inputs=2 output.mp4 #上下分屏
ffmpeg -i input.mp4 -i input1.mp4 -filter_complex hstack=inputs=2 output.mp4 #左右分屏
图片与视频互转
ffmpeg -i input.mp4 -q:v 1 -vframes 5 frame%03d.jpg #取5张图片 -q:v 1 图片质量 数字越小 质量越高
ffmpeg -i input.mp4 -vf fps=1/3 frmae%03d.jpg #每隔3称取一张
#图片转视频
ffmpeg -i frame%03d.jpg out.mp4
快速视频拼接
H264视频首尾拼接
如果确定输入文件都是H264编码,且尺寸、帧率等都相同,先把源视频转换成用于直播的ts格式。 然后直接对多个ts文件进行文件级的拼接,然后在转换回到目标格式。这个过程中,不会发生格式转换,所以非常迅速。
ffmpeg -i q.mp4 -c copy -bsf h264_mp4toannexb q.ts
ffmpeg -i r.mp4 -c copy -bsf h264_mp4toannexb r.ts
ffmpeg -i "concat:q.ts|r.ts" -c copy -bsf aac_adtstoasc qr.mp4
屏幕录像
#录制桌面,无声音
ffmpeg -thread_queue_size 32 -f gdigrab -video_size 720*480 -offset_x 200 -offset_y 200 -i desktop -pix_fmt yuv420p record.mp4 # 录制桌面 (指定位置及大小,默认整个桌面,thread_queue_size指定处理线程数,不指定即默认)
#录制声音
ffmpeg -f dshow -list_devices true -i dummy # 查看当前的声音设备
ffmpeg -f dshow -rtbufsize 32M -i audio="Stereo Mix (Realtek High Defini" typing.wav #录制声音,audio设备是通过查看命令获得,有丢帧可以设置下更大缓冲区rtbufsize
# 同时录制桌面及声音
ffmpeg -f gdigrab -i desktop -f dshow -i audio="Stereo Mix (Realtek High Defini" -pix_fmt yuv420p record.mp4
注:在windows下可保存为.bat文件, 最后一行加上pause,出错不会立即退出,可以查看出错信息
ffplay播放
#窗口宽640,指定窗口标题“1”,1.5倍速播放
ffplay -x 640 -window_title 1 -vf setpts=PTS/1.5 -af atempo=1.5 test.mp4
#在播放中的几个实用的控制参数
'空格' 暂停
'w' 切换显示模式(视频/音频波形/音频频带)
's' 步进到下一帧
'left/right' 快退/快进 15 秒
'down/up' 快退/快进 60秒
'鼠标右击' 跳转到鼠标点击的位置(根据鼠标在显示窗口点击的位置计算百分比)