`
weiyinchao88
  • 浏览: 1232995 次
文章分类
社区版块
存档分类
最新评论

FFMPEG 源码分析

 
阅读更多

FFMPEG基本概念:

ffmpeg是一个开源的编解码框架,它提供了一个音视频录制,解码和编码库。FFMPEG是在linux下开发的,但也有windows下的编译版本。
ffmpeg项目由以下几部分组成:
ffmpeg 视频文件转换命令行工具,也支持经过实时电视卡抓取和编码成视频文件.
ffserver 基于HTTP(RTSP正在开发中)用于实时广播的多媒体服务器.也支持时间平移
ffplay 用 SDL和FFmpeg库开发的一个简单的媒体播放器
libavcodec 一个包含了所有FFmpeg音视频编解码器的库.为了保证最优性能和高可复用性,大多数编解码器从头开发的.
libavformat 一个包含了所有的普通音视格式的解析器和产生器的库.

FFMPEG和VLC关系:

在网上很多人都在问FFMPEG和VLC之间是什么关系,网上有位同学的回答最为精辟:“VLC VS FFmpeg == 汽车 VS 发动机”
FFMPEG和libav的关系:
libav是FFMPEG的开发人员中独立出来一部分后创建的一个新的工程。当时是因为在ffmpeg的开发邮件列表中经常会有不同的意见,并且产生争论之后独立出来。同时libav开发组将ffmpeg原有的图标变为自己的,同时ffmpeg重新开发了图标:

Today FFmpeg has received the first legal threat in its existence. Its from a previous root admin of FFmpeg, who now is root admin of the Libav fork of FFmpeg. He claims copyright on the zigzag part of our logo. It has to be noted that he said 4 years ago Credit to whoever came up with the zigzag idea

Update May 31/June 1:We have replaced the logo with a better looking one drawn by Hervé Flores.

FFMPEG编译:

FFMPEG的源码可以从发下网站中获取:http://www.ffmpeg.org/。
编译选项可以通过源码中的configure来配置。
如果要配置外包的包如libfaac,libx264等,可以通过--extra-cflags来指定头文件的文件夹。可以通过--extra-cflags来指定第三方的库文件的位置。如果要编译动态库则可用--enable-shared配置选项来实现。
如果想编译ffplay必须先安装SDL库。否则无法编译出ffplay。
而对于SDL库的编译则同其它linux下的安装文件一样。
而对于第三方库的安装网上到处都有说明。

http://www.cnblogs.com/MaxIE/archive/2007/02/03/638863.html

这里有一篇文章可以参考。

版权所有:博水。转载请注明出处:http://www.cnblogs.com/qingquan/

ffmpeg源码分析之数据流 http://www.yanfake.com

本文主要介绍ffmpeg的数据流,在ffmpeg中主要分有三个主要用途用于媒体流的解码播放,媒体流的转换(解码之后再编码)和媒体流录制。

媒体流的解码播放

在ffmpeg中媒体流的解码播放流程如下图:

decode其主要流程为从媒体文件中读取出媒体流,然后送入媒体格式解码器(demuxer)中去除多余的外衣--媒体格式。然后送入ffmpeg的codec的decode中进行解码,最终生成显示需要的YUV格式的图片,然后再送入类似SDL中进行渲染。ffmpeg中媒体流的解码播放流程相对比较来说其最大的难点在于pts的同步,在ffmpeg的ffplay中有很好的例子。例子中是启动了多个线程来进行同步的。

媒体流的转换

所谓媒体流的转换分以下几种情况:

一种是格式转换,也相当于我们平时的换衣服一样,只是换个样式,换一种组织样式以适应不同场合的需要。

一种是媒体编码类型的转换,例如将codec从mpeg4 to H264相当于不同的人来买同一个衣服,虽然外表(格式)看起来一样但穿衣服的人已经发生了变化。

一种是媒体编码类型和格式同时转换,例如将格式为flv的转换为mpeg4,同时将codec从mpeg4 to H264相当于不同的人穿了不同的衣服。

其流程如下图:

data stream其数据流前半部分同解码流程一样,后半部分则和解码的流程相反。当解析出YUV图片之后,然后编码成另外一种codec,之后再将codec的数据加上一个外壳形成一个媒体文件然后通过byteIocontext写入目标文件。

媒体流录制

媒体流的录制过程相当于媒体流转换的后半部分流程从YUV文件到media文件。其流程为:

recode

FFMPEG中的decoder的组织形式:

FFMPEG中codec的数据结构如下:

typedef struct AVCodec {
const char *name;
enum AVMediaType type;
enum CodecID id;
int priv_data_size;
int (*init)(AVCodecContext *);
int (*encode)(AVCodecContext *, uint8_t *buf, int buf_size, void *data);
int (*close)(AVCodecContext *);
int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt);
int capabilities;
struct AVCodec *next;
void (*flush)(AVCodecContext *);
const AVRational *supported_framerates;
const enum PixelFormat *pix_fmts;
const char *long_name;
const int *supported_samplerates;
const enum SampleFormat *sample_fmts;
const int64_t *channel_layouts;
} AVCodec;

这个数据结构分别用于decoder和encoder,当被decoder所用时函数指针encode为NULL,而当用于encode时其decode为NULL,在ffmpeg中通过向全局变量

static AVCodec *first_avcodec;

中添加新的codec变量。在查找的过程也是通过遍历这个链表然后通过name来匹配相应的codec这个过程将会在以后的文章中详细描述。在ffmpeg中formate的组织结构和codec类似。

版权所有:博水。转载请注明出处:http://www.cnblogs.com/qingquan/


分享到:
评论

相关推荐

    FFMPEG源码深入解析.pdf

    FFmpeg源码的深入解析可以帮助开发者和研究人员更好地理解和掌握这一多媒体处理领域的核心技术。 根据提供的文件信息,FFMPEG/FFPLAY源码剖析的书籍或文档可能包含了以下知识点: ### 第一章:概述 #### 1.1 ...

    ffmpeg-0.4.9-p20051120.rar_ffmpeg_ffmpeg源码分析

    源码分析是深入理解FFmpeg工作原理、学习编程技巧和自定义功能的重要途径。 FFmpeg的核心功能包括: 1. **编解码**:FFmpeg支持大量的音视频编码格式,如H.264、AV1、VP9、AAC、MP3等,通过libavcodec库实现。源码...

    ffmpeg源码分析, ffplay源码分析

    作者裁剪了ffplay, 只留下AVI解码播放, 详细分析了代码结构. 是学习ffmpeg不可多得的好资料. 源码包里有需要的库, 可直接使用vs编译,调试. 目前试过VS2013, 可以编译,调试. 其他版本没试过

    ffdoc (FFMPEG的最完整教程)(FFMPEG的源码剖析)

    总结起来,这个"ffdoc"教程全面覆盖了FFmpeg的各个方面,包括基本的命令行用法、核心库的使用、滤镜系统、源码分析以及实时流处理。无论是对FFmpeg感兴趣的业余爱好者还是专业的音视频开发人员,都能从中受益匪浅。...

    ffmpeg源码和相关工具文档

    FFmpeg 源码分析: 1. 文件结构:FFmpeg 源码组织有序,主要分为几个关键部分,如 libavcodec(编码库)、libavformat(格式库)、libavfilter(滤镜库)和 libavutil(通用工具库)。每个库都包含了大量的模块,...

    ffmpeg源码2.4.2版本(2014年10月版本)

    FFmpeg源码分析可以从以下几个主要方面入手: 1. **编解码库libavcodec**:这是FFmpeg的核心组件之一,包含了各种音视频编码和解码器。2.4.2版本中可能包括了H.264、AAC等主流编码格式的实现。通过阅读这些编码器和...

    FFMpeg源码

    FFmpeg的源码分析可以帮助我们深入了解音视频处理的底层机制,对于开发自定义的多媒体应用或者优化现有播放器功能具有重大意义。 FFmpeg项目包含了多个组件,如libavcodec(编码库)、libavformat(容器格式库)、...

    ffmpeg源码下载 ( ffmpeg-2.0.2.tar.gz )

    在本文中,我们将深入探讨FFmpeg的源码,以ffmpeg-2.0.2.tar.gz为例,理解其架构、核心组件及其实现的关键技术。 FFmpeg的核心组件包括: 1. **libavcodec**:这是FFmpeg的编码库,负责各种音频和视频编码格式的...

    FFMpeg_FFPlay 源码剖析(杨书良).pdf

    根据提供的文档内容,以下是关于FFmpeg和FFplay源码剖析的知识点: 1. FFMPEG/FFPLAY源码剖析涉及多个核心库的详细解析,包括libavutil、libavformat和libavcodec等。这些库构成了FFmpeg多媒体框架的基础部分,分别...

    FFMPEG源码和应用

    这些工具基于FFmpeg库实现,源码分析有助于理解多媒体处理的底层逻辑。 5. **滤镜系统**: FFmpeg的libavfilter库支持多种视觉效果和处理操作,如裁剪、缩放、旋转、颜色空间转换等。开发者可以自定义滤镜,通过...

    ffmpeg源码

    在分析FFmpeg源码时,我们可以了解到以下几个关键知识点: 1. **多媒体框架结构**:FFmpeg采用模块化的架构,主要包括libavcodec(编码/解码库)、libavformat(容器格式库)、libavfilter(滤镜库)和libavutil...

    FFMPEG源码 可以在windows下看

    1. **理解音视频处理流程**:通过分析源码,可以深入理解音视频数据的处理过程,包括解码、编码、过滤等步骤。 2. **定制化开发**:根据需求,可以修改或扩展 FFmpeg,添加新的解码器、编码器或过滤器。 3. **优化...

    ffmpeg源码剖析.pdf

    根据提供的文档信息,本文将对《ffmpeg源码剖析》这一资料进行深入解析,重点围绕ffmpeg的组成部分、原理以及实现机制等方面展开。 ### 一、概述 #### 1.1 ffplay 文件概览 ffplay 是一个基于 ffmpeg 库构建的...

    ffmpeg 安装编译解码

    三、FFmpeg源码分析 文件提到了对FFmpeg源码的分析,这包括对源码中一些关键函数的定义和分析,如AV_REGISTER_ALL()、AVFORMAT_NETWORK_INIT()、AVFORMAT_OPEN_INPUT()等。这些函数是FFmpeg处理多媒体数据时的核心...

    ffmpeg源码编译脚本

    以下是关于"ffmpeg源码编译脚本"的相关知识点: 1. **FFmpeg架构**: FFmpeg由多个组件组成,包括libavcodec(编码器库)、libavformat(容器格式库)、libavfilter(过滤器库)和libavutil(通用工具库)。此外,...

    ffmpeg.rar_ffmpeg_ffplay

    FFmpeg的源码分析可以帮助我们深入理解音视频处理的底层原理,包括编解码技术、帧处理、时序同步等核心概念。通过阅读和学习FFmpeg源码,开发者可以掌握以下关键知识点: 1. **多媒体编码和解码**:FFmpeg支持多种...

    FFMPEG FFPLAY 源码剖析_杨书良著_带目录高清.pdf

    8. **源码分析技巧**:除了技术内容,书还可能涵盖源码阅读和调试的技巧,帮助读者更高效地理解和学习FFmpeg源码。 这本书的“带目录”特点意味着内容结构清晰,方便读者查找和学习特定主题。通过深入阅读并实践书...

    FFMPEG/FFPLAY源码剖析(作者 杨书良)完整清晰pdf

    7. **FFplay源码分析**:重点分析FFplay播放器的代码,包括如何初始化、打开文件、播放控制、音视频同步等关键部分。 8. **过滤器系统**:介绍FFmpeg强大的过滤器系统,如何利用过滤器进行音视频处理,如裁剪、缩放...

    ffmpeg源码剖析

    ### ffmpeg源码剖析 #### 一、概述 ffmpeg是一款强大的跨平台音视频处理工具,集成了录制、转换以及流化等功能。它不仅包含了用于处理音视频的库(libavcodec, libavformat, libavutil等),还有命令行工具如...

Global site tag (gtag.js) - Google Analytics