0%

使用 FFmpeg CLI 处理视频

FFmpeg 概述

TLDR:FFmpeg 是领先的多媒体框架,能够解码编码转码复用解复用、流式传输过滤播放人类和机器创建的几乎所有内容。它支持从最晦涩的古老格式到最前沿的格式。无论它们是由某个标准委员会、社区还是公司设计的。它还具有高度的可移植性:FFmpeg 可以在各种构建环境、机器架构和配置下在 Linux、Mac OS X、Microsoft Windows、BSD、Solaris 等平台上编译、运行并通过我们的测试基础架构 FATE

more: 官网介绍

FFmpeg 特点

从技术的角度来看,FFmpeg 是一个非常强大的 开源多媒体框架,广泛应用于音视频处理、转换、流媒体传输等场景。它的特点可以从以下几个方面进行详细阐述:

支持多种音视频格式与编解码器

  • 格式支持:FFmpeg 支持几乎所有主流的音视频文件格式(容器格式),如 MP4、AVI、MKV、FLV、MOV、WebM 等。它还支持各种音频格式,如 MP3、AAC、WAV、OGG 等。
  • 编解码器支持:FFmpeg 支持大量的编解码器(Codecs),包括视频编码(H.264、HEVC、VP9 等)和音频编码(AAC、MP3、Opus 等)。其内置的 libavcodec 库为最常用的音视频编解码器提供了全面支持。

跨平台

FFmpeg 支持多种操作系统,包括 WindowsLinuxmacOS 等。开发者可以在不同平台上使用相同的工具和库,具有极强的跨平台兼容性。

命令行工具

FFmpeg 提供了一个非常强大的 命令行工具ffmpeg),可以直接通过命令行进行音视频处理、转码、剪辑、合并、提取音频等操作。FFmpeg 的命令行工具不仅灵活、强大,还可以与脚本语言(如 Bash、Python 等)结合进行批量处理。

高性能

  • 硬件加速支持:FFmpeg 支持硬件加速解码与编码(如 NVIDIA CUDA、Intel Quick Sync、AMD VCE 等),这对于处理高分辨率、高清视频时非常重要。硬件加速能显著提升 FFmpeg 处理的性能,减少 CPU 占用。
  • 多线程支持:FFmpeg 支持多线程解码、编码,能够在多核处理器上充分利用硬件资源,提升音视频处理的速度。

流媒体功能

FFmpeg 在流媒体处理方面也非常强大,支持 RTMP、HLS、RTSP、MMS、DASH 等协议。它可以用来进行音视频推流和拉流,广泛应用于直播、视频会议、在线广播等领域。

插件化架构

FFmpeg 是一个模块化的框架,各个模块(如编解码器、过滤器、复用器、解复用器等)都有独立的功能,开发者可以根据需要进行定制、扩展或优化。它提供了丰富的 API,允许开发者对其进行二次开发。

强大的音视频处理功能

FFmpeg 不仅仅是一个编解码工具,它还能进行多种音视频处理,如:

  • 视频剪辑与合并:剪辑视频片段、合并多个视频文件。
  • 格式转换:将视频从一种格式转换为另一种格式(如 MP4 转为 WebM)。
  • 音视频提取:从视频中提取音频,或从音频中提取特定部分。
  • 视频缩放与旋转:改变视频的分辨率,或者旋转视频(如 90°、180°、270°)。
  • 字幕处理:提取、嵌入字幕,支持多种字幕格式(SRT、ASS 等)。
  • 音视频滤镜:如加水印、调整亮度、对比度,甚至是更复杂的视觉特效。

高可定制性

FFmpeg 提供了许多配置选项和灵活的参数,使得它可以根据用户需求进行高程度的定制。例如,开发者可以选择只编译需要的部分,裁剪不需要的编解码器,以减小程序体积或提高效率。

强大的社区支持

FFmpeg 拥有一个活跃的开发者社区和广泛的文档资源,问题通常可以通过查阅官方文档或社区支持得到解决。开发者可以在社区中找到很多开源代码、教程、博客和技术文章。

常见的使用场景

  • 视频转换:例如将视频从 MKV 转换为 MP4,或者从 H.264 编码转换为 HEVC(H.265)编码。
  • 视频直播与点播:FFmpeg 支持 RTMP、HLS 等协议,广泛应用于流媒体服务器、直播推流等。
  • 音视频同步:处理多个音视频流的同步问题,特别是在直播和视频会议中。
  • 多媒体处理应用:开发音视频播放器、音视频编辑工具、流媒体服务等应用。

总结

FFmpeg 的特点主要体现在其全面的 格式支持、高效的编解码能力、灵活的 命令行工具、跨平台特性、强大的 音视频处理功能、流媒体支持和极强的 定制性。它的 开源 特性使得它成为音视频开发领域的主流工具,广泛应用于视频转码、流媒体服务、视频处理、视频会议等各种场景。

安装指引

通过源码

参考官网的指引 https://ffmpeg.org/download.html ,选择对应的平台进行下载安装。

通过 CLI

通过 FFmpeg CLI 安装较为简单,推荐这种方式。

