常用ffmpeg操作

一,基本概念

  1. 容器 ,视频文件本身就是所谓容器,一般一面有以下几部分构成,包括视频,音频,字幕,附加信息等

    • 常用如下格式

      1
      2
      3
      4
      5
      mp4
      mkv
      webm
      avi
      wav
    • 命令查看支持的容器

      1
      ffmpeg -formats
  2. 编码格式,视频、音频、字幕都有各自的编码格式,每类格式又有相应的属性,比如视频的波特率,分辨率,长度等。

    • 常用的视频格式有:

      1
      2
      3
      4
      5
      h264       ---有版权费
      h265 ---有版权费
      vp8 ---无版权费
      vp9 ---无版权费
      av1 ---无版权费
    • 常用音频格式有:

      1
      2
      3
      mp3       ----有损音质,占用空间小
      aac ----有损音质,占用空间小
      flac ----无损音质,占用空间大
    • 常用字幕格式有:

      1
      2
      3
      srt
      ssa
      ass
    • ffmpeg命令查看支持的格式

      1
      ffmpeg -codecs
  3. 编码解码器,是实现某种格式的库文件,每种格式可能有多种编码库来实现,常用编码库

    1
    2
    3
    4
    5
    6
    libx264               --- h264编码库
    nvenc --- 基于nvidia GPU的 h264编码库
    h264_videotoolbox ---正版mac电脑上支持gpu的h264编码库
    libx265 ---开源的hevc编码库
    libvpx ---vp8和vp9 编码库
    libaom ---av1编码库

二,ffmpeg 工作流程描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 _______              ______________
| | | |
| input | demuxer | encoded data | decoder
| file | ---------> | packets | -----+
|_______| |______________| |
v
_________
| |
| decoded |
| frames |
|_________|
________ ______________ |
| | | | |
| output | <-------- | encoded data | <----+
| file | muxer | packets | encoder
|________| |______________|

三,ffmpeg命令组成部分,整体分为5部分

  1. 命令组成部分

    1
    2
    3
    4
    5
    6
    ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...
    #global_options ---全局参数,可省略
    #input_file_options ---输入文件参数,可省略
    #input_url ---输入文件路径
    #output_file_options ---输出文件参数,可省略
    #output_url ---输出文件路径
  2. 常用命令参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    -c:        指定编码器
    -c copy: 直接复制,不经过重新编码(这样比较快)
    -c:v: 指定视频编码器
    -c:a: 指定音频编码器
    -i: 指定输入文件
    -an: 去除音频流
    -vn: 去除视频流
    -preset: 指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
    -y: 不经过确认,输出时直接覆盖同名文件。
    -t: 指定音频的时长
    -to: 指定到某个时间结束
    -ss: 指定从某个时间开始

四,常用例子

  1. 查看文件信息

    1
    2
    ffmpeg -i input.mp4
    ffmpeg -i input.mp4 -hide_banner #只显示元信息
  2. 转换编码格式

    1
    ffmpeg -i input.file -c:v libx264 output.mp4  #指定编码器为libx264
  3. 转换容器格式

    1
    ffmpeg -i input.mp4 -c copy output.webm
  4. 调整比特率

    1
    2
    #码率在964K~3856K,缓冲区域为2000K
    ffmpeg -i input.mp4 -minrate 964K -maxrate 3856K -bufsize 2000K output.mp4
  5. 改变屏幕分辨率

    1
    2
    # -vf 设置屏幕分辨率,其中scale=480:-1,意思是 撑满宽度(设置为480),高度等比缩放
    ffmpeg -i input.mp4 -vf scale=480:-1 output.mp4
  6. 提取音频

    1
    ffmpeg -i input.mp4 -vn -c:a copy output.aac
  7. 添加音轨

    1
    2
    #将两个文件合并为一个
    ffmpeg -i input.aac -i input.mp4 output.mp4
  8. 截图

    1
    2
    3
    4
    5
    #区间截图,其中%3d为输出文件名占位符
    ffmpeg -y -i input.mp4 -ss 00:01:00 -t 00:00:01 output_%3d.jpg

    #截取某个时间点图片,vframes截取1帧,-q:v设置图片质量,越小图片质量越高
    ffmpeg -ss 01:00:00 -i input -vframes 1 -q:v 2 output.jpg
  9. 截取部分视频

    1
    2
    ffmpeg -ss [start] -i [input] -t [duration] -c copy [output]
    ffmpeg -ss [start] -i [input] -to [end] -c copy [output]
  10. 音频添加封面

    1
    2
    # -loop 1 指图片无线循环,-shortest参数表示音频文件结束,输出视频就结束
    ffmpeg -loop 1 -i cover.jpg -i input.mp3 -c:v libx264 -c:a aac -b:a 192k -shortest output.mp4