深入理解ffmpeg第二章FFmpeg简介

书籍基本信息


书名: 《深入理解FFmpeg》

作者: 刘歧、杜金房、宋韶颍 等

出版社: 电子工业出版社

出版时间: 2020 年

适合读者: FFmpeg 开发者、音视频工程师、对 FFmpeg 源码感兴趣的技术人员。深入理解

深入理解FFmpeg - 第1章 多媒体基础 - 刘歧 赵军 杜金房 赵文杰 宋韶颍 - 微信读书

目标

总结本章知识,对于前期学习音视频流媒体开发没提到的知识点进行详细描述。查漏补缺

FFmpeg 简介

 FFmpeg 的许可证

FFmpeg 的发布许可证取决于编译时的选项

LGPL-2.1(及之后):适用于使用动态链接库的情况,允许闭源使用。

GPL-2.0(及之后):适用于使用静态链接库或修改 FFmpeg 源代码的情况,要求开源。

开发者可以根据需求选择合适的许可证版本。

总结

  • FFmpeg 既是一个多媒体工具集(包含 ffmpeg、ffplay、ffprobe),也是一个开发套件(提供丰富的 API 和工具库)。

  • 其核心功能包括音视频编解码、格式转换、流媒体处理、色彩与采样率转换等。

  • “FF” 最初的含义是 “Fast Forward”,但随着 FFmpeg 的发展,其意义已经扩展为多媒体处理的代名词。mpeg是动态图像专家组

  • FFmpeg 的许可证(LGPL 或 GPL)取决于编译选项,开发者可以根据需求选择合适的版本。

  • FFmpeg 在音视频处理、流媒体、开发扩展等领域具有广泛的应用。

FFmpeg 的发展历史

2000 年:Fabrice Bellard 创立 FFmpeg,目标是实现 MPEG 编码/解码库。

2003 年:Michael Niedermayer 接手 FFmpeg,开发原生 H.264 解码器。

2005 年:引入 Vorbis 解码器。

2006 年:开发进展缓慢,社区规模较小。

2009 年:发布 FFmpeg 0.5,首个正式版本。

2010 年:FFmpeg 原生 VP8 解码器性能超越谷歌的 libvpx。

2011 年社区分裂,部分开发者创建新项目 Libav

2011~2014 年:Michael Niedermayer 推动 FFmpeg 与 Libav 的兼容并从Libav移植到ffmpeg,修复安全问题。

2014 年:Michael Niedermayer 辞去领导者角色,保留维护者身份。

2015 年:FFmpeg 社区成立决策委员会,以更开放的方式管理项目。依据代码贡献程度选举委员

2019 年:扩充决策委员会,全球开发者聚会,确定年度碰头会机制。

至今:FFmpeg 持续发展,成为多媒体处理领域的核心工具。

专业名词

 ● 容器(Container)格式:一种文件封装类型,里面主要包含了流,一般会使用一个特定的后缀名标识,例如.mov、.avi、.wav等。

● 流(Stream):在容器中存储音频(Audio)或者视频(Video)、字幕(Subtitle)等数据。

● 元数据(Metadata):一般位于容器之中,告诉我们一些额外的信息,一个常见的例子是MP3文件中的ID3 tag。

● 编解码器(Codec):它实际上是enCOder与DECoder这两个词的混搭。大部分情况下我们指的是一种压缩标准,如我们说的AVC/H.264、HEVC/H.265、VVC/H.266、AV1等。

FFmpeg的基本组成

ffprobe:强大的多媒体分析工具,用于获取媒体文件的详细信息。

ffplay:轻量级的音视频播放工具,支持滤镜处理和音频波形显示。


扩展与自定义

FFmpeg 的模块化设计使其具有很高的扩展性

  • 封装/解封装扩展:在 AVFormat 中增加新的封装格式或流媒体协议支持。

  • 编解码扩展:在 AVCodec 中增加新的编解码格式或硬件加速支持。

  • 滤镜扩展:在 AVFilter 中增加新的滤镜效果。

总结

可以理解为:数据(编码数据)           容器(文件格式/封装)                 协议(网络传输)

对端接收:    解协议(接收网络传输) 解容器(解析文件格式)              源数据(解码)

AVFormat:负责媒体文件的封装和解封装,支持多种文件格式和流媒体协议。

  • 流媒体协议支持:支持 RTMP、RTSP、HLS、MMS 等网络流媒体协议。

  • 文件格式:MP4、FLV、MKV、TS、AVI 等

  • 扩展性:如果 FFmpeg 不支持某种新的容器格式,可以根据需求扩展 AVFormat 模块,增加相应的封装和解封装处理模块。

