重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
ffmpeg中的pts,dts,duration时间记录都是基于timebase换算,我们主要分析下pts的时间怎么换算,其它的是一样的换算。ffmpeg的时间换算对许多新接触同学算是一个大坑,很多刚接触ffmpeg的同学都不容易搞清楚它的时间计算方法。
成都创新互联公司成立于2013年,先为乐昌等服务建站,乐昌等地企业,进行企业商务咨询服务。为乐昌企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。我们先看下ffmpeg时间是怎么算的:
一帧图像(音频)的时间戳(时间戳一般以第一帧为0开始)
时间戳 = pts * (AVRational.num/AVRational.den)
为什么要这么算(挖坑)我们看下ffmpeg的说明:
“当有理数用浮点数做转换时是有损的,ffmpeg要求高精度的计算的时间戳,所以用分数来做换算”。
我们在看下换算用到的结构体,一看到他是用分数就容易理解了
typedef struct AVRational{
int num; ///<分子
int den; ///< 分母
} 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
http://edu.51cto.com/course/10840.html
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。