目录
命令格式:
ffmpeg -i [输入文件名] [参数选项] -f [格式] [输出文件]
-acodec:音频选项
-vcodec:视频选项
一、获取视频信息
ffmpeg -i test.mp4
二、转视频/音频格式
1.视频格式转换
#mp4转flv
ffmpeg -i test.mp4 -f flv test.flv |
或者
ffmpeg -i test.mp4 -vcodec copy -acodec copy test.flv 上面的命令表式的是音频、视频都直接 copy,只是将 mp4 的封装格式转成了flv。 -i: 输入文件 -vcodec copy : 视频编码处理方式,不重编解码 -acodec copy: 音频编码处理方式,不重编解码 |
#h264转mp4
ffmpeg -i test.h264 -f mp4 test.mp4 |
#mp4提取yuv
ffmpeg -i test.mp4 -an -c:v rawvideo -pixel_format yuv420p test.yuv ffplay -s (wxh分辨率,stream中看) out.yuv -an: a代表audio,n代表no不包括音频的 -c:v rawvideo 指定将视频转成原始数据 -pixel_format yuv420p 指定转换格式为yuv420p(4:2:0) |
#yuv转h264
ffmpeg -f rawvideo -pix_fmt yuv420p -s 320x240 -r 30 -i out.yuv -c:v libx264 -f rawvideo out.h264 |
#-acodec copy 音频流执行copy,不重新编解码; 视频流会重新解码、编码
ffmpeg -i test.mp4 -acodec copy -f mp4 test_output.mp4 |
#-vcodec copy 视频流执行copy,,不重新编解码;音频流会重新解码、编码
ffmpeg -i test.mp4 -vcodec copy -f mp4 test_output.mp4 |
#-codec copy 音频流和视频流都不会重新解码、编码
ffmpeg -i test.mp4 -codec copy -f mp4 output.mp4 |
2.音频格式转换
#mp4转aac
不重编码(可能转出的aac文件无法播放,需要重编码才能使用)
ffmpeg -i test.mp4 -vn -acodec copy test.aac |
重编码
ffmpeg -i test.mp4 -vn -acodec aac test.aac |
#mp3 转 pcm
#大端格式
ffmpeg -i test.mp3 -f s16be -ar 16000 -ac 1 -acodec pcm_s16be pcm16k.pcm |
#小端格式
ffmpeg -i test.mp3 -f s16le -ar 16000 -ac 1 -acodec pcm_s16le pcm16k.pcm |
注:s16be 大端格式,s16le 小端格式。ar:采样率,-ac:声道
#mp4 转 pcm
ffmpeg -i test.mp4 -vn -ar 44100 -ac 2 -f s16le test.pcm |
播放的时候参数也要和上面一样,因为不知道你用什么采样率和声道是啥
ffplay -ar 44100 -ac 2 -f s16le -i out.pcm -vn: v代表video,n代表不要视频 -ar: a代表audio,r代表read,采样率44100 44.1k -ac: a代表audio,c2代表双声道还有立体声,环绕立体声 -f: 音频抽取出来的存取格式, s16 s代表有符号的,每一位16位表示 |
三、音视频分离
#去除音频、只留视频(-an audio no,去除音频)
ffmpeg -i test.mp4 -vcodec copy -an output.mp4 |
#去除视频、只留音频(-vn video no,去除视频)
ffmpeg -i test.mp4 -acodec copy -vn output.mp4 |
四、图像处理
- 截取一段视频:
ffmpeg -i test.mp4 -ss 8 -t 2 -s 1280x720 -codec copy -f flv test1.flv |
-ss 开始时间:set the start time offset,单位秒,-t 持续时间 -s 分辨率。截取原视频中从第8秒开始,持续时间2秒的视频。输出分辨率1280x720
2.添加图片水印:
ffmpeg -i test.mp4 -vf "movie=logo.jpg[watermark];[in][watermark] overlay=100:200[out]" output.mp4 |
-vf 使用滤镜,movie是滤镜的一种,添加的图片是logo.jpg。overlay(覆盖):显示位置是x=100,y=200
3.添加图片水印:
ffmpeg -i test.mp4 -i logo.jpg -filter_complex overlay test1.mp4 |
filter_complex 复杂滤波器 overlay:覆盖
4.添加文字水印:
ffmpeg -i test.mp4 -vf "drawtext=fontfile=msyh.ttc: text='welcome':x=100:y=10:fontsize=24:fontcolor=yellow:shadowy=2" drawtext.mp4 |
fontfile 字体文件,在C:\Windows\Fonts有很多
五、视频旋转
#顺时针旋转90度(顺时针旋转90°)
ffmpeg -i test.mp4 -vf "transpose=1" out.mp4 |
#逆时针旋转90度(逆时针旋转90°)
ffmpeg -i test.mp4 -vf "transpose=2" out.mp4 |
#水平翻转视频画面:
ffmpeg -i test.mp4 -vf hflip out.mp4 |
#垂直翻转视频画面:
ffmpeg -i test.mp4 -vf vflip out.mp4 |
六、改变视频分辨率
要使用FFmpeg修改视频分辨率,可以采用以下命令:
ffmpeg -i 输入文件 -vf scale=宽度:高度 输出文件 |
其中,输入文件是原始视频文件的路径,输出文件是转换后的视频文件的路径。宽度和高度是你想要设置的视频分辨率的尺寸。例如,如果你想要将视频分辨率改为640x360,那么命令应该是:
ffmpeg -i video_1920.mp4 -vf scale=640:360 video_640.mp4 |
如果只提供宽度,高度可以设置为-1,这样FFmpeg会自动计算高度以保持视频的宽高比。例如:
ffmpeg -i input.mp4 -vf scale=640:-1 output.mp4 |
#把分辨率变成两倍,也可以*0.5变成二分之一
ffmpeg -i 文件名.mp4 -vf scale=iw*2:ih*2 文件名.mp4 |
七、截取时间段范围
使用 ffmpeg 截取视频的某一个时间段,可以结合以下3个选项:
-ss time_off 设置开始时间的偏移量 -to time_stop 记录或转码停止时间 -t duration 记录或转码音频视频的“持续时间”秒 |
使用 -ss 选项指定需要截取的开始时间,结合 -to 或者 -t。
使用 -to 选项
to 指定结束的时间点,以下命令将截取视频文件 input.mp4 从 00:00:05.000 开始,到 00:00:15.000 结束这一段视频。
ffmpeg -i input.mp4 -ss 00:00:05.000 -to 00:00:15.000 output.mp4 |
使用 -t 选项
t 指定持续时间,以下命令将截取视频文件 input.mp4 从 00:00:05.000 开始,持续 10 秒的一段视频。
ffmpeg -i input.mp4 -ss 00:00:05 -t 10 output.mp4 |
避免关键帧丢失并精确截取时间
如果您需要重新编码视频以避免关键帧丢失并精确截取时间,可以使用以下命令:
ffmpeg -ss [开始时间] -t [持续时间] -i [输入文件].mp4 -c:v libx264 -c:a aac -strict experimental -b:a 98k [输出文件].mp4 |
八、视频倒放&视频加速&视频减速
#视频倒放、音频不变:
ffmpeg -i inputfile.mp4 -vf reverse reversed.mp4 |
#音视频同时倒放:
ffmpeg -i inputfile.mp4 -vf reverse -af areverse -preset superfast reversed.mp4 |
#视频2倍速播放:
ffmpeg -i inputfile.mp4 -vf setpts=PTS*0.5 -af atempo=2 output.mp4 |
说明:
-i 输入文件 指定输入文件的路径。 -vf "setpts=PTS/2" 是一个视频滤镜,用于视频的原始播放速度加快一倍。setpts滤镜设置时间戳的比例,这里设置为0.5,即2倍速。 -af "atempo=2" 是一个音频滤镜,用于将音频的播放速度加快一倍。atempo滤镜改变音频流的播放速度,这里的值是2,表示将速度加快一倍。 输出文件 指定输出文件的路径。 |
九、视频合并(多个视频合并成同一个视频)
#MPEG格式的(视频尺寸要一致):
ffmpeg -i concat:"1.mpg|2.mpg|3.mpg" -c copy output.mp4 |
#对于非MPEG格式的,可以先转成MPEG格式(mp4转MPEG格式):
ffmpeg -i 1.mp4 -qscale 4 1.mpg |
将多个mp4文件合并为一个mp4文件
1.将多个mp4文件放在同一文件夹内
2.新建video.txt文件,将要合并的文件按如下格式写入
file '01.mp4' file '02.mp4' file '03.mp4' |
3.命令行执行即可
ffmpeg -f concat -i video.txt -c copy output.mp4 |
十、视频拼接(画面拼接)
#左右拼接(hstack 左右拼接, vstack 上下拼接):
ffmpeg -i test.mp4 -i test1.mp4 -lavfi hstack output.mp4 |
#3个视频左右拼接:
ffmpeg -i input1.mp4 -i input2.mp4 -i input3.mp4 -lavfi hstack=inputs=3 output.mp4 |
十一、查看编解码相关
ffmpeg -encoders // 查看可用的编码器
ffmpeg -decoders // 查看可用的解码器
ffmpeg -hwaccels // 显示系统支持的硬件加速解码器列表
ffmpeg -demuxers // 显示系统支持的解复用器列表
十二、图片格式转换
#jpg转yuv:
ffmpeg -i test.jpg -s 640x480 -pix_fmt yuv420p test.yuv |
#视频转gif:
ffmpeg -i test.mp4 out.gif //直接就能转成gif ffmpeg -i test.mp4 -ss 0 -t 2 -r 10 out.gif //截取视频中前两秒的视频转为gif,并将帧率改为10fps -r修改帧率 |
十三、接入音视频设备
#查看当前可用设备
ffmpeg -list_devices true -f dshow -i dummy |
其中Alternative name 就是音视频设备标识。
#接入视频设备并将视频流保存为文件
命令:
ffmpeg -f dshow -i video="name" video.mp4 ffmpeg -f dshow -i video="name" -vcodec libx264 output.mp4 //指定编码器 |
示例:
#接入音频设备并保存为文件
命令:
ffmpeg -f dshow -i audio="name" audio.mp4 ffmpeg -f dshow -i audio="name" -acodec aac audio.mp4 //指定编码器 |
示例:
#同时接入音视频设备并保存文件
命令:
ffmpeg -f dshow -i video="name" -f dshow -i audio="name" audioAndVideo.mp4 |
示例:
十四、ffmpeg推流(前提:已有rtmp和rtsp服务)
#推rtmp服务
推一次,udp协议
ffmpeg -re -i test.mp4 -vcodec copy -acodec copy -f flv rtmp://127.0.0.1:1935/live/stream0 |
循环推流,tcp协议
ffmpeg -re -stream_loop -1 -i test.mp4 -rtsp_transport tcp -vcodec copy -acodec copy -f flv rtmp://127.0.0.1:1935/live/stream0 |
#推rtsp服务
推一次,udp协议
ffmpeg -re -i test.mp4 -c copy -f rtsp rtsp://127.0.0.1:8554/stream0 |
循环推流,tcp协议
ffmpeg -re -stream_loop -1 -i test.mp4 -c copy -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/stream |
参数:-re 以流的方式读取 -f 为格式化输出到哪里 -stream_loop循环输入
#读取音视频设备推流到rtsp服务
ffmpeg -f dshow -i video="name" -vcodec libx264 -f rtsp rtsp://127.0.0.1:5545/live/stream |
示例:
十五、使用ffplay播放
#播放pcm格式音频
必须在播放时把pcm相关参数都写明,不然会播放失败
ffplay -ar 44100 -ac 2 -f s16le -i test.pcm |
#播放yuv数据
ffplay -pix_fmt nv12 -s 192x144 test.yuv |
#播放yuv中的Y平面
ffplay -pix_fmt nv21 -s 640x480 -vf extractplanes='y' test.yuv |
十六、使用FFMPEG分帧并保存
要将视频input.mp4分解成逐帧的PNG格式图片,并按照指定的命名格式保存,可以使用以下FFmpeg命令:
ffmpeg -i test.mp4 -vf "fps=1" data/%010d.png 命令解释: -i test.mp4:指定输入文件。 -vf "fps=1":视频过滤器,fps=1表示每秒提取一帧。如果要提取视频的每一帧,可以省略这个过滤器参数。 %010d.png:指定输出文件的路径和格式。data/是目标文件夹(需要提前创建目录),%010d表示序列号将被格式化为十位数,前面用0填充。 如果你想提取视频的每一帧,不限制于每秒一帧,可以使用以下命令: ffmpeg -i test.mp4 data/%010d.png 这会将test.mp4中的每一帧都保存为PNG图片在data目录下,文件名从0000000000.png开始,依次递增。 |