了解一下ffmpeg

转载 2016年06月01日 13:30:44
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。

FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,现在由Michael Niedermayer维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"

http://baike.baidu.com/link?url=0Cb8hnaoKtxYht1dW5vyBHfxhRU-agxZ5HXF18bOJwdkzKLMor1BuqG29jvrDGMaBUq21Aci_ggSQKhtnFrbUq

和读取音视频帧等功能;
libavcodec:用于各种类型声音/图像编解码;
libavutil:包含一些公共的工具函数;
libswscale:用于视频场景比例缩放、色彩映射转换;
libpostproc:用于后期效果处理;
ffmpeg:该项目提供的一个工具,可用于格式转换、解码或电视卡即时编码等;
ffsever:一个 HTTP 多媒体即时广播串流服务器;
ffplay:是一个简单的播放器,使用ffmpeg 库解析和解码,通过SDL显示

// 以上是百度百科解释.

面分析一下多媒体中最基本最核心的视频解码过程,平常我们从网上下载一部电影或者一首歌曲,那么相应的多媒体播放器为我们做好了一切工作,我们只用欣赏就ok了。目前几乎所有的主流多媒体播放器都是基于开源多媒体框架ffmpeg来做的,可见ffmpeg的强大。下面是对一个媒体文件进行解码的主要流程:

1.   解复用(Demux)

当我们打开一个多媒体文件之后,第一步就是解复用,称之为Demux。为什么需要这一步,这一步究竟是做什么的?我们知道在一个多媒体文件中,既包括音频也包括视频,而且音频和视频都是分开进行压缩的,因为音频和视频的压缩算法不一样,既然压缩算法不一样,那么肯定解码也不一样,所以需要对音频和视频分别进行解码。虽然音频和视频是分开进行压缩的,但是为了传输过程的方便,将压缩过的音频和视频捆绑在一起进行传输。所以我们解码的第一步就是将这些绑在一起的音频和视频流分开来,也就是传说中的解复用,所以一句话,解复用这一步就是将文件中捆绑在一起的音频流和视频流分开来以方便后面分别对它们进行解码,下面是Demux之后的效果。


2.   解码(Decode)

这一步不用多说,一个多媒体文件肯定是经过某种或几种格式的压缩的,也就是通常所说的视频和音频编码,编码是为了减少数据量,否则的话对我们的存储设备是一个挑战,如果是流媒体的话对网络带宽也是一个几乎不可能完成的任务。所以我们必须对媒体信息进行尽可能的压缩。

3.    FFmpeg中解码流程对应的API函数

了解了上面的一个媒体文件从打开到解码的流程,就可以很轻松的阅读ffmpeg代码,ffmpeg的框架也基本是按照这个流程来的,但不是每个流程对应一个API,下面这副图是我分析ffmpeg并根据自己的理解得到的ffmpeg解码流程对应的API,我想这幅图应该对理解ffmpeg和编解码有一些帮助。


Ffmpeg中Demux这一步是通过avformat_open_input()这个api来做的,这个api读出文件的头部信息,并做demux,在此之后我们就可以读取媒体文件中的音频和视频流,然后通过av_read_frame()从音频和视频流中读取出基本数据流packet,然后将packet送到avcodec_decode_video2()和相对应的api进行解码。

http://wenku.baidu.com/link?url=inrRVAA_gnO7exEjrRfBXfjWjydzp1JHNlb2tLpBD7qFTzJysOqTfSUNfZ0BWrEdDXSakEOibT5zaUwGJQd_5Hlfcx_cS-SFD2fFl3lFaRC

Java - 简述一下你了解的设计模式。

所谓设计模式,就是一套被反复使用的代码设计经验的总结(情境中一个问题经过证实的一个解决方案)。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式使人们可以更加简单方便的复用...
  • chimomo
  • chimomo
  • 2017年11月03日 10:03
  • 296

入门到放弃node系列之网络模块(一)

上一次相信大家都基本了解node的用法了,有做功课的童鞋肯定回去温习了一下js的语法。...
  • vaelongchen
  • vaelongchen
  • 2017年11月23日 13:11
  • 49

了解一下 Redis 并在 CentOS 下进行安装配置

转载自:http://blog.mayongfa.cn/258.html 转载后对redis版本修改成最新版本 了解一下 Redis Redis 是一个开源、支持网络、基于内存、键值对的 Ke...
  • ling811
  • ling811
  • 2017年07月26日 16:16
  • 361

FFMPEG学习路线

在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者。在和大家探讨的过程中,我忽然发现了一个问题:在“...
  • changyou0730
  • changyou0730
  • 2014年11月13日 10:50
  • 1132

由volatile关键字谈Java内存模型

volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型...
  • taylorchan2016
  • taylorchan2016
  • 2016年04月01日 12:53
  • 713

对线程池的理解

通过实验研究“线程池中线程数目的变化规律”           自从看了老赵关于线程池的实验以后,我就想学着做一个类似的实验,验证自己的理解,现在终于做好了,请大家指正。       ...
  • wpx312058603
  • wpx312058603
  • 2016年07月04日 01:36
  • 479

ffmpeg实战教程(一)Mp4,mkv等格式解码为h264和yuv数据

FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。而网上对这些功能的使用大多是基于命令行的。这不利于我们深入学习定制化ffmpeg,今后我将写一系列的用代码实现这些...
  • King1425
  • King1425
  • 2017年05月04日 12:16
  • 4383

大概了解一下web.config

ASP.NET Web.config The ASP.NET Web.config file is used to define the configuration settings for a...
  • asnsnld
  • asnsnld
  • 2014年04月23日 10:16
  • 333

了解一下PhoneGap

1、PhoneGap是什么呢? 是一个使用前端技术(html/css/js),创建跨平台应用程序的,快速开发平台。 与传统web应用区别:能够使用智能手机的核心本地功能(传感器、声音、震动。。。) ...
  • qq_36671474
  • qq_36671474
  • 2017年01月07日 17:51
  • 226

好好了解一下Cookie

Cookie的诞生由于HTTP协议是无状态的,而服务器端的业务必须是要有状态的。Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用。比如判断用户是否是第一次访问网站。目前最新的...
  • cometwo
  • cometwo
  • 2016年06月14日 09:57
  • 6288
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:了解一下ffmpeg
举报原因:
原因补充:

(最多只允许输入30个字)