1、转码:
1. ffmpeg -i 1.mp4 -vcodec h264 "output.mp4"
2. ffmpeg -i [input.file] -c:v libx264 output.mp4
2、压缩:
1. ffmpeg -i input.mp4 -r 10 -b:a 32k output.mp4
2. ffmpeg -i "1.wav" -b:a 64k -acodec mp3 -ar 44100 -ac 1 "1.mp3"
命令参数解释: -i "1.wav"
表示输入,后面的文件名必须要用双引号; -b:a 64k
表示音频的码率为64kb/s,即8kB/s; -acodec mp3
表示设定声音编解码器为mp3; -ar 44100
表示设定采样率为44100; "1.mp3"
表示输出保存的文件名。
3、移动moov:
ffmpeg -i input.mp4 -movflags faststart -acodec copy -vcodec copy output.mp4
批量处理:
for /R %v IN (*.mp4) do ( ffmpeg -i %v -vcodec h264 "path\%~nv.mp4")
也可以写一个脚本放到待转码视频的目录中,脚本代码如下,变量v前面比命令行多一个“%”:
for /R %%v IN (*.mp4) do ( ffmpeg -i %%v -vcodec h264 "path\%%~nv.mp4")
3.1 改变分辨率
ffmpeg -i input.mp4 -vf scale=480:-1 output.mp4
4、视频剪辑:
ffmpeg -ss 0:1:30 -t 0:0:20 -i input.avi -vcodec copy -acodec copy output.avi
-ss
代表开始时间 -t
持续时间
5、音频剪辑:
ffmpeg -i source_mp3.mp3 -ss 00:01:12 -t 00:01:42 -acodec copy output_mp3.mp3
6、分离视频流:
ffmpeg -i input_file -vcodec copy -an output_file_video
将视频拿出来,不包含音频
7、分离音频流:
ffmpeg -i input_file -acodec copy -vn output_file_audio
将音频拿出来,不包含视频
8、改变视频速率:
ffmpeg -i input.mkv -filter:v "setpts=0.5*PTS" output.mkv
0.5代表变为原来2倍速度,播放一段视频需要的时间为原来0.5倍。所以当这个值>1时就是减慢视频播放速度。
改变视频中音频sulvffmpeg -i input.mkv -filter:a "atempo=2.0" -vn output.mkv
为原来2倍,这个值在0.5到2之间,可以使用"atempo=2.0,atempo=2.0"
这种串联的形式增加播放速率到4倍
9、获取缩略图:
从指定时间开始,连续对1秒钟的视频进行截图:
ffmpeg -y -i input.mp4 -ss 00:05:25 -t 00:00:01 output_%3d.jpg
只截取一帧:
ffmpeg -ss 01:03:05 -i input -vframes 1 -q:v 2 output.jpg
-vframes 1
指定只截取一帧,-q:v 2
表示输出的图片质量,一般是1到5之间(1 为质量最高)。
10. 覆盖(画中画)
覆盖, 语法:overlay[=x[:y], 所有的参数都是可选,默认值都是0
举例
Logo在左上角: ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay pair1.mp4
右上角: ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w pair2.mp4
左下角: ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=0:H-h pair2.mp4
右下角: ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w:H-h pair2.mp4
删除logo, 语法:-vf delogo=x:y:w:h[:t[:show]]
x:y 离左上角的坐标
w:h logo的宽和高
t: 矩形边缘的厚度默认值4
show:若设置为1有一个绿色的矩形,默认值0.
ffplay -i jidu.mp4 -vf delogo=50:51:60:60:100:0
删除水印:ffmpeg -i 1.png -strict -2 -vf delogo=230:492:165:103:0 "new.png"
添加图片水印: ffmpeg -i inputfile -vf "movie=masklogo,scale= 60: 30[watermask]; [in] [watermask] overlay=30:10 [out]" outfile
参数说明:
marklogo:添加的水印图片;
scale:水印大小,水印长度*水印的高度;
overlay:水印的位置,距离屏幕左侧的距离*距离屏幕上侧的距离;mainW主视频宽度, mainH主视频高度,overlayW水印宽度,overlayH水印高度
11. 添加文本
语法:drawtext=fontfile=font_f:text=text1[:p3=v3[:p4=v4[…]]]
常用的参数值
x:离左上角的横坐标 y: 离左上角的纵坐标 fontcolor:字体颜色 fontsize:字体大小 text:文本内容
textfile:文本文件 t:时间戳,单位秒 n:帧数开始位置为0 draw/enable:控制文件显示,若值为0不显示,1显示,可以使用函数
简单用法
1、在左上角添加Welcome文字
ffplay -f lavfi -i color=c=white -vf drawtext=fontfile=arial.ttf:text=Welcom
2、在中央添加Good day
ffplay -f lavfi -i color=c=white -vf drawtext="fontfile=arial.ttf:text='Goodday':x=(w-tw)/2:y=(h-th)/2"
3、设置字体颜色和大小
ffplay -f lavfi -i color=c=white -vf drawtext="fontfile=arial.ttf:text='Happy Holidays':x=(w-tw)/2:y=(h-th)/2:fontcolor=green:fontsize=30"
动态文本
用 t (时间秒)变量实现动态文本
1、顶部水平滚动
ffplay -i jidu.mp4 -vf drawtext="fontfile=arial.ttf:text='Dynamic RTL text':x=w-t*50:fontcolor=darkorange:fontsize=30"
2、底部水平滚动
ffplay -i jidu.mp4 -vf drawtext="fontfile=arial.ttf:textfile=textfile.txt:x=w-t*50:y=h-th:fontcolor=darkorange:fontsize=30"
3、垂直从下往上滚动
ffplay jidu.mp4 -vf drawtext="textfile=textfile:fontfile=arial.ttf:x=(w-tw)/2:y=h-t*100:fontcolor=white:fontsize=30“
4.实现右上角显示当前时间?
动态文本
在右上角显示当前时间 localtime
ffplay jidu.mp4 -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text='%{localtime\:%H\\\:%M\\\:%S}'“
每隔3秒显示一次当前时间
ffplay jidu.mp4 -vf drawtext="fontfile=arial.ttf:x=w-tw:fontcolor=white:fontsize=30:text='%{localtime\:%H\\\:%M\\\:%S}':enable=lt(mod(t\,3)\,1)"
12. 图片处理
图片支持: FFmpeg支持绝大多数图片处理, 除LJPEG(无损JPEG)之外,其他都能被解码,除了EXR,PIC,PTX之外,所有的都能被编码。
截取一张图片使用 –ss(seek from start)参数: ffmpeg -ss 01:23:45 -i jidu.mp4 image.jpg
从视频中生成GIF图片: ffmpeg -i jidu.mp4 -t 10 -pix_fmt rgb24 jidu.gif
转换视频为图片(每帧一张图): ffmpeg -i clip.avi frame%4d.jpg
图片转换为视频: ffmpeg -f image2 -i img%4d.jpg -r 25 video.mp4
比如:图片名称全部是自然数, 001, 002, 003这样的3位数字,数字一定要是连续的否则会中断。文件存放在D:\pic下面
ffmpeg -f image2 -i D:\pic\%03d.jpg my.mp4
指定编码格式:
ffmpeg -f image2 -i D:\pic\%03d.jpg -vcodec libx264 my.mp4
指定输出帧率:
ffmpeg -f image2 -i D:\pic\%03d.jpg -vcodec libx264 -r 10 my.mp4
指定码率:
ffmpeg -f image2 -i D:\pic\%03d.jpg -vcodec libx264 -r 10 -b 200k my.mp4
裁剪: ffmpeg -f lavfi -i rgbtestsrc -vf crop=150:150 crop_rg.png
填充: ffmpeg -f lavfi -i smptebars -vf pad=360:280:20:20:orange pad_smpte.jpg
翻转: ffmpeg -i orange.jpg -vf hflip orange_hfilp.jpg
ffmpeg -i orange.jpg -vf vflip orange_vfilp.jpg
旋转: ffmpeg -i image.png -vf transpose=1 image_rotated.png
覆盖: ffmpeg -f lavfi -i rgbtestsrc -s 400x300 rgb .png
ffmpeg -f lavfi -i smptebars smpte.png
ffmpeg -i rgb .png -i smpte.png -filter_complex overlay= (W-w)/2:(H-h)/2 rgb_smpte.png
13.其他高级技巧
屏幕录像
显示设备名称: ffmpeg -list_devices 1 -f dshow -i dummy
调用摄像头: ffplay -f dshow -i video="Integrated Camera"
保存为文件: ffmpeg -y -f dshow -s 320x240 -r 25 -i video="Integrated Camera" -b:v 800K -vcodec mpeg4 new.mp4
添加字幕subtitles: 语法 –vf subtitles=file, ffmpeg -i jidu.mp4 -vf subtitles=rgb.srt output.mp4
视频颤抖: ffplay –i jidu.mp4 -vf crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2)*sin(n/10):(in_h-out_h)/2 +((in_h-out_h)/2)*sin(n/7)
色彩平衡: ffplay -i jidu.mp4 -vf curves=vintage
色彩变幻: fplay -i jidu.mp4 -vf hue="H=2*PI*t: s=sin(2*PI*t)+1“
彩色转换黑白: ffplay -i jidu.mp4 -vf lutyuv="u=128:v=128"
设置音频视频播放速度:
3倍视频播放视频: ffplay -i jidu.mp4 -vf setpts=PTS/3
?速度播放视频: ffplay -i jidu.mp4 -vf setpts=PTS/(3/4)
2倍速度播放音频: ffplay -i speech.mp3 -af atempo=2
截图
每隔一秒截一张图: ffmpeg -i input.flv -f image2 -vf fps=fps=1 out%d.png
每隔20秒截一张图: ffmpeg -i input.flv -f image2 -vf fps=fps=1/20 out%d.png
多张截图合并到一个文件里(2x3) ?每隔一千帧(秒数=1000/fps25)即40s截一张图
ffmpeg? -i jidu.mp4 -frames 3 -vf "select=not(mod(n\,1000)),scale=320:240,tile=2x3" out.png
马赛克视频
用多个输入文件创建一个马赛克视频:
ffmpeg -i jidu.mp4 -i jidu.flv -i "Day By Day SBS.mp4" -i "Dangerous.mp4" -filter_complex "nullsrc=size=640x480 [base]; [0:v] setpts=PTS-STARTPTS, scale=320x240 [upperleft]; [1:v] setpts=PTS-STARTPTS, scale=320x240 [upperright]; [2:v] setpts=PTS-STARTPTS, scale=320x240 [lowerleft]; [3:v] setpts=PTS-STARTPTS, scale=320x240 [lowerright]; [base][upperleft] overlay=shortest=1 [tmp1]; [tmp1][upperright] overlay=shortest=1:x=320 [tmp2]; [tmp2][lowerleft] overlay=shortest=1:y=240 [tmp3]; [tmp3][lowerright] overlay=shortest=1:x=320:y=240" -c:v libx264 output.mkv
Logo动态移动
2秒后logo从左到右移动: ffplay -i jidu.mp4 -vf movie=logo.png[logo];[in][logo]overlay=x='if(gte(t\,2)\,((t-2)*80)-w\,NAN)':y=0
2秒后logo从左到右移动后停止在左上角: ffplay -i jidu.mp4 -vf movie=logo.png[logo];[in][logo]overlay=x='if(gte(((t-2)*80)-w\,W)\,0\,((t-2)*80)-w)':y=0
每隔10秒交替出现logo: ffmpeg -y -t 60 -i jidu.mp4 -i logo.png -i logo2.png -filter_complex "overlay=x=if(lt(mod(t\,20)\,10)\,10\,NAN ):y=10,overlay=x=if(gt(mod(t\,20)\,10)\,W-w-10\,NAN ) :y=10" overlay.mp4
FFMpeg合并视频方法
先创建一个文本文件filelist.txt,然后用for循环输出以下内容:
file 'input1.mkv'
file 'input2.mkv'
file 'input3.mkv'
然后:
ffmpeg -f concat -i filelist.txt -c copy output.mkv
注意:使用 FFmpeg concat 分离器时,如果文件名有奇怪的字符,要在 filelist.txt 中转义.
FFmpeg对视频进行切片
切本地文件命令:ffmpeg -i test.ts -c copy -map 0 -f segment -segment_list playlist.m3u8 -segment_time 10 output%03d.ts
切网络地址命令:ffmpeg -i rtmp://127.0.0.1/myapp/test1 -c copy -map 0 -f segment -segment_list playlist.m3u8 -segment_time 10 output%03d.ts
-------------------------------------------MP4Box------------------------------------------
mp4box -dash 5000 -rap -no-frags-default -profile onDemand source.mp4#video source.mp4#audio
处理后可用dash.js播放
分离音频:
mp4box -add input.mp4#audio -new output.aac
分离视频:
mp4box -add input.mp4#video -new output.mp4
合并音视频:
mp4box -add input.mp4 -add input.m4a output.mp4
合并视频:
mp4box -cat input1.mp4 -cat input2.mp4 -new output.mp4
更过MP4Box用法查看官方手册(英文)MP4Box
通过谷歌翻译后(中文)中文翻译
默认环境为windows
第一种方法:直接调用exec 需开启相关权限
下载ffmpeg.exe放在网站根目录,实测不用配置环境变量即可使用
一个截取视频封面的例子
$from = "./Public/media/movie/1.mp4";//视频目录
$name = "1.png";//图片名称
$to = "./Public/media/pic/";//图片存放路径
$str = "ffmpeg -i " . $from . " -y -f mjpeg -ss 10 -t 1 -s 250x160 " . $to . $name;//ffmpeg命令
exec($str, $output);//执行命令
第二种方法:调用PHP-FFMpeg类
具体方法可查看此博客 and 此博客