第一步:安装 Homebrew (http://brew.sh/)

1
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

第二步:安装 FFmpeg

1
brew install ffmpeg

第三步:验证是否安装成功

1
2
3
4
5
# 执行
where ffmpeg

# 输出下面信息代表安装成功
/opt/homebrew/bin/ffmpeg

视频处理

找点视频素材进行测试,这里通过 Demo 网址下载 Demo 视频进行演示。

剪辑

有时候我们需要截取一个长视频的其中某一段内容,比如从一个视频的第 10 秒开始,截取 6 秒的内容,也就是 10~16 秒的内容,输入一个 out.mp4 文件

1
2
# 从00:00:10开始,截取的长度为00:00:06
ffmpeg -i in.mp4 -ss 00:00:10 -t 00:00:06 -acodec aac -vcodec h264 -strict -2 out.mp4

参数说明:

  • -i 代表输入待处理的文件
  • -ss 代表开始的时间
  • -t 代表截取的长度。
  • -acodec 音频编解码器
  • -vcodec 音频编解码器

缩放

很多时候我们需要把一个高分辨率的视频处理成一个低分辨率的视频,以达到减小视频体积的目的。举个例子:把一个 1080*1920 的视频缩小到 360*640:

1
2
# 1080*1920 --> 360*640
ffmpeg -i in.mp4 -vf scale=360:640 -acodec aac -vcodec h264 out.mp4

参数解释:

  • -i 代表输入
  • -vf 的全称是 video filter,即:视频滤镜,缩放其实就是给视频添加一个滤镜。
  • scale=360:640 scale 是一种滤镜,缩放滤镜,格式是:scale=width:height,其中,width 和 height 分别是处理后的宽和高

裁剪

有时候我们想截取一个大视频的中间一部分画面,比如一个 1080*1920 的视频,我们想截取中间的 540*540 的部分,这个也可以实现的:

1
ffmpeg -i in.mp4 -strict -2 -vf crop=540:540:50:50 out.mp4 

参数解释:

  • crop 和上面的 scale 一样,也是视频滤镜的一种,crop 是裁剪滤镜。四个参数分别是 width:height:x:y,其中 width 和 height 指的是裁剪的宽和高,x 和 y 代表裁剪的区域的左上角的坐标,坐标系原点为原视频的左上角。比如 0:0 就代表原视频的左上角,50:50 就代表以原视频的左上角为原点的坐标系的 50:50 位置

旋转

使用 ffmpeg 可以轻松地旋转视频。举个例子:将一个视频顺时针旋转 90 度

1
ffmpeg -i in.mp4 -vf rotate=PI/2:ow=1080:oh=1920 out.mp4

参数解释:

视频旋转其实也是一直滤镜。

  • rotate=PI/2 rotate 是旋转滤镜,后面的“PI/2”旋转角度(正数代表顺时针),这里是 90 度 rotate 除了指定旋转角度的参数外,还有其他一些参数:
    • ow 全称是 out width,输出视频的宽度,如果不指定,默认是输入视频的宽度
    • oh 全称是 out height,输出视频的高度,如果不指定,默认是输入视频的高度

调节帧率

帧率会很大程度上影响画面的流畅度和视频的体积,帧率越大,画面越流畅,同时视频体积越大。

我们有时候需要通过降低帧率来减小视频的体积。

举个例子:将一个视频的帧率降到 15

1
ffmpeg -i in.mp4 -r 15 out.mp4

参数解释:

  • -r 帧率

格式转换

ffmpeg 具备强大的格式转换功能,这里举几个常用的例子。

1
2
3
4
5
6
# mov --> mp4
ffmpeg -i in.mov -vcodec copy -acodec copy out.mp4
# flv --> mp4
ffmpeg -i in.flv -vcodec copy -acodec copy out.mp4
# gif --> mp4
ffmpeg -i in.gif -vf scale=420:-2,format=yuv420p out.mp4

参数解释:

  • -vf 参数用于设置视频过滤器(video filter)。这里使用了两个视频过滤器:scaleformat
    • scale=420:-2
      • scale 是用来调整视频分辨率的过滤器。
      • 420 表示视频的 宽度 被设定为 420 像素。
      • -2 表示高度将自动计算,以保持输入视频的纵横比。-2 的使用意味着 FFmpeg 会根据宽度的变化计算出一个合适的高度,以确保视频不会被拉伸或变形。FFmpeg 会自动计算这个高度,确保宽高比不变。
    • format=yuv420p
      • format 用来设置视频的 像素格式
      • yuv420p 是一种常见的视频像素格式,特别是对于 MP4 格式来说。这种格式在视频压缩中效率较高,并且被广泛支持。yuv420p 是一种 YUV 色彩空间,其中每个像素的亮度信息(Y)是完整的,而色度信息(U、V)则进行了子采样,减少了数据量。

查看视频的详细信息

有的时候我们需要在处理之前先了解一下视频的参数信息,比如分辨率、比特率等等。可以使用下面的命令:

1
2
# 不加任何参数,只指定输入的视频
ffmpeg -i in.mp4