• FFmpeg常用实例详解


    FFmpeg 是一个专业的多媒体框架,能够解码、编码、转码、复用、解复用、流式传输、过滤和播放几乎所有格式的媒体文件。
    这里通过一些示例简单地介绍下 ffmpeg 命令的基本使用。

    一、获取详细信息

    ffmpeg -i -hide_banner


    其中 -hide_banner 选项用于在输出文件的详细信息时省略 ffmpeg 的版本信息和编译选项等。

    ffmpeg -i May.mp4 -hide_banner

    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'May.mp4':
      Metadata:
        major_brand     : isom
        minor_version   : 512
        compatible_brands: isomiso2avc1mp41
        encoder         : Lavf58.29.100
      Duration: 00:00:08.03, start: 0.000000, bitrate: 10299 kb/s
      Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], 10181 kb/s, 30 fps, 30 tbr, 19200 tbn (default)
        Metadata:
          handler_name    : Core Media Video
          vendor_id       : [0][0][0][0]
      Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 108 kb/s (default)
        Metadata:
          handler_name    : Core Media Audio
          vendor_id       : [0][0][0][0]
    At least one output file must be specified

    二、格式转换

    ffmpeg -i

    FFmpeg 是一个强大的音频和视频格式转换器,几乎支持当前所有常用的格式,如:

    ffmpeg -i input.avi output.mp4

    或者经常需要用到的,将视频文件转为 GIF 动图:

    ffmpeg -i input.mp4 output.gif

    如果在格式转换时需要保留源视频的质量,可以添加上 -qscale 0 选项(-qscale 的值越低,输出视频的质量越高):

    ffmpeg -i input.webm -qscale 0 output.mp4

    可以使用 -formats 选项列出 ffmpeg 命令支持的所有格式(很长很长的一个列表。。。):

    ffmpeg -formats -hide_banner

    File formats:
     D. = Demuxing supported
     .E = Muxing supported
     --
     D  3dostr          3DO STR
      E 3g2             3GP2 (3GPP2 file format)
      E 3gp             3GP (3GPP file format)
     D  4xm             4X Technologies
      E a64             a64 - video for Commodore 64
     D  aa              Audible AA format files
     D  aac             raw ADTS AAC (Advanced Audio Coding)
     D  aax             CRI AAX
     DE ac3             raw AC-3
     DE ac4             raw AC-4
     D  ace             tri-Ace Audio Container
     D  acm             Interplay ACM
     D  act             ACT Voice file format
     D  adf             Artworx Data Format
     D  adp             ADP
     D  ads             Sony PS2 ADS
      E adts            ADTS AAC (Advanced Audio Coding)
     DE adx             CRI ADX
     D  aea             MD STUDIO audio
     D  afc             AFC
     DE aiff            Audio IFF
     D  aix             CRI AIX
     DE alaw            PCM A-law
     D  alias_pix       Alias/Wavefront PIX image
     DE alp             LEGO Racers ALP
     DE amr             3GPP AMR
     D  amrnb           raw AMR-NB
     D  amrwb           raw AMR-WB
      E amv             AMV
     D  anm             Deluxe Paint Animation
     D  apac            raw APAC
     D  apc             CRYO APC
     D  ape             Monkey's Audio
     ...


     三、指定编码
    可以通过 -c 选项手动指定输出文件的编码,如:

    ffmpeg -i input.mp4 -c:v vp9 -c:a libvorbis output.mkv

    其中 -c:v 用于指定视频编码,-c:a 指定音频编码

    PS:视频文件的后缀如 mp4、mkv、avi 等只是表示用来装载媒体流的“容器”类型,而编码时使用的编码方式则另需指定。
    当然很多时候 ffmpeg 会根据输出文件的后缀自行选择默认的编码方式,无需手动指定。

    只改变视频或者音频流的编码
    可以在指定编码时,只改变视频或者音频编码中的一项,另一项则保持原来的格式:

    ffmpeg -i input.webm -c:v copy -c:a flac output.mkv

    -c:v copy 表示复制输入文件中的视频流到输出文件,不重新进行编码

    只改变文件后缀
    即输入文件中的视频流和音频流同时复制到输出文件,只改变文件后缀

    ffmpeg -i input.webm -c:av copy output.mkv

    编码列表
    查看 FFmpeg 支持的所有音视频编码格式(又一个很长的列表。。。):

    ffmpeg -codecs -hide_banner

    Codecs:
     D..... = Decoding supported
     .E.... = Encoding supported
     ..V... = Video codec
     ..A... = Audio codec
     ..S... = Subtitle codec
     ..D... = Data codec
     ..T... = Attachment codec
     ...I.. = Intra frame-only codec
     ....L. = Lossy compression
     .....S = Lossless compression
     -------
     D.VI.S 012v                 Uncompressed 4:2:2 10-bit
     D.V.L. 4xm                  4X Movie
     D.VI.S 8bps                 QuickTime 8BPS video
     .EVIL. a64_multi            Multicolor charset for Commodore 64 (encoders: a64multi)
     .EVIL. a64_multi5           Multicolor charset for Commodore 64, extended with 5th color (colram) (encoders: a64multi5)
     D.V..S aasc                 Autodesk RLE
     D.V.L. agm                  Amuse Graphics Movie
     D.VIL. aic                  Apple Intermediate Codec
     DEVI.S alias_pix            Alias/Wavefront PIX image
     DEVIL. amv                  AMV Video
     D.V.L. anm                  Deluxe Paint Animation
     D.V.L. ansi                 ASCII/ANSI art
     DEV..S apng                 APNG (Animated Portable Network Graphics) image
     D.V.L. arbc                 Gryphon's Anim Compressor
     ...


    四、视频压缩
    编码与比特率
    有些时候,基于磁盘空间和网络传输的考虑,需要对视频文件进行压缩处理。其中一种方法就是改变视频的比特率。
    在某些情况下,比特率的适当缩减对视频的观看效果并不会产生太大的影响(人眼察觉的范围内)。
    当然编码的选择也会对输出文件的大小产生一定的影响,示例如下:

    ffmpeg -i input.webm -c:a copy -c:v vp9 -b:v 1M output.mkv

    -b:v 用于指定视频的比特率。

    帧率
    另一种方式就是改变视频文件的帧率,也就是人们常常提到的FPS。

    ffmpeg -i input.webm -c:a copy -c:v vp9 -r 30 output.mkv

    -r 30 选项用于指定输出视频的帧率为 30 FPS。

    分辨率
    视频的分辨率也会影响文件的大小,可以使用 -s 选项指定输出文件的分辨率。当然,视频的画幅大小也会产生相应的变化:

    ffmpeg -i input.mkv -c:a copy -s hd720 output.mkv

    ffmpeg -i input.mkv -c:a copy -s 1280x720 output.mkv

    五、提取音频
    通过格式转换,FFmpeg 可以直接将视频文件转为音频文件,只需要指定输出文件的格式为 .mp3 或 .ogg 等。如:

    ffmpeg -i input.mp4 output.mp3

    同时,也可以在转换时指定音频的格式选项

    ffmpeg -i input.mp4 -vn -ar 44100 -ac 2 -ab 320 -f mp3 output.mp3

    其中:
    -vn :指定输出文件中禁用视频
    -ar :指定输出文件中音频的采样率
    -ac:指定音频的通道数
    -ab:指定音频的比特率
    -f:指定输出文件的格式


    六、常用实用命令集锦
    调整分辨率
    将某视频文件的分辨率改为 1280x720:

    ffmpeg -i input.mp4 -filter:v scale=1280:720 output.mp4

    或者:

    ffmpeg -i input.mp4 -s 1280x720 output.mp4

    压缩视频文件

    ffmpeg -i input.mp4 -vf scale=1280:-1 -c:v libx264 -preset veryslow -crf 24 output.mp4

    -vf scale=1280:-1 表示使用视频滤镜进行缩放,将视频宽度设置为 1280,高度自动调整。
    -c:v libx264 选择视频编码为 libx264
    -preset veryslow 指定编码预设为非常慢,以获得更好的质量
    -crf 24 设置恒定质量因子为 24,用于控制编码质量

    也可以添加如下选项同时对音频流进行压缩:-c:a aac -strict -2 -b:a 128k

    移除音频

    ffmpeg -i input.mp4 -an output.mp4

    -an 选项表示在输出文件中禁用音频

    提取图片

    ffmpeg -i input.mp4 -r 1 -f image2 image-%2d.png

    其中各选项的含义:
    -r :设置帧率,即每秒有多少帧画面被提取到图片中。默认为 25
    -f :指定输出的格式。本例中为图片(image2)
    -image-%2d.png :指定提取出的图片的命名方式。本例中最终的命名为 image-01.png、image-02.png 等。如使用 image-%3d.png ,则最终的命名为 image-001.png、imag-002.png 等

    裁剪视频
    即截取指定范围内的视频画面,裁切掉多余的部分

    ffmpeg -i input.mp4 -vf "crop=w:h:x:y" output.mp4

    其中 crop=w:h:x:y 用于指定“裁剪框”的大小和位置。
    w 表示裁剪部分的宽度(默认为源视频的宽度 iw);
    h 表示裁剪部分的高度(默认为源视频的高度 ih;
    x 表示 x 轴上裁剪的起始位置(最左边为 0,默认为源视频的中间位置);
    y 表示 y 轴上裁剪的起始位置(最顶部为 0,默认为源视频的中间位置)。

    改变视频比例
    视频比例即视频画幅的长宽比,也就是通常所说的 4:3 和 16:9 等。

    ffmpeg -i input.mp4 -aspect 16:9 output.mp4

    设置音频封面
    即创建以一张静止的图片为画面的视频。

    ffmpeg -loop 1 -i inputimage.jpg -i inputaudio.wav -c:v libx264 -tune stillimage -c:a aac -b:a 192k -shortest output.mp4

    其中的选项和参数可以根据需求自行修改和省略。

    -loop 1:设置输入图像循环播放 1 次。
    -i inputimage.jpg:指定输入的图像文件为 inputimage.jpg。
    -i inputaudio.wav:指定输入的音频文件为 inputaudio.wav。
    -c:v libx264:使用 libx264 进行视频编码。
    -tune stillimage:针对静态图像进行优化。
    -c:a aac:音频编码使用 aac。
    -b:a 192k:音频比特率设置为 192k。
    -shortest:以最短的输入(音频或图像)结束输出

    截取视频片段

    ffmpeg -i input.mp4 -ss 00:00:50 -codec copy -t 60 output.mp4

    截取视频中从第 50 秒开始,持续时间为一分钟的视频片段。

    -ss 用于指定视频片段的开始时间;
    -t 指定视频片段的持续时间,单位都为秒。

    也可以使用如下方式:

    ffmpeg -i audio.mp3 -ss 00:01:54 -to 00:06:53 -c copy output.mp3

    以上命令也适用于音频文件。

    视频分割

    ffmpeg -i input.mp4 -t 00:00:30 -c copy part1.mp4 -ss 00:00:30 -codec copy part2.mp4

    将输入的视频文件分割为两段,第一段为从最开始到第 30 秒;第二段为第 30 秒到视频结束。

    -t 00:00:30 前面省略了 -ss 00:00:00;
    -ss 00:00:30 后面省略了 -t 剩余时间。
    有点类似于截取多个连续的视频片段。

    视频合并
    首先创建包含各媒体文件路径列表的文本文件 join.txt :
    file '~/myvideos/part1.mp4'
    file '~/myvideos/part2.mp4'
    file '~/myvideos/part3.mp4'
    使用 -f concat 选项对多个视频进行合并:

    ffmpeg -f concat -i join.txt -c copy output.mp4

    添加字幕文件

    ffmpeg -i input.mp4 -i subtitle.srt -map 0 -map 1 -c copy -c:v libx264 -crf 23 -preset veryfast output.mp4

    -map 0:将输入视频的所有流映射到输出。
    -map 1:将输入字幕的所有流映射到输出。
    -c copy:复制音频和视频的编码格式。
    -c:v libx264:视频编码使用 libx264。
    -crf 23:设置恒定质量因子为 23。
    -preset veryfast:编码预设模式为非常快。

    改变视频播放速度(音频不受影响)

    ffmpeg -i input.mp4 -vf "setpts=0.5*PTS" output.mp4

    上述命令会加快视频画面的播放速度,音频播放速度不变。
    如果想放慢视频画面的切换速度,可以相应地将 setpts=0.5*PTS 中的 0.5 改为大于 1 的数值。

    Padding
    即宽银幕视频中上下的两道“黑边”,可以使用 FFmpeg 命令添加类似的效果:

    ffmpeg -i input.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:black" output.mp4

    该效果由 -vf 选项的 pad 参数指定,可以根据情况自行修改。

    -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:black":使用视频滤镜进行处理,将视频缩放为 1920x1080 的尺寸,并且保持原始宽高比缩小,同时进行填充,填充的颜色为黑色

    从图片创建视频

    ffmpeg -framerate 1 -i img%02d.jpg -c:v libx264 -r 30 -pix_fmt yuv420p output.mp4

    把当前目录下的多张图片(名字为 img01.jpg、img02.jpg 的形式)组合为一个视频文件,效果类似于自动播放的 PPT。
    每秒切换一张图片。

    ffmpeg -framerate 30 -i img%02d.jpg -c:v libx264 -pix_fmt yuv420p output.mp4

    也是将当前目录下的多张图片组合成一个完整的视频,该视频帧率为 30 FPS。
    每帧切换一张图片。


    调整码率
    调整码率(transrating)指的是,改变编码的比特率,一般用来将视频文件的体积变小。下面的例子指定码率最小为964K,最大为3856K,缓冲区大小为 2000K。

    ffmpeg -i input.mp4 -minrate 964K -maxrate 3856K -bufsize 2000K output.mp4


    见的容器格式有以下几种。一般来说,视频文件的后缀名反映了它的容器格式。

    MP4
    MKV
    WebM
    AVI

    常用的视频编码格式如下。

    H.262
    H.264
    H.265

    还有几种无版权的视频编码格式。

    VP8
    VP9
    AV1

    常用的音频编码格式如下。

    MP3
    AAC

    FFmpeg 内置的视频编码器。

    libx264:最流行的开源 H.264 编码器
    NVENC:基于 NVIDIA GPU 的 H.264 编码器
    libx265:开源的 HEVC 编码器
    libvpx:谷歌的 VP8 和 VP9 编码器
    libaom:AV1 编码器

    音频编码器如下。

    libfdk-aac
    aac

    FFmpeg 常用的命令行参数如下。

    -c:指定编码器
    -c copy:直接复制,不经过重新编码(这样比较快)
    -c:v:指定视频编码器
    -c:a:指定音频编码器
    -i:指定输入文件
    -an:去除音频流
    -vn: 去除视频流
    -preset:指定输出的视频质量,会影响文件的生成速度,有以下几个可用的值 ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow。
    -y:不经过确认,输出时直接覆盖同名文件。

  • 相关阅读:
    js 滚动鼠标滑轮放大缩小图片
    docker 安装mysql
    ResNet论文及实现
    给你捋清楚Java面向对象的继承关系
    【Python项目】毕业设计必备——Python实现一个GUI版本的学生信息管理系统 | 附源码
    new/delete 和malloc/free的区别
    中国储运杂志中国储运杂志社中国储运编辑部2022年第7期目录
    字节国际化TnS算法实习的碎碎念
    第 2 章 线性表(学生健康登记表实现)
    3.3 形参和实参
  • 原文地址:https://blog.csdn.net/marsjin/article/details/138166503