1.查看帮助文档

ffmpeg是一个开源的音视频转码工具

ffmpeg安装完成后,输入ffmpeg -h打印帮助文档

[root@localhost input]# ffmpeg -h
ffmpeg version 2.8.15 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-36)
  configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --optflags='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic' --extra-ldflags='-Wl,-z,relro ' --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-amrwbenc --enable-version3 --enable-bzlib --disable-crystalhd --enable-gnutls --enable-ladspa --enable-libass --enable-libcdio --enable-libdc1394 --enable-libfdk-aac --enable-nonfree --disable-indev=jack --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-openal --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libx264 --enable-libx265 --enable-libxvid --enable-x11grab --enable-avfilter --enable-avresample --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib64 --enable-runtime-cpudetect
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Getting help:
    -h      -- print basic options
    -h long -- print more options
    -h full -- print all options (including all format and codec specific options, very long)
    See man ffmpeg for detailed description of the options.

Print help / information / capabilities:
-L                  show license
-h topic            show help
-? topic            show help
-help topic         show help
--help topic        show help
-version            show version
-buildconf          show build configuration
-formats            show available formats
-devices            show available devices
-codecs             show available codecs
-decoders           show available decoders
-encoders           show available encoders
-bsfs               show available bit stream filters
-protocols          show available protocols
-filters            show available filters
-pix_fmts           show available pixel formats
-layouts            show standard channel layouts
-sample_fmts        show available audio sample formats
-colors             show available color names
-sources device     list sources of the input device
-sinks device       list sinks of the output device
-hwaccels           show available HW acceleration methods

