ffmpeg学习第一章
一、概述
初衷
这里是属于ffmpeg学习的一个记录,目的在于记录学习ffmpeg的过程,将所学的知识总结在这里。一方面提高自己音视频基础能力,另外一方面需要从ffmpeg这个优秀的开源项目里面学习里面优秀的程序设计以及提高自己c代码的综合能力,积累自己在大型开源项目上面的阅读能力,开拓自己的视野。以及以此系列文章分享给小伙伴做为学习资料的参考。
在这里之前,我对ffmpeg完成的积累:已经对ffmpeg编译的过程有一定的熟练度,对常见的编译命令有一定的了解,对不同平台的编译操作流做过实践。通过源码阅读工具sourcetrail找到了一个阅读ffmpeg源码的方法。我知道ffmpeg包含的3个可执行程序里面大致能实现什么功能,我已经对部分功能进行了实践,对使用ffplay、ffmpeg等主要的命令有一定的熟练度。
计划
自上而下,从知识粒度大的内容,广度大的内容,逐步推进到粒度小、内容更加深的内容。以ffmpeg作为树干,学习的过程中在涉及到其他的内容的时候,另做学习总结。学习的细节以及思考都会记录在文章里面,对阅读中的卡点难点我都会做出记录,将整个学习的生命周期里面重要的点和思考都做出记录,企图在阅读其他大型的开源项目的时候能提供经验参考。
二、音视频播放流程概述以及相关基础知识
播放媒体文件拆分下来大致分成一下几个步骤。
对编码器和解码器进行简单的阐述,后面ffmpeg的主要分析都是基于以上的流程进行分析,可大致留下一个印象。了解这里的目的是能支撑阅读ffmpeg源码即可(当然,有更多的积累更好,只是不在这里总结对应的编码,复用的相关知识,后面会补充上贴上链接在这里)。
编码器
作用是将音频、视频的原始数据压缩成更小的体积。便于传输
复用器
将音频、视频流数据通过一定的规则进行整合,变成一个媒体文件(如mp4、flv)
三、ffmpeg官网了解
区别于这里看一下,那里看一下的“碎片式”学习。我的想法是不如从ffmpeg官网开始,一步一步自己摸索,“实践得真知”,摸索的过程可以提高自己解决问题的能力,以及阅读开源项目的能力。
ffmpeg官网:https://github.com/FFmpeg/FFmpeg
首先,进入官网,拉到最后面,查看官网对ffmpeg的自述文件。
FFmpeg 自述文件
FFmpeg 是一个库和工具的集合,用于处理音频、视频、字幕和相关元数据等多媒体内容。
图书馆
libavcodec
提供更广泛的编解码器的实现。libavformat
实现流协议、容器格式和基本 I/O 访问。libavutil
包括散列器、解压缩器和杂项实用功能。libavfilter
提供通过连接滤波器的有向图改变解码音频和视频的方法。libavdevice
提供访问捕获和回放设备的抽象。libswresample
实现音频混合和重采样例程。libswscale
实现颜色转换和缩放例程。工具
- ffmpeg是一个命令行工具箱,用于操作、转换和流式传输多媒体内容。
- ffplay是一个简约的多媒体播放器。
- ffprobe是一个简单的分析工具来检查多媒体内容。
aviocat
额外的小工具,例如ismindex
和qt-faststart
。文档
离线文档位于**doc/**目录中。
例子
编码示例可在doc/examples目录中找到。
执照
FFmpeg 代码库主要是 LGPL 许可的,可选组件是 GPL 许可的。有关详细信息,请参阅许可证文件。
贡献
补丁应使用
git format-patch
或提交到 ffmpeg-devel 邮件列表git send-email
。应避免 Github 拉取请求,因为它们不属于我们的审核流程,将被忽略。
如此一来,我们就对ffmpeg从宏观上有了大致的了解,总结几点。
- ffmpeg里面包含了多种不同功能的库,不同的库实现的功能如上。
- ffmpeg主要实现了3个工具,可以通过命令行来执行操作。
- 3个工具都可以通过点击进入到对应的命令行详解以及原理解析。
上面的内容,能从中利用的有“doc/examples”这个选项,可以通过里面的例子入手分析ffmpeg源码。