天天看点

FFMPEG视音频编解码零基础学习方法 0. 背景知识 1. ffmpeg程序的使用(ffmpeg.exe,ffplay.exe,ffprobe.exe) 2. ffmpeg库的使用:视频播放器 3. ffmpeg库的使用:音频播放器 4. ffmpeg库的使用:一个真正的播放器——ffplay 5. ffmpeg库的使用:编码 6. ffmpeg源代码分析 7. ffmpeg相关工程的学习 8.FFmpeg其它方面的功能

在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者。在和大家探讨的过程中,我忽然发现了一个问题:在“大神”和初学者之间好像有一个不可逾越的鸿沟。“大神”们水平高超,探讨着深奥的问题;而初学者们还停留在入门阶段。究竟是什么原因造成的这种“两极分化”呢?最后,我发现了问题的关键:FFMPEG难度比较大,却没有一个循序渐进,由简单到复杂的教程。现在网上的有关FFMPEG的教程多半难度比较大,不太适合刚接触FFMPEG的人学习;而且很多的例子程序编译通不过,极大地打消了学习的积极性。我自己在刚开始学习FFMPEG的时候也遇到了很大的困难。为了帮助更多的人快速成为“大神”,我想总结一个学习FFMPEG的方法,方便大家循序渐进的学习FFMPEG。

FFMPEG视音频编解码零基础学习方法 0. 背景知识 1. ffmpeg程序的使用(ffmpeg.exe,ffplay.exe,ffprobe.exe) 2. ffmpeg库的使用:视频播放器 3. ffmpeg库的使用:音频播放器 4. ffmpeg库的使用:一个真正的播放器——ffplay 5. ffmpeg库的使用:编码 6. ffmpeg源代码分析 7. ffmpeg相关工程的学习 8.FFmpeg其它方面的功能

本章主要介绍一下FFMPEG都用在了哪里(在这里仅列几个我所知的,其实远比这个多)。说白了就是为了说明:FFMPEG是非常重要的。

使用FFMPEG作为内核视频播放器:

Mplayer,ffplay,射手播放器,暴风影音,KMPlayer,QQ影音...

使用FFMPEG作为内核的Directshow Filter:

ffdshow,lav filters...

使用FFMPEG作为内核的转码工具:

ffmpeg,格式工厂...

事实上,FFMPEG的视音频编解码功能确实太强大了,几乎囊括了现存所有的视音频编码标准,因此只要做视音频开发,几乎离不开它。

本章主要介绍一下ffmpeg工程包含的三个exe的使用方法。

该网站中的FFMPEG分为3个版本:Static,Shared,Dev。

前两个版本可以直接在命令行中使用,他们的区别在于:Static里面只有3个应用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe,每个exe的体积都很大,相关的Dll已经被编译到exe里面去了。Shared里面除了3个应用程序:ffmpeg.exe,ffplay.exe,ffprobe.exe之外,还有一些Dll,比如说avcodec-54.dll之类的。Shared里面的exe体积很小,他们在运行的时候,到相应的Dll中调用功能。

Dev版本是用于开发的,里面包含了库文件xxx.lib以及头文件xxx.h,这个版本不包含exe文件。

打开系统命令行接面,切换到ffmpeg所在的目录,就可以使用这3个应用程序了。

ffmpeg是用于转码的应用程序。

一个简单的转码命令可以这样写:

将input.avi转码成output.ts,并设置视频的码率为640kbps

FFMPEG视音频编解码零基础学习方法 0. 背景知识 1. ffmpeg程序的使用(ffmpeg.exe,ffplay.exe,ffprobe.exe) 2. ffmpeg库的使用:视频播放器 3. ffmpeg库的使用:音频播放器 4. ffmpeg库的使用:一个真正的播放器——ffplay 5. ffmpeg库的使用:编码 6. ffmpeg源代码分析 7. ffmpeg相关工程的学习 8.FFmpeg其它方面的功能

ffmpeg -i input.avi -b:v 640k output.ts  

ffplay是用于播放的应用程序。

一个简单的播放命令可以这样写:

播放test.avi

FFMPEG视音频编解码零基础学习方法 0. 背景知识 1. ffmpeg程序的使用(ffmpeg.exe,ffplay.exe,ffprobe.exe) 2. ffmpeg库的使用:视频播放器 3. ffmpeg库的使用:音频播放器 4. ffmpeg库的使用:一个真正的播放器——ffplay 5. ffmpeg库的使用:编码 6. ffmpeg源代码分析 7. ffmpeg相关工程的学习 8.FFmpeg其它方面的功能

ffplay test.avi  

ffprobe是用于查看文件格式的应用程序。