Global options (affect whole program instead of just one file:
-loglevel loglevel  set logging level
-v loglevel         set logging level
-report             generate a report
-max_alloc bytes    set maximum size of a single allocated block
-y                  overwrite output files
-n                  never overwrite output files
-ignore_unknown     Ignore unknown stream types
-stats              print progress report during encoding
-max_error_rate ratio of errors (0.0: no errors, 1.0: 100% error  maximum error rate
-bits_per_raw_sample number  set the number of bits per raw sample
-vol volume         change audio volume (256=normal)

Per-file main options:
-f fmt              force format
-c codec            codec name
-codec codec        codec name
-pre preset         preset name
-map_metadata outfile[,metadata]:infile[,metadata]  set metadata information of outfile from infile
-t duration         record or transcode "duration" seconds of audio/video
-to time_stop       record or transcode stop time
-fs limit_size      set the limit file size in bytes
-ss time_off        set the start time offset
-sseof time_off     set the start time offset relative to EOF
-seek_timestamp     enable/disable seeking by timestamp with -ss
-timestamp time     set the recording timestamp ('now' to set the current time)
-metadata string=string  add metadata
-target type        specify target file type ("vcd", "svcd", "dvd", "dv" or "dv50" with optional prefixes "pal-", "ntsc-" or "film-")
-apad               audio pad
-frames number      set the number of frames to output
-filter filter_graph  set stream filtergraph
-filter_script filename  read stream filtergraph description from a file
-reinit_filter      reinit filtergraph on input parameter changes
-discard            discard
-disposition        disposition

Video options:
-vframes number     set the number of video frames to output
-r rate             set frame rate (Hz value, fraction or abbreviation)
-s size             set frame size (WxH or abbreviation)
-aspect aspect      set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)
-bits_per_raw_sample number  set the number of bits per raw sample
-vn                 disable video
-vcodec codec       force video codec ('copy' to copy stream)
-timecode hh:mm:ss[:;.]ff  set initial TimeCode value.
-pass n             select the pass number (1 to 3)
-vf filter_graph    set video filters
-ab bitrate         audio bitrate (please use -b:a)
-b bitrate          video bitrate (please use -b:v)
-dn                 disable data

Audio options:
-aframes number     set the number of audio frames to output
-aq quality         set audio quality (codec-specific)
-ar rate            set audio sampling rate (in Hz)
-ac channels        set number of audio channels
-an                 disable audio
-acodec codec       force audio codec ('copy' to copy stream)
-vol volume         change audio volume (256=normal)
-af filter_graph    set audio filters

Subtitle options:
-s size             set frame size (WxH or abbreviation)
-sn                 disable subtitle
-scodec codec       force subtitle codec ('copy' to copy stream)
-stag fourcc/tag    force subtitle tag/fourcc
-fix_sub_duration   fix subtitles duration
-canvas_size size   set canvas size (WxH or abbreviation)
-spre preset        set the subtitle options to the indicated preset

可选视频编码方案

1. MP4封装:H264视频编码+AAC音频编码(最通用)

2. WebM封装: VP8视频编码+Vorbis音频编码(Google为了避开专利开发,无明显优势)

3. OGG封装: Theora视频编码 +Vorvis音频编码(完全开源的编码方式,无专利,HTML5可用)

2.音频转码

例子 flac转mp3

ffmpeg -i input.flac -acodec libmp3lame -ar 44100 -ab 320k -ac 2 out.mp3
  • -acodec 输入编码器,不输入也可以,ffmpeg会自动根据后缀名选择编码器

  • -ar rate 指定采样频率,不指定采样频率会根据输入音视频的采样频率

  • -ab audio byte rates 指定比特率,如果不输入默认是128K,这点就有点坑了。128K作为视频的音轨比较合适,但是这个音质作为单纯的音频来说还是基本上是最低音质,平时我们在手机里听听的水平。

  • -ac audio channel 指定声道数

3.视频压制

ffmpeg -i in.webm -s 1920*1080 -pix_format yuv420p -vcodec libx264 -preset medium -profile:v high -level:v -crf 23

  

compress = "ffmpeg -i {} -b:v {}k -bufsize {}k -vf scale={} -minrate {}k -pix_fmt yuv420p -vcodec libx264 -preset veryslow -profile:v baseline -crf 23 {}".format(self.fileInputPath, self.bitrate, self.bitrate, self.resolution, int(self.bitrate) + 100, self.fileOutPath)
isRun = os.system(compress)
  • -s size 指定视频尺寸进行缩放

  • -b:v 2000k主要是控制平均码率
  • -bufsize 2000k 用于设置码率控制缓冲器的大小,设置的好处是,让整体的码率更趋近于希望的值,减少波动。(简单来说,比如1 2的平均值是1.5, 1.49 1.51 也是1.5, 当然是第二种比较好)
  • -minrate 2500k -maxrate就简单了,在线视频有时候,希望码率波动,不要超过一个阈值,可以设置maxrate。
  • -vf scale=640:360    将输入的1920x1080(视频分辨率)缩小到960x540输出:
  • -pix_format 指定视频使用的颜色空间 ,输入ffmpeg -pix_fmts可以打印出所有支持的选项。我就知道两个YUV和RGB,YUV表示明亮度,色度和浓度,因为人的色觉对亮度的敏感程度要高一些,所以网络视频通常会对色度层面进行压缩。也就是所谓的yuv420p。Y保留全部UV进行压缩

  • -vcodex 指定视频编码器,建议使用libx264

  • -preset 对编码器的预设,精度越高编码速度越慢,占用cpu性能越高,默认是medium

    有以下几个选项

    1. ultrafast

    2. superfast

    3. veryfast

    4. faster

    5. fast

    6. medium

    7. slow

    8. slower

    9. veryslow

    10. placebo

    通常我们在网络上发布视频,会使用veryfast选项。较快,消耗性能少,对播放器的要求也低,缺点是生成的视频会大一些

    压制视频的时候,一般采用veryslow选项。

  • -profile:v 指定编码器配置,主要和压缩比有关。

如下图所示,越往左支持的选项越少,质量越低

实时通信领域采用baseline

流媒体领域 使用 main

超清视频 使用high

  • -level:v 对编码器配置的限制,如下表

一般情况下1080P及以下视频选用4.1即可

 

  • -crf Constant Rate Factor 恒定速率因子模式,每一帧的画面都按照要求的视频质量计算需要的比特数,画质均衡,但是无法控制码率,也无法控制最终生成文件的大小。 适用于对于画质有要求,文件大小没有要求的情况,范围0-51,默认值就是23,数字越小质量越高

  • -r 设置视频帧率

  • -b:a 同 -ab 设置音频比特率,大多数视频网站的音频比特率都是128K或者192K

4.码率控制模式

fmmpeg支持3种码率控制模式

1. -qp 恒定量化器模式,量化器就是用算法将每一帧的质量转化为数字,可以设置,建议让软件自动设置。

体积最大

一般不使用这种模式,除非你想无损压制视频

无损压制视频的例子(快速编码)

ffmpeg -i input -vcodec libx264 -preset ultrafast -qp 0 output.mkv

无损压制视频的例子(高压缩比)

ffmpeg -i input -vcodec libx264 -preset veryslow -qp 0 output.mkv

尝试了用这种无损压缩方式压缩dvd镜像中提取的vob文件,发现这种方式压制出来的文件体积竟然是原来的两倍。所以说还是使用crf 18,这样就比较接近无损了。

2. -crf 恒定速率因子模式,相当于浮动值的qp模式,会给每个画面不同的量化值,比如说把人眼不敏感的部分码率调低。一般压制视频使用这个选项。但是不懂不推荐乱设置,让软件自动配置即可
值的范围是0-51,默认值是23,通常认为crf值18压制出来的视频视觉上是无损的。18-23之间的变化不明显。

3. -b 固定目标码率模式,当上传视频网站有码率限制时,可以使用这个选项。但是不推荐。crf也可以获得合适的体积和画质。没必要

使用上面3个选项压制,都是单遍编码,最好加上-preset veryslow 选项,这样软件对参数的控制会更精准

比特率模式

VBR 动态比特率,ffmpeg默认采用,简单的内容少给码率,复杂内容多给码率。

ABR 平均比特率,网络视频会采用这一格式,因为VBR码率变化太大,不适用网络传输

CBR 恒定比特率, 通常没有人使用

输入 ffmpeg -h encoder=libx264 查看最常用的x264编码器的使用方式
-nal-hrd 可以指定VBR和CBR两种,但是CBR在.mp4不支持?

其余还有-maxrate -minrate 选项,设置这两个选项就能达到ABR的效果

[root@localhost input]# ffmpeg -h encoder=libx264
ffmpeg version 2.8.15 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-36)
  configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --optflags='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic' --extra-ldflags='-Wl,-z,relro ' --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-amrwbenc --enable-version3 --enable-bzlib --disable-crystalhd --enable-gnutls --enable-ladspa --enable-libass --enable-libcdio --enable-libdc1394 --enable-libfdk-aac --enable-nonfree --disable-indev=jack --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-openal --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libx264 --enable-libx265 --enable-libxvid --enable-x11grab --enable-avfilter --enable-avresample --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib64 --enable-runtime-cpudetect
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Encoder libx264 [libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10]:
    Threading capabilities: no
    Supported pixel formats: yuv420p yuvj420p yuv422p yuvj422p yuv444p yuvj444p nv12 nv16
