欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用FFmpeg接口获取视频信息

程序员文章站 2024-01-17 19:47:16
...

现在可以根据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(pFormatCtx->metadata,"",m,AV_DICT_IGNORE_SUFFIX)){
  key.Format(m->key);
  value.Format(m->value);
  meta+=key+"\t:"+value+"\r\n" ;
}