AVCodec:负责音视频数据的编码和解码,支持多种编解码格式。

  • 原生支持:H.264、AAC、MJPEG 等。

  • 第三方库支持

    • H.264 编码:x264 编码器。

    • H.265 编码:x265 编码器。

    • MP3 编码:libmp3lame 编码器。

  • 扩展性:如果需要支持新的编解码格式或硬件编解码加速,可以在 AVCodec 模块中增加相应的编解码模块。

AVFilter:提供通用的音视频滤镜处理框架,支持多种滤镜效果。

详细内容 ffmpeg filter 滤镜命令_ffmpeg 滤镜-优快云博客

  • 视频滤镜:缩放、裁剪、旋转、添加水印、色彩调整等。

  • 音频滤镜:音量调整、混音、回声、降噪等。

  • 滤镜链,滤镜可以串联成链,实现复杂的处理效果。例如:

    • 视频滤镜链:输入 → 缩放 → 裁剪 → 添加水印 → 输出。

    • 音频滤镜链:输入 → 音量调整 → 混音 → 输出。

AVDevice:支持多种平台的音视频设备输入输出,提供虚拟设备功能。

  • 跨平台支持

    • macOS/iOS:使用 AVFoundation 调用底层音视频及共享桌面输入。

    • Windows:使用 DirectShow(dshow)作为音视频输入。

    • Linux

      • 音频设备:OSS、ALSA、Pulse Audio 等。

      • 视频设备:OpenGL、Video4Linux2、X11grab 等。

  • 虚拟设备:支持 lavfi 虚拟输入设备,允许使用 Libavfilter 的滤镜链或表达式作为输入或输出设备。

swscale:提供高效的图像缩放和像素格式转换功能。

  • swscale 模块通过高度优化的算法实现高效的图像转换。

  • 与 libyuv 相比,swscale 在支持的色彩空间和缩放算法上更具优势。

swresample:提供高效的音频重采样、格式转换和通道布局调整功能。

性能优化
  • swresample 模块通过高度优化的算法实现高效的音频转换。

  • 支持多种重采样选项和算法,以适应不同的应用场景。

FFmpeg编译

在 Linux 平台上,虽然许多发行版(如 Ubuntu、Fedora)的软件源中已经包含了 FFmpeg,但这些预编译的版本通常较老,可能不支持最新的编码格式(如 H.264、H.265)或流媒体协议(如 RTMP)。为了支持这些功能,通常需要手动编译 FFmpeg。

直接参考往期文章即可。

ubuntu编译ffmpeg_ubuntu ffmpeg 编译-优快云博客

windows环境编译ffmpeg +visual studio 2022_ffmpeg visual studio-优快云博客

FFmpeg 特性的选择与定制

FFmpeg 的核心设计理念是模块化,所有功能(如编码、封装、协议支持)都可以通过模块的方式挂载到 FFmpeg 框架中。在某些特定场景下,可能需要定制 FFmpeg 的功能,以满足特定需求。

1.查看 FFmpeg 支持的特性
./configure --list-decoders   # 查看支持的解码器
./configure --list-encoders   # 查看支持的编码器
./configure --list-muxers     # 查看支持的封装格式
./configure --list-demuxers   # 查看支持的解封装格式
./configure --list-protocols  # 查看支持的流媒体协议
查看可用的外部库

可以找到类似 --enable-libx264--enable-libfdk-aac 的选项,这些选项用于启用特定的外部库。

./configure --help

常见的外部库

外部库功能编译选项
libx264H.264 编码支持--enable-libx264
libx265H.265 编码支持--enable-libx265
libfdk-aacAAC 编码支持--enable-libfdk-aac
libmp3lameMP3 编码支持--enable-libmp3lame
libvpxVP8/VP9 编码支持--enable-libvpx
libopusOpus 编码支持--enable-libopus
libvorbisVorbis 编码支持--enable-libvorbis
libass字幕渲染支持--enable-libass
libfreetype字体渲染支持--enable-libfreetype
libsdl2SDL2 支持(用于 ffplay)--enable-sdl2

安装外部库

根据需要安装对应的外部库。

sudo apt install -y libx264-dev
sudo apt install -y libfdk-aac-dev
...
配置编译选项
./configure \
  --enable-gpl \
  --enable-libx264 \
  --enable-libfdk-aac \
  --enable-libmp3lame \
  --enable-libvpx
编译与安装

验证定制的 FFmpeg

学习资料分享

0voice · GitHub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值