[总结]FFMPEG视音频编解码零基础学习方法

本文提供了一条从初学者到专家的学习FFMPEG的路径,包括ffmpeg、ffplay、ffprobe的使用,库的配置与开发,编码、转码及源代码分析等内容,帮助读者深入理解并掌握FFMPEG。

目录(?)[+]

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


0. 背景知识

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

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

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

使用FFMPEG作为内核的Directshow Filter:

ffdshow,lav filters...

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

ffmpeg,格式工厂...

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


1. ffmpeg程序的使用(ffmpeg.exe,ffplay.exe,ffprobe.exe)

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

ffmpeg的官方网站是:http://ffmpeg.org/

编译好的windows可用版本的下载地址(官网中可以连接到这个网站,和官方网站保持同步): http://ffmpeg.zeranoe.com/builds/

该网站中的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个应用程序了。

1.1 ffmpeg.exe

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

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

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

[plain] view plaincopy在CODE上查看代码片派生到我的代码片

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

具体的使用方法可以参考: ffmpeg参数中文详细解释

详细的使用说明(英文):http://ffmpeg.org/ffmpeg.html

1.2 ffplay.exe

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

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

播放test.avi

[plain] view plaincopy在CODE上查看代码片派生到我的代码片

  1. ffplay test.avi  

具体的使用方法可以参考:ffplay的快捷键以及选项

详细的使用说明(英文):http://ffmpeg.org/ffplay.html

1.3 ffprobe.exe

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

这个就不多介绍了。

详细的使用说明(英文):http://ffmpeg.org/ffprobe.html


2. ffmpeg库的使用:视频播放器

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

2.1 ffmpeg库的配置

http://ffmpeg.zeranoe.com/builds/网站上

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

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

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

注:可能会出现问题,参见:FFMPEG 库移植到 VC 需要的步骤

如果不想自己手动配置,可以下载已经配置好的工程:最简单的基于FFMPEG+SDL的视频播放器

2.2 最简单的视频播放器

学习文章100行代码实现最简单的基于FFMPEG+SDL的视频播放器中的代码,这是ffmpeg做视频播放器最简单的代码了,是我自己精简出来的,已经不能再简化了,每一行都很重要。

ffmpeg的函数介绍:ffmpeg函数介绍

注1:播放视频或音频数据的时候会用到SDL。有关SDL可以参考:SDL介绍

         SDL参考文档:SDL GUIDE 中文译本

注2:如果想查看解码后的数据,需要用到 YUV播放器:YUV播放器源代码YUV Player Deluxe都可以

2.3 相关结构体的研究

ffmpeg的结构体之间的关系参考文章:FFMPEG中最关键的结构体之间的关系

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

FFMPEG结构体分析:AVFrame

FFMPEG结构体分析:AVFormatContext
FFMPEG结构体分析:AVCodecContext
FFMPEG结构体分析:AVIOContext
FFMPEG结构体分析:AVCodec
FFMPEG结构体分析:AVStream
FFMPEG结构体分析:AVPacket


3. ffmpeg库的使用:音频播放器

3.1 最简单的音频播放器

学习文章最简单的基于FFMPEG+SDL的音频播放器 中的代码,和最简单的视频播放器一样,这是最简单的音频播放器,每一行代码都很重要。

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

4. ffmpeg库的使用:一个真正的播放器——ffplay

4.1 真正的播放器

ffplay流程图如文章FFplay源代码分析:整体流程图 所示。ffplay代码比较复杂,但是其核心代码和100行代码实现最简单的基于FFMPEG+SDL的视频播放器 是一样的。可以两个工程结合着学习。

ffplay代码简介资料:如何用FFmpeg编写一个简单播放器

ffplay使用说明:ffplay的快捷键以及选项

ffplay已经移植到VC下的工程:ffplay_vc2005(别人做的,质量很不错)

ffplay移植到MFC下的工程,包含了简单的图形界面和一些控制按钮:ffplay播放器移植VC的工程:ffplay for MFC

5. ffmpeg库的使用:编码

5.1 编码

ffmpeg编码我自己研究的不是很多,可以参考文章 :使用FFmpeg类库实现YUV视频序列编码为视频

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

图像的编码可以参考:最简单的基于FFMPEG的图像编码器(YUV编码为JPEG)

音频的编码可以参考:最简单的基于FFMPEG的音频编码器(PCM编码为AAC)

视频的编码可以参考:最简单的基于FFMPEG的视频编码器(YUV编码为H.264)

5.2 转码

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

不进行转码,只进行封装格式转换的程序可参考:最简单的基于FFMPEG的封装格式转换器(无编解码)

转码程序可参考:最简单的基于FFMPEG的转码程序

比较复杂的转码程序可以参考ffmpeg.c,它移植到MFC下的工程:ffmpeg转码器移植VC的工程:ffmpeg for MFC

6. ffmpeg源代码分析

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

有一个很完整的ffmpeg源代码的分析文档:ffdoc

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

库函数分析:

图解FFMPEG打开媒体的函数avformat_open_input

ffmpeg 源代码简单分析 : av_register_all()
ffmpeg 源代码简单分析 : avcodec_register_all()
ffmpeg 源代码简单分析 : av_read_frame()
ffmpeg 源代码简单分析 : avcodec_decode_video2()
FFMPEG源码分析:avformat_open_input()(媒体打开函数)

ffmpeg.exe源代码分析:

ffmpeg源码分析:transcode_init()函数
ffmpeg源码分析:transcode()函数

7. ffmpeg相关工程的学习

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

7.1 ffdshow

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


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

