FFMPEG基本概念:ffmpeg是一个开源的编解码框架,它提供了一个音视频录制,解码和编码库。FFMPEG是在linux下开发的,但也有windows下的编译版本。 FFMPEG和VLC关系:在网上很多人都在问FFMPEG和VLC之间是什么关系,网上有位同学的回答最为精辟:“VLC VS FFmpeg == 汽车 VS 发动机” 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/。 http://www.cnblogs.com/MaxIE/archive/2007/02/03/638863.html 这里有一篇文章可以参考。 版权所有:博水。转载请注明出处:http://www.cnblogs.com/qingquan/ ffmpeg源码分析之数据流 本文主要介绍ffmpeg的数据流,在ffmpeg中主要分有三个主要用途用于媒体流的解码播放,媒体流的转换(解码之后再编码)和媒体流录制。 媒体流的解码播放在ffmpeg中媒体流的解码播放流程如下图: 其主要流程为从媒体文件中读取出媒体流,然后送入媒体格式解码器(demuxer)中去除多余的外衣--媒体格式。然后送入ffmpeg的codec的 decode中进行解码,最终生成显示需要的YUV格式的图片,然后再送入类似SDL中进行渲染。ffmpeg中媒体流的解码播放流程相对比较来说其最大 的难点在于pts的同步,在ffmpeg的ffplay中有很好的例子。例子中是启动了多个线程来进行同步的。 媒体流的转换所谓媒体流的转换分以下几种情况: 一种是格式转换,也相当于我们平时的换衣服一样,只是换个样式,换一种组织样式以适应不同场合的需要。 一种是媒体编码类型的转换,例如将codec从mpeg4 to H264相当于不同的人来买同一个衣服,虽然外表(格式)看起来一样但穿衣服的人已经发生了变化。 一种是媒体编码类型和格式同时转换,例如将格式为flv的转换为mpeg4,同时将codec从mpeg4 to H264相当于不同的人穿了不同的衣服。 其流程如下图: 其数据流前半部分同解码流程一样,后半部分则和解码的流程相反。当解析出YUV图片之后,然后编码成另外一种codec,之后再将codec的数据加上一个外壳形成一个媒体文件然后通过byteIocontext写入目标文件。 媒体流录制媒体流的录制过程相当于媒体流转换的后半部分流程从YUV文件到media文件。其流程为: 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.360doc.com/content/12/1104/17/3478092_245705397.shtml |
FFMPEG源码分析
最新推荐文章于 2024-01-06 17:14:12 发布