ffmpeg源码分析之数据流
本文主要介绍ffmpeg的数据流,在ffmpeg中主要分有三个主要用途用于媒体流的解码播放,媒体流的转换(解码之后再编码)和媒体流录制。
媒体流的解码播放
在ffmpeg中媒体流的解码播放流程如下图:
媒体流的转换
所谓媒体流的转换分以下几种情况:
一种是格式转换,也相当于我们平时的换衣服一样,只是换个样式,换一种组织样式以适应不同场合的需要。
一种是媒体编码类型的转换,例如将codec从mpeg4 to H264相当于不同的人来买同一个衣服,虽然外表(格式)看起来一样但穿衣服的人已经发生了变化。
一种是媒体编码类型和格式同时转换,例如将格式为flv的转换为mpeg4,同时将codec从mpeg4 to H264相当于不同的人穿了不同的衣服。
其流程如下图:
媒体流录制
媒体流的录制过程相当于媒体流转换的后半部分流程从YUV文件到media文件。其流程为:
FFMPEG中的decoder的组织形式:
FFMPEG中codec的数据结构如下:
typedef struct AVCodec {
const enum PixelFormat *pix_fmts;
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类似。
版权所有:博水。