libx264 AVOptions:
  -preset            <string>     E..V.... Set the encoding preset (cf. x264 --fullhelp) (default "medium")
  -tune              <string>     E..V.... Tune the encoding params (cf. x264 --fullhelp)
  -profile           <string>     E..V.... Set profile restrictions (cf. x264 --fullhelp)
  -fastfirstpass     <int>        E..V.... Use fast settings when encoding first pass (from 0 to 1) (default 1)
  -level             <string>     E..V.... Specify level (as defined by Annex A)
  -passlogfile       <string>     E..V.... Filename for 2 pass stats
  -wpredp            <string>     E..V.... Weighted prediction for P-frames
  -x264opts          <string>     E..V.... x264 options
  -crf               <float>      E..V.... Select the quality for constant quality mode (from -1 to FLT_MAX) (default -1)
  -crf_max           <float>      E..V.... In CRF mode, prevents VBV from lowering quality beyond this point. (from -1 to FLT_MAX) (default -1)
  -qp                <int>        E..V.... Constant quantization parameter rate control method (from -1 to INT_MAX) (default -1)
  -aq-mode           <int>        E..V.... AQ method (from -1 to INT_MAX) (default -1)
     none                         E..V....
     variance                     E..V.... Variance AQ (complexity mask)
     autovariance                 E..V.... Auto-variance AQ
  -aq-strength       <float>      E..V.... AQ strength. Reduces blocking and blurring in flat and textured areas. (from -1 to FLT_MAX) (default -1)
  -psy               <int>        E..V.... Use psychovisual optimizations. (from -1 to 1) (default -1)
  -psy-rd            <string>     E..V.... Strength of psychovisual optimization, in <psy-rd>:<psy-trellis> format.
  -rc-lookahead      <int>        E..V.... Number of frames to look ahead for frametype and ratecontrol (from -1 to INT_MAX) (default -1)
  -weightb           <int>        E..V.... Weighted prediction for B-frames. (from -1 to 1) (default -1)
  -weightp           <int>        E..V.... Weighted prediction analysis method. (from -1 to INT_MAX) (default -1)
     none                         E..V....
     simple                       E..V....
     smart                        E..V....
  -ssim              <int>        E..V.... Calculate and print SSIM stats. (from -1 to 1) (default -1)
  -intra-refresh     <int>        E..V.... Use Periodic Intra Refresh instead of IDR frames. (from -1 to 1) (default -1)
  -bluray-compat     <int>        E..V.... Bluray compatibility workarounds. (from -1 to 1) (default -1)
  -b-bias            <int>        E..V.... Influences how often B-frames are used (from INT_MIN to INT_MAX) (default INT_MIN)
  -b-pyramid         <int>        E..V.... Keep some B-frames as references. (from -1 to INT_MAX) (default -1)
     none                         E..V....
     strict                       E..V.... Strictly hierarchical pyramid
     normal                       E..V.... Non-strict (not Blu-ray compatible)
  -mixed-refs        <int>        E..V.... One reference per partition, as opposed to one reference per macroblock (from -1 to 1) (default -1)
  -8x8dct            <int>        E..V.... High profile 8x8 transform. (from -1 to 1) (default -1)
  -fast-pskip        <int>        E..V.... (from -1 to 1) (default -1)
  -aud               <int>        E..V.... Use access unit delimiters. (from -1 to 1) (default -1)
  -mbtree            <int>        E..V.... Use macroblock tree ratecontrol. (from -1 to 1) (default -1)
  -deblock           <string>     E..V.... Loop filter parameters, in <alpha:beta> form.
  -cplxblur          <float>      E..V.... Reduce fluctuations in QP (before curve compression) (from -1 to FLT_MAX) (default -1)
  -partitions        <string>     E..V.... A comma-separated list of partitions to consider. Possible values: p8x8, p4x4, b8x8, i8x8, i4x4, none, all
  -direct-pred       <int>        E..V.... Direct MV prediction mode (from -1 to INT_MAX) (default -1)
     none                         E..V....
     spatial                      E..V....
     temporal                     E..V....
     auto                         E..V....
  -slice-max-size    <int>        E..V.... Limit the size of each slice in bytes (from -1 to INT_MAX) (default -1)
  -stats             <string>     E..V.... Filename for 2 pass stats
  -nal-hrd           <int>        E..V.... Signal HRD information (requires vbv-bufsize; cbr not allowed in .mp4) (from -1 to INT_MAX) (default -1)
     none                         E..V....
     vbr                          E..V....
     cbr                          E..V....
  -avcintra-class    <int>        E..V.... AVC-Intra class 50/100/200 (from -1 to 200) (default -1)
  -motion-est        <int>        E..V.... Set motion estimation method (from -1 to 4) (default -1)
     dia                          E..V....
     hex                          E..V....
     umh                          E..V....
     esa                          E..V....
     tesa                         E..V....
  -forced-idr        <int>        E..V.... If forcing keyframes, force them as IDR frames. (from -1 to 1) (default -1)
  -x264-params       <string>     E..V.... Override the x264 configuration using a :-separated list of key=value parameters

