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/


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454536.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试之 Redis汇总

简介 Redis 持久化机制 RDB(Redis DataBase) AOF(Append-only file) Redis 4.0 对于持久化机制的优化 补充:AOF 重写 二者的区别 二者优缺点 Memcache与Redis的区别都有哪些? 缓存雪崩、缓存穿透、…

Oracle 10g 问题集锦

监听服务中Oracle数据库之中使用最主要的一个服务,但是这个服务经常会出现错误,包括以后在工作之中此服务也会出现错误,故给出两种常见错误的解决方案(故障1、故障2) 故障1: 注册表使用了优化软件(如&#…

iOS linker command failed with exit code 1 (use -v to see invocation)多种解决方案汇总

有时可能会遇到这种错误,关键是这种错误,有时只有这一句话,也不会给更多错误信息。 网上找了一些,总结了如下:(PS:以下是按照解决简易程度排序,不代表出现概率) 1、bitco…

计算机二级python选择题题库_2018年计算机二级python题库精编(1)

1正则中的^符号,用在一对中括号中则表示要匹配() A.字符串的开始 B.除中括号内的其它字符 C.字符串的结束 D.仅中括号内含有的字符 2静态成员变量称为类变量,非静态成员变量称为实例变量,下列关于一个类的静态成员的描述中,不正确…

非常好用!世界上最快最好的视频压缩转换工具(精品)

测试了20多款 各种视频压缩 截取软件 真的是这款最快 快好用 效果也好!!! 最快的视频转换压缩工具。 WisMencoder 能够把您的电脑上的所有视频格式,包括avi,mpg,rmvb,wmv,mp4,mov,dat等格式以最快的速度和最高的质量转换为…

面试之 Mysql 汇总

事务相关 什么是事务? 事务:是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务。事务的ACID属性: (1)原子性(Atomicity):   事务是一…

Exchange Server 2003 部署手册

1. 环境需求服务器: 域控制器1台; Exchange Server服务器1台。 IP和机器名配置: 域控制器:机器名:dc IP: 10.10.10.200 掩码:255.255.255.0 网关:10.10.10.254 DNS:127.0.0.1 Exchange&#xff…

app中 html5 search 事件,事件 - Cordova中文网

事件Cordova给我们提供了很多的事件,可以在应用程序中使用。应用程序代码中可以添加这些事件的监听。例如:HTML文件Device Ready ExampleJS文件// example.js文件// 等待设备API库加载好//function onLoad() {document.addEventListener("deviceready", o…

python标准库os中的方法_python中OS常用方法

下面列出了一些在os模块中比较有用的部分。它们中的大多数都简单明了。 os.sep可以取代操作系统特定的路径分隔符。windows下为 “\\” os.name字符串指示你正在使用的平台。比如对于Windows,它是nt,而对于Linux/Unix用户,它是posix。 os.get…

ffmpeg 过程分析

简介 FFmpeg是一个集录制、转换、音/视频编码解码功能为一体的完整的开源解决方案。FFmpeg的开发是基于Linux操作系统,但是可以在大多数操作系统中编译和使用。FFmpeg支持MPEG、DivX、MPEG4、AC3、DV、FLV等40多种编码,AVI、MPEG、OGG、Matroska、ASF等…

面试之 Python 基础

1:为什么学习Python 家里有在这个IT圈子里面,也想让我接触这个圈子,然后给我建议学的Python,然后自己通过百度和向有学过Python的同学了解了Python,Python这门语言,入门比较简单,它简单易学&…

学习笔记(11月08日)--异常

四周三次课(11月8日)异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。一般情况下,在Python无法正常处理程序时就会发生一个异常。异常是Python对象,表示一个错误。当Python脚本发生异…

html浏览器的区别是什么意思,不同浏览器对css的识别有区别吗?

不同浏览器对css的识别是有区别,因此针对不同的浏览器去写不同的CSS。下面本篇文章给大家介绍一些常用CSS书写技巧(不同浏览器之间的差异)。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。不同的浏览器,比如Int…

关于python

你是如何自学 Python 的? https://www.zhihu.com/question/20702054 Python 的练手项目有哪些值得推荐?https://www.zhihu.com/question/29372574 Python编码规范 -- Python Style Guide http://www.cnblogs.com/lxw0109/p/Python-Style-Guide.htm…

python读写文件的文本模式_Python中文件的读写、写读和追加写读三种模式的特点...

本文主要讨论一下文件的三种可读可写模式的特点及互相之间的区别,以及能否实现修改文件的操作 由于前文已经讨论过编码的事情了,所以这里不再研究编码,所有打开操作默认都是utf-8编码(Linux系统下) 首先我们看r(读写&a…

html颜色叠加代码,html代码大全(基础使用代码)(颜色代码完整版)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼您在使用以下基础使用代码时请把{}换成<>&#xff01;&#xff01;&#xff01;)(这样这个命令才成立&#xff01;&#xff01;&#xff01;)基础使用代码&#xff1a;1)贴图&#xff1a;{img src"图片地址"}2)加入…

如何看懂源代码

如何看懂源代码--(分析源代码方法) 【转载】 由于今日计划着要看Struts 开源框架的源代码 昨天看了一个小时稍微有点头绪,可是这个速度本人表示非常不满意,先去找了下资料, 觉得不错... 摘自(繁体中文Traditional Chinese):http://www.ithome.com.tw/itadm/article.php?c477…

面试之 Python 进阶

前端相关 1.谈谈你对http协议的认识。 浏览器本质&#xff0c;socket客户端遵循Http协议   HTTP协议本质&#xff1a;通过\r\n分割的规范 请求响应之后断开链接 > 无状态、 短连接 具体&#xff1a;   Http协议是建立在tcp之上的&#xff0c;是一种规范&#xff0c;它…

Lync Server外部访问系列PART5:模拟公网DNS

因为要实现外部用户访问&#xff0c;所以我们必然需要在公网DNS中添加我们所需要的一些A记录&#xff0c;而这样的测试需要我们拥有一个公网的域名以及一个可发布、可访问的IP。如果没有的话就没办法这样测试&#xff0c;所以我们今天在物理局域网中搭建一台DNS服务器&#xff…

C语言运算符和表达式

参考链接&#xff1a;http://blog.csdn.net/qq_31059475/article/details/51195091 概述 C语言一共有34种运算符&#xff0c;10种运算类型&#xff1a;算术运算符&#xff08;、-、*、/、%&#xff09;、关系运算符&#xff08;>、>、、&#xff01;、<、<&#xf…