使用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" ;
}
上一篇: zheng安装 dubbo安装
推荐阅读
-
使用FFmpeg接口获取视频信息
-
使用GetInstanceScreenshot获取实例的截屏信息
-
AndroidStudio使用预编译FFmpeg库结合ndk开发视频项目踩坑记录
-
使用 Python 获取 Linux 系统信息的代码
-
【求助】php使用curl模拟post提交数据获取目标网站信息,求解?
-
Thinkphp5微信小程序获取用户信息接口的实例详解
-
手把手教你使用java对接微信公众号-获取地理位置信息
-
手把手教你使用java对接微信公众号-获取微信用户基本信息
-
Laravel 5.2 使用Socialite Providers中的微信登录,可以跳转到微信显示二维码,但是无法获取到用户信息
-
php使用ffmpeg获取视频信息并截图的实现方法,phpffmpeg