5.合并,提取视频

01.提取视频流,

假设我们提取mp4视频中的视频流

ffmpeg -i in.mp4 -vcodec copy -an v.mp4

-an选项是 audio no 也就是忽略音频

02.提取音频

ffmpeg -i in.mp4 -acodec copy -vn a.m4a

同理 -vn 即忽略音频

如果提取多个音轨的视频:

比如我们用ffprobe看到如下

 

 提取第二条 只需加上-map 0:3

03.合并音视频

ffmpeg -i a.m4a -i v.mp4 -c copy out.mp4

瞬间就能完成合并,因为音频和视频都是现成的,不用重新编码

-c 就是 -codec的简写

6.截取、连接音视频

01.截取音视频

ffmpeg -i in.mp3 -ss 00:01:00 -to 00:01:10 -acodec copy out.mp3

-ss 设置起始时间位移

-to 设置结束时间位移

也可以使用下面的方式

ffmpeg -i in.mp3 -ss 00:01:00 -t 10 -acodec copy out.mp3

-t 设置截取时长

还有-sseof 选项 是以媒体末尾作为起点,可以配合-t截取末尾多少秒

看下面2条命令

ffmpeg -i in.mp4 -ss 00:01:00 -to 00:01:10 -acodec copy out.mp4

ffmpeg -ss 00:01:00 -i in.mp4 -to 00:01:10 -acodec copy out.mp4

