C++编程音视频库ffmpeg的pts时间怎么换算

    ffmpeg中的pts,dts,duration时间记录都是基于timebase换算,咱们主要分析下pts的时间怎么换算,其它的是同样的换算。ffmpeg的时间换算对许多新接触同窗算是一个大坑,不少刚接触ffmpeg的同窗都不容易搞清楚它的时间计算方法。html

咱们先看下ffmpeg时间是怎么算的:编程

一帧图像(音频)的时间戳(时间戳通常以第一帧为0开始)ide

时间戳 = pts * (AVRational.num/AVRational.den)函数

为何要这么算(挖坑)咱们看下ffmpeg的说明:编码

“当有理数用浮点数作转换时是有损的,ffmpeg要求高精度的计算的时间戳,因此用分数来作换算”。spa

咱们在看下换算用到的结构体,一看到他是用分数就容易理解了3d

typedef struct AVRational{视频

int num; ///<分子htm

int den; ///< 分母blog

} AVRational;

其实当num=1,den=1000的时候pts的时间单位就至关于毫秒 1/1000秒

其实当num=1,den=1000000的时候pts的时间单位就至关于微秒 1/1000000秒

时间换算

     好比咱们要经过ffmpeg实现直播推流,推流一个文件,文件中的时间基数通常是{ num=1,den=1000000} ,推流用的正常是timebase {num=1,den=1000}。那就能够作以下计算:

     推流的pts = 文件pts * 文件timebase / 推流timebase

     若是手动计算要判断分母是否为0,否则会形成程序宕掉。固然ffmpeg内部也提供了转换的函数

int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const;



咱们代码示例一下

AVCodecContext *vc = NULL; //视频编码器上下文
AVStream *vs = NULL;//输出rtmp封装器的视频流
///编码,推流处理代码。。。。。
//。。。
//。。。
//编码后的视频packet,时间基数使用的视频编码器
AVPacket pkt;
//。。。
//推流用pts
//使用ffmpeg函数换算
//pkt.pts = av_rescale_q(pkt.pts,vc->timebase,vs->timebase);
//若是手动换算
if(vc->timebase.den > 0 && vs->timebase.den > 0)
pkt.pts = pkt.pts * (vc->timebase.num/vc->timebase.den)/(vs->timebase.num/vs->timebase.den)



更多的资料也能够关注我51cto上的视频课程

夏老师的课堂 http://edu.51cto.com/lecturer/12016059.html

C++编程FFMpegSDK美颜直播推流实战-基于qt5,opencv视频课程

http://edu.51cto.com/course/10840.html

wKiom1mc-AbjkX_PAAgvk24sr5Y458.png-wh_50

wKiom1mc-BuAYOV2AAfvlgpFbks765.png-wh_50

相关文章
相关标签/搜索