这个就不多介绍了。

本章开始介绍使用ffmpeg的库进行开发。

1.下载Dev版本,里面包含了ffmpeg的xxx.h头文件以及xxx.lib库文件。

2.下载Shared版本,里面包含了ffmpeg的dll文件。

3.将这两部分文件拷贝到VC工程下面就可以了

结构体中每个变量的分析,参考文章:

<a href="http://blog.csdn.net/leixiaohua1020/article/details/14214577" target="_blank">FFMPEG结构体分析:AVFrame</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/14214705" target="_blank">FFMPEG结构体分析:AVFormatContext</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/14214859" target="_blank">FFMPEG结构体分析:AVCodecContext</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/14215369" target="_blank">FFMPEG结构体分析:AVIOContext</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/14215833" target="_blank">FFMPEG结构体分析:AVCodec</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/14215821" target="_blank">FFMPEG结构体分析:AVStream</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/14215755" target="_blank">FFMPEG结构体分析:AVPacket</a>

注:如果想要查看解码后的数据(PCM数据),需要用到Audition。

上面那篇文章是用的类库比较旧,新版类库的的使用可以参考下面几篇文章。

转码实际上是先解码然后编码。

通晓了ffmpeg库的使用以后,可以看一下ffmpeg的源代码。注意ffmpeg的源代码只有在linux下才能编译,在windows下可以使用MinGW进行编译。推荐使用Eclipse查看ffmpeg的源代码。

ffmpeg源代码分析文章列表如下。

库函数分析:

<a href="http://blog.csdn.net/leixiaohua1020/article/details/8661601" target="_blank">图解FFMPEG打开媒体的函数avformat_open_input</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/12677129" target="_blank">ffmpeg 源代码简单分析 : av_register_all()</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/12677265" target="_blank">ffmpeg 源代码简单分析 : avcodec_register_all()</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/12678577" target="_blank">ffmpeg 源代码简单分析 : av_read_frame()</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/12679719" target="_blank">ffmpeg 源代码简单分析 : avcodec_decode_video2()</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/11885813" target="_blank">FFMPEG源码分析:avformat_open_input()(媒体打开函数)</a>

ffmpeg.exe源代码分析:

<a href="http://blog.csdn.net/leixiaohua1020/article/details/11851579" target="_blank">ffmpeg源码分析:transcode_init()函数</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/11851533" target="_blank">ffmpeg源码分析:transcode()函数</a>

学习完成ffmpeg,还可以了解一下基于ffmpeg的相关的多媒体开源工程,在这里推荐以下几个:

ffdshow是基于ffmpeg的解码器类库libavcodec的DirectShow Filter。广泛安装在PC上。

FFMPEG视音频编解码零基础学习方法 0. 背景知识 1. ffmpeg程序的使用(ffmpeg.exe,ffplay.exe,ffprobe.exe) 2. ffmpeg库的使用:视频播放器 3. ffmpeg库的使用:音频播放器 4. ffmpeg库的使用:一个真正的播放器——ffplay 5. ffmpeg库的使用:编码 6. ffmpeg源代码分析 7. ffmpeg相关工程的学习 8.FFmpeg其它方面的功能

有关ffdshow的源代码分析文章(更新中):

<a href="http://blog.csdn.net/leixiaohua1020/article/details/12013619" target="_blank">ffdshow 源代码分析1 : 整体结构</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/12981725" target="_blank">ffdshow 源代码分析 2: 位图覆盖滤镜(对话框部分Dialog)</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/13004051" target="_blank">ffdshow 源代码分析 3: 位图覆盖滤镜(设置部分Settings)</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/13006213" target="_blank">ffdshow 源代码分析 4: 位图覆盖滤镜(滤镜部分Filter)</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/13660583" target="_blank">ffdshow 源代码分析 5: 位图覆盖滤镜(总结)</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/15493329" target="_blank">ffdshow 源代码分析 6: 对解码器的dll的封装(libavcodec)</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/15493521" target="_blank">ffdshow 源代码分析 7: libavcodec视频解码器类(TvideoCodecLibavcodec)</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/15493743" target="_blank">ffdshow 源代码分析 8: 视频解码器类(TvideoCodecDec)</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/15493961" target="_blank">ffdshow 源代码分析 9: 编解码器有关类的总结</a>

LAV Filter是基于ffmpeg的解码器类库libavcodec,以及解封装器类库libavformat的DirectShow Filter。广泛安装在PC上。

有关LAV Filter的源代码分析文章:

<a href="http://blog.csdn.net/leixiaohua1020/article/details/12711379" target="_blank">LAV Filter 源代码分析 1: 总体结构</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/12711723" target="_blank">LAV Filter 源代码分析 2: LAV Splitter</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/13022201" target="_blank">LAV Filter 源代码分析 3: LAV Video (1)</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/13272409" target="_blank">LAV Filter 源代码分析 4: LAV Video (2)</a>

Mplayer是Linux下使用最广泛的播放器,也有Windows版本的。其中使用了ffmpeg。

FFMPEG视音频编解码零基础学习方法 0. 背景知识 1. ffmpeg程序的使用(ffmpeg.exe,ffplay.exe,ffprobe.exe) 2. ffmpeg库的使用:视频播放器 3. ffmpeg库的使用:音频播放器 4. ffmpeg库的使用:一个真正的播放器——ffplay 5. ffmpeg库的使用:编码 6. ffmpeg源代码分析 7. ffmpeg相关工程的学习 8.FFmpeg其它方面的功能

有关Mplayer的源代码分析文章:

<a href="http://blog.csdn.net/leixiaohua1020/article/details/11885509" target="_blank">MPlayer源代码分析</a>

现在广为使用很多播放器都是构建于Media Player Classic - HC的基础之上的。

FFMPEG视音频编解码零基础学习方法 0. 背景知识 1. ffmpeg程序的使用(ffmpeg.exe,ffplay.exe,ffprobe.exe) 2. ffmpeg库的使用:视频播放器 3. ffmpeg库的使用:音频播放器 4. ffmpeg库的使用:一个真正的播放器——ffplay 5. ffmpeg库的使用:编码 6. ffmpeg源代码分析 7. ffmpeg相关工程的学习 8.FFmpeg其它方面的功能

有关Media Player Classic - HC的源代码分析文章:

<a href="http://blog.csdn.net/leixiaohua1020/article/details/13280659" target="_blank">Media Player Classic - HC 源代码分析 1:整体结构</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/13290345" target="_blank">Media Player Classic - HC 源代码分析 2:核心类 (CMainFrame)(1)</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/13297291" target="_blank">Media Player Classic - HC 源代码分析 3:核心类 (CMainFrame)(2)</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/13298397" target="_blank">Media Player Classic - HC 源代码分析 4:核心类 (CMainFrame)(3)</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/13297555" target="_blank">Media Player Classic - HC 源代码分析 5:关于对话框 (CAboutDlg)</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/13297589" target="_blank">Media Player Classic - HC 源代码分析 6:MediaInfo选项卡 (CPPageFileMediaInfo)</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/13297621" target="_blank">Media Player Classic - HC 源代码分析 7:详细信息选项卡(CPPageFileInfoDetails)</a>

from:http://blog.csdn.net/leixiaohua1020/article/details/15811977

XBMC是一个优秀的自由和开源的(GPL)媒体中心软件。

FFMPEG视音频编解码零基础学习方法 0. 背景知识 1. ffmpeg程序的使用(ffmpeg.exe,ffplay.exe,ffprobe.exe) 2. ffmpeg库的使用:视频播放器 3. ffmpeg库的使用:音频播放器 4. ffmpeg库的使用:一个真正的播放器——ffplay 5. ffmpeg库的使用:编码 6. ffmpeg源代码分析 7. ffmpeg相关工程的学习 8.FFmpeg其它方面的功能

有关XBMC源代码分析文章:

<a href="http://blog.csdn.net/leixiaohua1020/article/details/17454977" target="_blank">XBMC源代码分析 1:整体结构以及编译方法</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/17511993" target="_blank">XBMC源代码分析 2:Addons(皮肤Skin)</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/17512743" target="_blank">XBMC源代码分析 3:核心部分(core)-综述</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/17512509" target="_blank">XBMC源代码分析 4:视频播放器(dvdplayer)-解码器(以ffmpeg为例)</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/17512633" target="_blank">XBMC源代码简析 5:视频播放器(dvdplayer)-解复用器(以ffmpeg为例)</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/17512653" target="_blank">XBMC源代码分析 6:视频播放器(dvdplayer)-文件头(以ffmpeg为例)</a>

<a href="http://blog.csdn.net/leixiaohua1020/article/details/17512667" target="_blank">XBMC源代码分析 7:视频播放器(dvdplayer)-输入流(以libRTMP为例)</a>

在这里介绍一下FFmpeg中AVFilter的使用。AVFilter可以给试饮品添加各种处理效果。有一个简单的例子,是给视频添加水印:

<a href="http://blog.csdn.net/leixiaohua1020/article/details/29368911" target="_blank">最简单的基于FFmpeg的AVfilter例子(水印叠加)</a>

继续阅读