FFmpeg 和 MP4Box 几个命令

----------------------------FFmpeg-----------------------------

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时就是减慢视频播放速度。
改变视频中音频sulv
ffmpeg -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

通过谷歌翻译后(中文)中文翻译

---------------------PHP 调用FFmpeg----------------------

默认环境为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 此博客

 

 

你可能感兴趣的:(其他)