调换-ss和-i的位置对结果的影响?

-ss在前面会调用关键帧技术,可能导致截取的时间并不准确

ffmpeg -ss 00:01:00 -i in.mp4 -to 00:01:10 -acodec copy -copyts out.mp4

我们可以加上 -copyts选项,作用是保留时间戳,这样就能正确截取了。

02.合并音视频

方法一

ffmpeg -i "concat:01.mp4|02.mp4|03.mp4" -c copy out.mp4

当合并的几个视频参数一致时,很快就合并完成了。

合并不同参数的视频,操作会比较麻烦。

方法二

上面的方法其实相当于把两个文件直接拼在一起,适用于mp2之类的视频,如果是flv连接处会有卡顿现象
下面的方法,先在一个txt文本中把要拼接的文件列出来。
这条命令只要是相同格式的视频均可以拼接

ffmpeg -f concat -safe 0 -i files.txt -c copy output.mp4

-safe 命令是让ffmpeg无视安全问题报错
在txt文件中的格式需要是这样子

file 'file1.mp4'
file 'file2.mp4'

可以使用开源软件Avidemux,图形化界面,操作方便

7.截图、水印、动图

01.截图

ffmpeg -i in.mp4 -ss 5 -vframes 1 img.jpg

-vframe 指定截取的帧

02.加水印

ffmpeg -i in.mp4 -i logo.png -filter_complex "overlay=20:20"

-filter_complex 添加滤镜 overlay20:20 指的是,离左边20像素,离上边20像素

03.制作GIF动图

ffmpeg -i in.mp4 -ss 4.5 -to 8.5 -s 640*320 -r 15 out.gif

8.录屏、直播

01.录屏

ffmpeg -f gdigrab -i desktop rec.mp4

默认录屏参数是下面这样的

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '.\rec.mp4':

  Metadata:

    major_brand    : isom

    minor_version  : 512

    compatible_brands: isomiso2avc1mp41

    encoder        : Lavf58.24.101

  Duration: 00:00:04.11, start: 0.000000, bitrate: 676 kb/s

    Stream #0:0(und): Video: h264 (High 4:4:4 Predictive) (avc1 / 0x31637661), yuv444p, 2560x1440, 672 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)

    Metadata:

      handler_name    : VideoHandler

清晰度相当不错,字符都很清楚,但是没有声音

-f 格式化 gdigrab 是ffmpeg的一个组件,用来捕获视频。 在windows系统中,ffmpeg自带的就是和默认使用的gdigrab,只能录制屏幕,不能录制声音

直播推荐使用OBS Studio,开源免费,功能强大

02.直播推流

ffmpeg -re -i rec.mp4 按网站要求输入想要的编码 -f flv rtmp地址