美文网首页
FFMpeg结构体分析:AVFormatContext

FFMpeg结构体分析:AVFormatContext

作者: Neal_f | 来源:发表于2018-04-01 19:41 被阅读0次

FFMpeg结构体分析:AVFormatContext

typedef struct AVFormatContext :
分析常用的

/** 
 * 输入文件的格式 
 * 在解复用是出现,由avformat_open_input()设置. 
 */  
struct AVInputFormat *iformat; 

    /** 
 * 输出文件的格式 
 * 
 * 复用的时候出现, 必须在avformat_write_header()之前由用户设置. 
 */  
struct AVOutputFormat *oformat;  

    /** 
 * AVFormatContext.streams的个数. 
 * 
 * Set by avformat_new_stream(),不能被随意修改. 
 */  
unsigned int nb_streams; 

    /** 
 * 输入文件的所有码流信息.新的码流信息可由 
 * avformat_new_stream()生成。 
 * 
 * - demuxing: streams are created by libavformat in avformat_open_input(). 
 *             If AVFMTCTX_NOHEADER is set in ctx_flags, then new streams may also 
 *             appear in av_read_frame(). 
 * - muxing: streams are created by the user before avformat_write_header(). 
 * 
 * 通过avformat_free_context()释放内存. 
 */  
AVStream **streams;

    /** 
 * 输入输出文件名 
 * 
 * - demuxing: set by avformat_open_input() 
 * - muxing: may be set by the caller before avformat_write_header() 
 */  
char filename[1024];

    /** 
 * 码流的时长, 也是利用 AV_TIME_BASE fractional 
 * seconds表征. 一般情况下由 
 * AVStream values 推导得出. 
 * 
 * Demuxing only, set by libavformat. 
 */  
int64_t duration; 

    /** 
 * Forced video codec_id. 
 * Demuxing: Set by user. 
 */  
enum AVCodecID video_codec_id;  

/** 
 * Forced audio codec_id. 
 * Demuxing: Set by user. 
 */  
enum AVCodecID audio_codec_id;  

/** 
 * Forced subtitle(字幕) codec_id. 
 * Demuxing: Set by user. 
 */  
enum AVCodecID subtitle_codec_id; 

    /** 
 * Metadata that applies to the whole file. 
 * 
 * - demuxing: set by libavformat in avformat_open_input() 
 * - muxing: may be set by the caller before avformat_write_header() 
 * 
 * Freed by libavformat in avformat_free_context(). 
 */  
AVDictionary *metadata; 

    /** 
 * 帧率 in 
 * avformat_find_stream_info(). 
 * Demuxing only, set by the caller before avformat_find_stream_info(). 
 */  
int fps_probe_size; 

    /** 
 * Forced video codec. 
 * This allows forcing a specific decoder, even when there are multiple with 
 * the same codec_id. 
 * Demuxing: Set by user via av_format_set_video_codec (NO direct access). 
 */  
AVCodec *video_codec;  

/** 
 * Forced audio codec. 
 * This allows forcing a specific decoder, even when there are multiple with 
 * the same codec_id. 
 * Demuxing: Set by user via av_format_set_audio_codec (NO direct access). 
 */  
AVCodec *audio_codec;  

/** 
 * Forced subtitle codec. 
 * This allows forcing a specific decoder, even when there are multiple with 
 * the same codec_id. 
 * Demuxing: Set by user via av_format_set_subtitle_codec (NO direct access). 
 */  
AVCodec *subtitle_codec;  

/** 
 * Forced data codec. 
 * This allows forcing a specific decoder, even when there are multiple with 
 * the same codec_id. 
 * Demuxing: Set by user via av_format_set_data_codec (NO direct access). 
 */  
AVCodec *data_codec;  

struct AVInputFormat *iformat:输入数据的封装格式

AVIOContext *pb:输入数据的缓存

unsigned int nb_streams:音视频流的个数

AVStream **streams:音视频流

char filename[1024]:文件名

int64_t duration:时长(单位:微秒us,转换为秒需要除以1000000)

int bit_rate:比特率(单位bps,转换为kbps需要除以1000)

AVDictionary *metadata:元数据

视频的时长可以转换成HH:MM:SS的形式,示例代码如下:

[cpp] view plain copy
AVFormatContext *pFormatCtx;
CString timelong;
...
//duration是以微秒为单位
//转换成hh:mm:ss形式
int tns, thh, tmm, tss;
tns = (pFormatCtx->duration)/1000000;
thh = tns / 3600;
tmm = (tns % 3600) / 60;
tss = (tns % 60);
timelong.Format("%02d:%02d:%02d",thh,tmm,tss);

视频的原数据(metadata)信息可以通过AVDictionary获取。元数据存储在AVDictionaryEntry结构体中,如下所示

[cpp] view plain copy
typedef struct AVDictionaryEntry {
char *key;
char *value;
} AVDictionaryEntry;
每一条元数据分为key和value两个属性。
在ffmpeg中通过av_dict_get()函数获得视频的原数据。

下列代码显示了获取元数据并存入meta字符串变量的过程,注意每一条key和value之间有一个"\t:",value之后有一个"\r\n"

[cpp] view plain copy
//MetaData------------------------------------------------------------
//从AVDictionary获得
//需要用到AVDictionaryEntry对象
//CString author,copyright,description;
CString meta=NULL,key,value;
AVDictionaryEntry m = NULL;
//不用一个一个找出来
/
m=av_dict_get(pFormatCtx->metadata,"author",m,0);
author.Format("作者:%s",m->value);
m=av_dict_get(pFormatCtx->metadata,"copyright",m,0);
copyright.Format("版权:%s",m->value);
m=av_dict_get(pFormatCtx->metadata,"description",m,0);
description.Format("描述:%s",m->value);
*/
//使用循环读出
//(需要读取的数据,字段名称,前一条字段(循环时使用),参数)
while(m=av_dict_get(pFormatCtx->metadata,"",m,AV_DICT_IGNORE_SUFFIX)){
key.Format(m->key);
value.Format(m->value);
meta+=key+"\t:"+value+"\r\n" ;
}

相关文章

网友评论

      本文标题:FFMpeg结构体分析:AVFormatContext

      本文链接:https://www.haomeiwen.com/subject/dxuacftx.html