FFMPEG源码分析(二)
来源:互联网 发布:java审批流程代码 编辑:程序博客网 时间:2024/05/18 10:23
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类似。
from:http://www.cnblogs.com/qingquan/archive/2011/08/29/2158912.html
- FFMPEG源码分析(二)
- FFMPEG源码分析(二)
- FFMPEG源码分析(二)
- FFMPEG源码分析(二)
- FFMPEG源码分析(二)
- (转载)FFMPEG源码分析(二)
- FFMPEG 源码分析(-)
- FFMPEG 源码分析(-)
- 最新版ffmpeg源码分析二:transcode()函数
- 最新版ffmpeg源码分析二:transcode()函数
- 最新版ffmpeg源码分析二:transcode()函数
- 最新版ffmpeg源码分析二:transcode()函数
- 最新版ffmpeg源码分析二:transcode()函数
- FFMPEG源码分析(一)
- ffmpeg源码分析与应用示例(二)——代码抽取的意义
- ffmpeg源码分析二:main函数和transcode函数 (转2)
- ffmpeg源码分析二:main函数和transcode函数
- android 移植 ffmpeg (二) 源码分析 JNI编程说明
- 堆和栈的区别 (转贴)
- linux zip/unzip err encoding压缩解压中文文件 乱码
- 文章标题 : 关于dpkg:处理 xxx (--configure)时出错:的我的解决办法
- ConcurrentModificationException异常解决办法
- C# 委托之协变和逆变
- FFMPEG源码分析(二)
- Junit的AssertThat方法表达式
- Android APK 签名比对,防止软件被破解使用
- CentOS 5.2下安装网卡驱动
- Rails3 开发模式下默认时区设置
- Mysql数据库乱码解决方法
- 添加、删除、修改触发器,更新数据放入t_log表
- 《应用密码学》 欧几里得算法-Euclid
- codeigniter 用.htcaccess做动态二级域名解析