美文网首页
FFmpeg常用命令

FFmpeg常用命令

作者: lost_devil | 来源:发表于2017-02-27 14:26 被阅读0次

    记录一下工作中常用的FFmpeg命令及其参数的解释,以例子的形式记录,某些参数可以组合使用。详细的用法请参考FFmpeg Documention

    查看可用编解码器等信息

    FFmpeg由于版本的不同,可支持的编解码器的名称及功能可能不一样,遇到问题时可以查一下

    • 可用的编解码器
      ffmpeg –codecs
    • 可用的解码器
      ffmpeg –decoders
    • 可用的编码器
      ffmpeg –encoders
    • 可用的过滤器
      ffmpeg –filters
    • 可用的视频格式
      ffmpeg –formats
    • 可用的协议
      ffmpeg -protocals

    基础用法

    ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy -y -f mp4 OUTPUT
    
    • -i 源输入,可以是文件,也可以是网络源地址,ffmpeg可以有多个输入源,如ffmpeg -i INPUT -i INPUT -i INPUT ……
    • -map 指明对某个文件的某个流进行操作,因为输入文件可以有多个,文件也可以有多个音视频流,-map 0表示对第一个文件的所有流进行处理,-map 0:1表示对第一个文件的第二个流进行处理,注意计数从0开始
    • -c:v 指明输出文件的视频编码,等同于-codec:v,等同于-vcodeclibx264即H.264编码器,若不想对视频重新编码,即保持原视频的编码,则后面跟copy
    • -c:a 指明输出文件的音频编码,用法同上,等同于-codec:a,等同于-acodec
    • -y 表示输出时如果相同文件名的文件已经存在,则直接覆盖,不用询问;相反-n表示遇到此情况时立即退出
    • -f 指明输出文件的封装格式,如mp4flv

    直接推流mp4文件

    ffmpeg -re -i INPUT.mp4 -c copy -f flv rtmp://……
    
    • -c copy 表示音视频保持原有编码

    本地文件重新编码并同时进行rtmp推流

    ffmpeg -re -i INPUT -acodec aac -ac 2 -ar 44100 -ab 128k -vol 3000 -vcodec libx264 -vb 800k -s 360*640 -r 24 -b 928k -f flv rtmp://……
    
    • -re 表示以原生帧率读取数据。一般情况下ffmpeg会以尽可能快的速度读取数据,所以推流文件的话要加上此参数,如果是转推直播流的话,不用加此参数
    • -ac 设置音频编码声道数
    • -ar 设置音频编码采样率,单位kHz,如44100, 24000, 16000等
    • -ab 设置音频码率,也可以写作-b:a
    • -vol 设置音频音量为原音频的多少倍,3000表示为原来的3000%,即30倍
    • -vb 设置视频码率,等同于-b:v
    • -s 设置视频分辨率,参数格式为w*hw×h
    • -r 设置帧率(fps)
    • -b 设置总码率,分别设置了音视频码率后通常省略

    对视频画面旋转90°

    ffmpeg -i INPUT -acodec copy -vcodec libx264 -b 800k -vf transpose=1 OUTPUT
    
    • -vf 表示对视频应用Video Filter,可应用多个filter,中间用,隔开并用""包起来
    • transpose Video Filter的一种,表示对视频画面进行旋转、翻转变换
      • transpose=0 表示先逆时针旋转90°,再垂直翻转
    L.R     L.l
    . . ->  . .
    l.r     R.r
    
    • transpose=1 表示顺时针旋转90°
    L.R     l.L
    . . ->  . .
    l.r     r.R
    
    • transpose=2 表示逆时针旋转90°
    L.R     R.r
    . . ->  . .
    l.r     L.l
    
    • transpose=3 表示顺时针旋转90°,再垂直翻转
    L.R     r.R
    . . ->  . .
    l.r     l.L
    

    修改视频分辨率并添加黑边

    ffmpeg -i INPUT  -vf "scale=640:360,pad=640:1138:0:389:black" -acodec copy -vcodec libx264 -s 640*1138 -b 800k OUTPUT
    

    现将视频分辨率压缩到640×360,再给视频加上黑边,最终视频分辨率改为640×1138

    • scale Video Filter的一种,设置视频分辨率,假设分辨率要设置成200×100,使用方法如下:
    scale=200:100
    

    等同于

    scale=200x100
    

    等同于

    scale=w=200:h=100
    

    当宽或高的值为-1时,表示维持原有宽或高
    还可以使用一些常量定义,iwihowoh,分别表示输入宽、输入高、输出宽、输出高,假设要缩小到原来的1/2,则可以用

    scale=iw/2:ih/2
    

    假设要宽度变成原来的2/3,高度和最后的宽度一样,则可以用

    scale=2/3*iw:ow
    
    • pad Video Filter的一种,设置视频边框,使用方法为
    pad=w:h:x:y:color
    

    w、h表示输出的宽、高,x、y表示原视频画面在最终输出画面中的左上角位置,color表示边框的颜色,默认是black,其余颜色请参考FFmpeg颜色定义

    裁减视频画面

    ffmpeg -i INPUT -vf crop=995:1080:540:0 -acodec copy -vcodec libx264 -f mp4 OUTPUT
    
    • crop=w:h:x:y Video Filter的一种,表示裁切画面,从(x, y)的位置开始取w×h大小的画面

    截取视频生成Gif

    从视频25s处开始,截取10s长度的画面生成320x240大小、帧率为15fps的Gif

    ffmpeg -ss 25 -t 10 -i INPUT -s 320x240 -f gif -r 15 OUTPUT.gif
    
    • -ss 表示从输入文件开始读取的时间位置,也就是开始截取的时间点,参数格式为HH:MM:SS.mmm,小时和分钟可以省略,截取的时间点不是完全精准的
    • -t 表示截取的时间长度,即duration,也可以使用-to,表示截取的截止时间点,配合-ss来定义截取的长度
    • -r 表示输出帧率

    截取视频内任意时间点的一帧图像保存为JPEG文件

    ffmpeg -ss 16.1 -i INPUT -s 320x240 -vframes 1 -f image2 OUTPUT.jpeg
    
    • -vframes 设置要输出的帧的个数,等同于-frames:v
    • -f image2 表示封装格式为image2类型,image2为FFmpeg中的图片封装格式名称

    抽取帧序列,再生成Gif

    从源视频中每秒钟抽取5帧图像,保存为一系列JPEG文件

    ffmpeg -ss 25 -t 10 -i INPUT -r 5 -s 320x240 -f image2 D:\result-%03d.jpeg
    
    • D:\result-%03d.jpeg 自动按序号命名输出

    将这一系列JPEG图像合成为帧率5 fps的GIF文件

    ffmpeg -f image2 -framerate 5 -i D:\result-%03d.jpeg OUTPUT.gif
    
    • -framerate 表示每秒读取多少帧,与-r好像不同,读取图片类型时最好用这个

    生成高质量Gif

    上述方法生成的Gif画质比较一般,下面的方法可生成更高质量的Gif,windows平台下将下面代码存为bat文件执行即可

    @echo on
    set start_time=00:00:10
    set duration=5
    set palette="D:\tmp\palette.png"
    set filters="fps=15,scale=270:-1:flags=lanczos"
    ffmpeg -v warning -ss %start_time% -t %duration% -i INPUT -vf "%filters%,palettegen" -y %palette%
    ffmpeg -v warning -ss %start_time% -t %duration% -i INPUT -i %palette% -lavfi "%filters% [x]; [x][1:v] paletteuse" -y OUTPUT.gif
    pause
    

    中间要生成一个调色板文件D:\tmp\palette.png,再利用此调色板生成Gif,具体原理请参阅使用FFmpeg处理高质量GIF图片

    剪切视频

    ffmpeg -ss 00:00:20 -t 00:00:30 -i INPUT -c copy OUTPUT
    

    精确剪切mp4视频

    ffmpeg -i input.mp4 -qscale 0 -intra temp.mp4
    ffmpeg -ss 00:00:30 -vsync 0 -t 00:00:30 -i temp.mp4 -acodec libvo_aacenc -vcodec libx264 output.mp4
    
    • -qscale Use fixed quality scale (VBR),即使用动态码率,值越小质量越高
    • -intra 表示使用帧内编码
    • -vsync 视频同步方法,0表示:Each frame is passed with its timestamp from the demuxer to the muxer.

    将一张图片转成任意时长的视频

    ffmpeg -loop 1 -i input.png -vcodec libx264 -vb 500k -s 480*640 -r 15 -t 10 ouput.mp4
    

    相关文章

      网友评论

          本文标题:FFmpeg常用命令

          本文链接:https://www.haomeiwen.com/subject/dxdbwttx.html