ffdshow 源代码分析1 : 整体结构
ffdshow 源代码分析 2: 位图覆盖滤镜(对话框部分Dialog)

ffdshow 源代码分析 3: 位图覆盖滤镜(设置部分Settings)
ffdshow 源代码分析 4: 位图覆盖滤镜(滤镜部分Filter)
ffdshow 源代码分析 5: 位图覆盖滤镜(总结)
ffdshow 源代码分析 6: 对解码器的dll的封装(libavcodec)
ffdshow 源代码分析 7: libavcodec视频解码器类(TvideoCodecLibavcodec)
ffdshow 源代码分析 8: 视频解码器类(TvideoCodecDec)
ffdshow 源代码分析 9: 编解码器有关类的总结

7.2 LAV filters

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

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

LAV Filter 源代码分析 1: 总体结构

LAV Filter 源代码分析 2: LAV Splitter

LAV Filter 源代码分析 3: LAV Video (1)

LAV Filter 源代码分析 4: LAV Video (2)


7.3 Mplayer

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


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

MPlayer源代码分析

7.4 Media Player Classic - HC

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


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

Media Player Classic - HC 源代码分析 1:整体结构
Media Player Classic - HC 源代码分析 2:核心类 (CMainFrame)(1)
Media Player Classic - HC 源代码分析 3:核心类 (CMainFrame)(2)
Media Player Classic - HC 源代码分析 4:核心类 (CMainFrame)(3)
Media Player Classic - HC 源代码分析 5:关于对话框 (CAboutDlg)
Media Player Classic - HC 源代码分析 6:MediaInfo选项卡 (CPPageFileMediaInfo)
Media Player Classic - HC 源代码分析 7:详细信息选项卡(CPPageFileInfoDetails)

7.5 XBMC

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


有关XBMC源代码分析文章:

XBMC源代码分析 1:整体结构以及编译方法

XBMC源代码分析 2:Addons(皮肤Skin)

XBMC源代码分析 3:核心部分(core)-综述

XBMC源代码分析 4:视频播放器(dvdplayer)-解码器(以ffmpeg为例)

XBMC源代码简析 5:视频播放器(dvdplayer)-解复用器(以ffmpeg为例)

XBMC源代码分析 6:视频播放器(dvdplayer)-文件头(以ffmpeg为例)

XBMC源代码分析 7:视频播放器(dvdplayer)-输入流(以libRTMP为例)


8.FFmpeg其它方面的功能

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

最简单的基于FFmpeg的AVfilter例子(水印叠加)


转载于:https://my.oschina.net/u/1757926/blog/306094

本设计项目聚焦于一款面向城市环保领域的移动应用开发,该应用以微信小程序为载体,结合SpringBoot后端框架与MySQL数据库系统构建。项目成果涵盖完整源代码、数据库结构文档、开题报告、毕业论文及功能演示视频。在信息化进程加速的背景下,传统数据管理模式逐步向数字化、系统化方向演进。本应用旨在通过技术手段提升垃圾分类管理工作的效率,实现对海量环保数据的快速处理与整合,从而优化管理流程,增强事务执行效能。 技术上,前端界面采用VUE框架配合layui样式库进行构建,小程序端基于uni-app框架实现跨平台兼容;后端服务选用Java语言下的SpringBoot框架搭建,数据存储则依托关系型数据库MySQL。系统为管理员提供了包括用户管理、内容分类(如环保视频、知识、新闻、垃圾信息等)、论坛维护、试题与测试管理、轮播图配置等在内的综合管理功能。普通用户可通过微信小程序完成注册登录,浏览各类环保资讯、查询垃圾归类信息,并参与在线知识问答活动。 在设计与实现层面,该应用注重界面简洁性与操作逻辑的一致性,在满足基础功能需求的同时,也考虑了数据安全性与系统稳定性的解决方案。通过模块化设计与规范化数据处理,系统不仅提升了管理工作的整体效率,也推动了信息管理的结构化与自动化水平。整体而言,本项目体现了现代软件开发技术在环保领域的实际应用,为垃圾分类的推广与管理提供了可行的技术支撑。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
内容概要:本文系统介绍了敏捷开发在汽车电子架构设计中的应用背景、核心理念及其相较于传统瀑布式开发的优势。文章从传统开发流程存在的问题切入,阐述了敏捷开发兴起的原因,并深入解析《敏捷软件开发宣言》提出的四大价值观:个体和互动高于流程和工具、工作的软件高于详尽的文档、客户合作高于合同谈判、响应变化高于遵循计划。重点强调敏捷开发以迭代为核心实践方式,通过小步快跑、持续交付可运行软件、频繁获取反馈来应对需求变化,提升开发效率与客户价值。同时展示了敏捷开发在互联网和汽车行业的广泛应用,如苹果、谷歌、博世、奔驰等企业的成功实践,证明其在智能化转型中的普适性和有效性。; 适合人群:从事汽车电子、嵌入式系统开发的工程师,以及对敏捷开发感兴趣的项目经理、产品经理和技术管理者;具备一定软件开发背景,希望提升开发效率和团队协作能力的专业人士。; 使用场景及目标:①理解敏捷开发相对于传统瀑布模型的核心优势;②掌握敏捷开发四大价值观的内涵及其在实际项目中的体现;③借鉴行业领先企业的敏捷转型经验,推动团队或组织的敏捷实践;④应用于智能汽车、车联网等快速迭代系统的开发流程优化。; 阅读建议:此资源侧重理念与实践结合,建议读者结合自身开发流程进行对照反思,在团队中推动敏捷思想的落地,注重沟通协作机制建设,并从小范围试点开始逐步实施迭代开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值