您的位置:首页 > 其它

使用FFmpeg接口获取视频信息

2017-10-06 11:34 1726 查看

目录

1. 现在可以根据pts来计算一桢在整个视频中的时间位置:

2. 计算视频长度的方法:

3. 视频的时长可以转换成HH:MM:SS的形式

4. 获取视频信息

现在可以根据pts来计算一桢在整个视频中的时间位置:

AVStream *pstream = pFormatCtx->streams[videoindex];

timestamp(秒) = pkt.pts * av_q2d(st->time_base)

av_q2d(st->time_base) = (1/帧率 *1000)ms,时间基的单位是毫秒

连续两帧之间pkt2.pts-pkt1.pts = pkt.duration(pkt.duration为整型)

计算视频长度的方法:

time(秒) = st->duration * av_q2d(st->time_base)

视频的时长可以转换成HH:MM:SS的形式

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结构体中

typedef struct AVDictionaryEntry {
char *key;
char *value;
} AVDictionaryEntry;


每一条元数据分为key和value两个属性。

在ffmpeg中通过av_dict_get()函数获得视频的原数据。

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

//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(
926b
pFormatCtx->metadata,"",m,AV_DICT_IGNORE_SUFFIX)){
key.Format(m->key);
value.Format(m->value);
meta+=key+"\t:"+value+"\r\n" ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: