0%

FFmpeg 速览

以下是 FFmpeg 的基本概念和知识点的详细整理,从基础到深入,帮助你快速了解和掌握 FFmpeg。


1. 什么是 FFmpeg

  • 定义

    • FFmpeg 是一个开源的多媒体框架,可以用来录制、转换和流式传输音视频。
    • 支持各种音视频格式、编解码器和协议,是开发多媒体应用的核心工具。
  • 特点

    • 跨平台:支持 Windows、Linux、macOS 等。
    • 高性能:通过硬件加速优化(如 GPU 编解码)。
    • 功能丰富:包括格式转换、视频编辑、流媒体传输等。
    • 开源:代码开放,基于 LGPL/GPL 许可协议。

2. FFmpeg 的基本组成

FFmpeg 包括以下几个主要工具和库:

2.1 核心工具

  1. ffmpeg

    • 命令行工具,用于音视频转换、处理和录制。
    • 常见命令:
      • 转码:ffmpeg -i input.mp4 output.avi
      • 提取音频:ffmpeg -i input.mp4 -vn output.mp3
      • 视频裁剪:ffmpeg -i input.mp4 -ss 00:00:10 -to 00:00:20 output.mp4
  2. ffplay

    • 简单的多媒体播放器,用于播放和测试音视频。
    • 示例:ffplay input.mp4
  3. ffprobe

    • 提供音视频文件的详细信息(如分辨率、时长、编解码器等)。
    • 示例:ffprobe -i input.mp4

2.2 核心库

  1. libavcodec

    • 实现多种音视频编解码器(如 H.264、AAC)。
    • 提供编码和解码功能。
  2. libavformat

    • 处理多媒体容器格式(如 MP4、MKV、AVI)。
    • 负责文件读取、写入和流式传输。
  3. libavutil

    • 提供多媒体处理的工具函数(如日志、数学操作、时间戳处理)。
  4. libswscale

    • 处理图像缩放和格式转换。
  5. libswresample

    • 提供音频采样率转换和格式转换功能。
  6. libavfilter

    • 实现音视频过滤器(如添加水印、裁剪、旋转)。

3. FFmpeg 的基本概念

3.1 编解码器

  • 定义:编码器将原始音视频数据压缩为指定格式,解码器将压缩数据解压为原始数据。
  • 常见编解码器
    • 视频:H.264、H.265(HEVC)、VP9、AV1。
    • 音频:AAC、MP3、Opus、FLAC。

3.2 容器格式

  • 定义:容器用于封装音视频数据,支持多种流。
  • 常见格式
    • MP4、MKV、AVI(多媒体容器)。
    • TS、FLV(流媒体容器)。

3.3 像素格式(Pixel Format)

  • 定义:表示视频帧中像素的存储格式。
  • 常见格式
    • yuv420p:每个像素 8 位,YUV420 采样。
    • rgb24:每个像素 8 位,RGB 颜色空间。

3.4 时间戳(PTS/DTS)

  • PTS(Presentation Time Stamp)
    • 表示帧在播放时的显示时间。
  • DTS(Decoding Time Stamp)
    • 表示帧在解码时的时间顺序。

4. FFmpeg 的常见操作

4.1 格式转换

  • 转换容器格式:
    1
    ffmpeg -i input.mkv output.mp4
  • 转换视频编码器:
    1
    ffmpeg -i input.mp4 -c:v libx264 output.mp4
  • 转换音频编码器:
    1
    ffmpeg -i input.mp4 -c:a aac output.m4a

4.2 视频处理

  • 裁剪视频
    1
    ffmpeg -i input.mp4 -ss 00:00:10 -to 00:00:20 output.mp4
  • 调整分辨率
    1
    ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
  • 旋转视频
    1
    ffmpeg -i input.mp4 -vf "transpose=1" output.mp4

4.3 音频处理

  • 提取音频
    1
    ffmpeg -i input.mp4 -vn output.mp3
  • 调整音量
    1
    ffmpeg -i input.mp3 -filter:a "volume=2.0" output.mp3

4.4 添加滤镜

  • 添加水印
    1
    ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=10:10" output.mp4
  • 视频模糊
    1
    ffmpeg -i input.mp4 -vf "boxblur=5:5" output.mp4

5. FFmpeg 编程基础

FFmpeg 提供丰富的 API,可通过代码实现多媒体处理功能。以下是常见操作的步骤:

5.1 解码视频

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>

int main() {
AVFormatContext* formatCtx = avformat_alloc_context();

// 打开文件
if (avformat_open_input(&formatCtx, "input.mp4", nullptr, nullptr) < 0) {
printf("Cannot open file\n");
return -1;
}

// 查找流信息
if (avformat_find_stream_info(formatCtx, nullptr) < 0) {
printf("Cannot find stream information\n");
return -1;
}

// 打印流信息
av_dump_format(formatCtx, 0, "input.mp4", 0);

// 清理
avformat_close_input(&formatCtx);
avformat_free_context(formatCtx);

return 0;
}

5.2 编解码核心步骤

  1. 打开输入文件,初始化 AVFormatContext
  2. 查找流并找到编解码器。
  3. 使用 AVCodecContext 初始化编解码器。
  4. 循环读取帧并解码。
  5. 清理资源。

6. 高级主题

6.1 硬件加速

  • 使用 GPU 编解码(如 NVENC、VAAPI):
    1
    ffmpeg -i input.mp4 -c:v h264_nvenc output.mp4

6.2 流媒体传输

  • 推流到 RTMP 服务器:
    1
    ffmpeg -re -i input.mp4 -f flv rtmp://server/live/stream
  • 接收并播放流媒体:
    1
    ffplay rtmp://server/live/stream

6.3 视频拼接与分割

  • 拼接视频:
    1
    ffmpeg -i "concat:input1.mp4|input2.mp4" -c copy output.mp4
  • 分割视频:
    1
    ffmpeg -i input.mp4 -ss 00:00:00 -t 00:01:00 part1.mp4

7. 学习资源

7.1 官方文档

7.2 在线教程

7.3 推荐书籍

  • 《FFmpeg 从入门到精通》
  • 《Multimedia Programming with FFmpeg》

7.4 社区与工具


通过以上整理,你可以从 FFmpeg 的基础概念入手,逐步掌握其命令行用法和编程接口,最终实现高效的音视频处理和流媒体传输功能。