1.1 视频像素格式
ARGB_8888 : 常见的图像像素编码格式,用 4 个字节分别存储图像的 A 透明度信息, R 红色通道信 息, G 绿色通道信息, B 蓝色通道信息。 YUV : YUV像素格式来源于RGB像素格式,通过公式运算,YUV三分量可以还原出RGB,YUV转RGB的 公式如下: R = Y + 1.403V G = Y – 0.344U – 0.714V B = Y + 1.770U一般,将 RGB 和 YUV 的范围均限制在 [0, 255] 间,则有如下转换公式:
R = Y + 1.403(V – 128) G = Y – 0.344(U – 128) – 0.714(V – 128) B = Y + 1.770(U – 128)YUV 格式根据采样方式不同又分为 YUV444 , YUV422 , YUV420 具体可以详细查询相关细节。
1.2 视频压缩格式
压缩格式 适用静态图或视频 特征描述 应用场景 JPEG / JPEG2000 静态图 JPEG / JPEG 2000利用的压缩算法不同 DSC等 M-JPEG 视频 只是由连续的JPEG图像组成 PC-CAM ,监控等 MPEG1 视频 MPEG 组织定义的 VCD 应用程序的 标准 VCD 等 MPEG2 视频 MPEG 组织定义的 DVD ,DVB 应用程序的标准 DVD ,DVB ,监控等 MPEG4 视频 MPEG 组织定义的网络应用程序的标准 监控VOD ,IPTV ,PMP等 H.261 视频 国际电联定义 基本 互联网多媒体应 监控,视频会议等 用标准 H.263 视频 国际电联定义 低带宽 互联网多媒体 应用标准 监控,视频会议等 H.264 视频 具有更高压缩效率的下一代标准 IPTV ,监控 ,多媒体 等 WMV9 视频 微软定义的下一代标准 IPTV , VOD AVS1.0 视频 中国自有专利标准 2 音频2.1 音频采样数据格式
3 FFmpeg 中几个重要的结构体结构体一 AVPacket
// C typedef struct AVPacket { AVBufferRef *buf; //用来管理data指针引用的数据缓存 int64_t pts; //显示时间,结合AVStream->time_base转换成时间戳 int64_t dts; //解码时间,结合AVStream->time_base转换成时间戳 uint8_t *data; //★指向保存压缩数据的指针,这就是AVPacket的实际数据 int size; //data的大小 int stream_index; //packet在stream的index位置 int flags; //标示,结合AV_PKT_FLAG使用,其中最低为1表示该数据是一个关键帧。 /* * flags 可选: * #define AV_PKT_FLAG_KEY 0x0001 //关键帧 * #define AV_PKT_FLAG_CORRUPT 0x0002 //损坏的数据 * #define AV_PKT_FLAG_DISCARD 0x0004 /丢弃的数据 */ AVPacketSideData *side_data; //容器提供的一些附加数据 int side_data_elems; //边缘数据元数个数 int64_t duration; //数据的时长,以所属媒体流的时间基准为单位,未知则值为默认值0 int64_t pos; //数据在流媒体中的位置,未知则值为默认值-1 #if FF_API_CONVERGENCE_DURATION attribute_deprecated int64_t convergence_duration; //该字段已deprecated,不在使用 #endif } AVPacket;结构体二 AVFrame
AVFrame 结构体定义在 <libavutil/frame.h> ,看源码去这里找,略长不粘。 简介: AVFrame中存储的是经过解码后的原始数据。在解码中,AVFrame是解码器的输出;在编码 中,AVFrame是编码器的输入。结构体三 AVFormatContext
AVFormatContext 结构体定义在 <libavformat/avformat.h> 中,看源码去这里找,略长不粘。 简介:在使用 FFmpeg 进行开发的时候,AVFormatContext 是一个贯穿始终的数据结构,很多函数 都要用到它作为参数。它是 FFmpeg 解封装(flv,mp4,rmvb,avi)功能的结构体。下面看几个 主要变量的作用(在这里考虑解码的情况): // C struct AVInputFormat *iformat; //输入数据的封装格式 AVIOContext *pb; //输入数据的缓存 unsigned int nb_streams; //视音频流的个数 AVStream **streams; //视音频流 char filename[1024]; //文件名 int64_t duration; //时长(单位:微秒ms,转换为秒需要除以1_000_000) int bit_rate; //比特率(单位bps,转换为kbps需要除以1_000) AVDictionary *metadata; //元数据结构体四 AVCodecContext
AVCodecContext 结构体定义在 <libavcodec/avcodec.h> 中,看源码去这里找,略长不粘。 简介: 一些关键的变量来看看(这里只考虑解码)。 // C enum AVMediaType codec_type; //编解码器的类型(视频,音频…) struct AVCodec *codec; //采用的解码器AVCodec(H.264,MPEG2…) int bit_rate; //平均比特率 uint8_t *extradata; int extradata_size; //针对特定编码器包含的附加信息(例如对于H.264解码器来 说,存储SPS,PPS等) AVRational time_base; //根据该参数,可以把PTS转化为实际的时间(单位为秒s) int width, height; //如果是视频的话,代表宽和高 int refs; //运动估计参考帧的个数(H.264的话会有多帧,MPEG2这类的一般就没有了) int sample_rate; //采样率(音频) int channels; //声道数(音频) enum AVSampleFormat sample_fmt; //采样格式 int profile; //型(H.264里面就有,其他编码标准应该也有) int level; //级(和profile差不太多)重要结构体之间的关系
FFmpeg 中结构体很多。最关键的结构体可以分成以下几类:
解协议(http, rtsp, rtmp, mms) AVIOContext ,URLProtocol ,URLContext 主要存储视音频使用的协议的类型以及状态。URLProtocol 存 储输入视音频使用的封装格式。每种协议都对应一个 URLProtocol 结构(注意:FFmpeg 中文件也被当 做一种协议 “file” )。
解封装(flv, avi, rmvb, mp4) AVFormatContext 主要存储视音频封装格式中包含的信息; AVInputFormat 存储输入视音频使用的封装格 式。每种视音频封装格式都对应一个 AVInputFormat 结构。
解码(h264, mpeg2, aac, mp3) 每个 AVStream 存储一个视频/音频流的相关数据;每个 AVStream 对应一个 AVCodecContext ,存储该视 频/音频流使用解码方式的相关数据;每个 AVCodecContext 中对应一个 AVCodec ,包含该视频/音频对应 的解码器。每种解码器都对应一个 AVCodec 结构。
存数据 视频的话,每个结构一般是存一帧;音频可能有好几帧 解码前数据:AVPacket 解码后数据:AVFrame
免责声明:文章内容来自互联网,本站不对其真实性负责,也不承担任何法律责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:ffmpeg视频格式和结构体 https://www.yhzz.com.cn/a/12554.html