您好,登錄后才能下訂單哦!
ffmpeg中的pts,dts,duration時(shí)間記錄都是基于timebase換算,我們主要分析下pts的時(shí)間怎么換算,其它的是一樣的換算。ffmpeg的時(shí)間換算對許多新接觸同學(xué)算是一個(gè)大坑,很多剛接觸ffmpeg的同學(xué)都不容易搞清楚它的時(shí)間計(jì)算方法。
我們先看下ffmpeg時(shí)間是怎么算的:
一幀圖像(音頻)的時(shí)間戳(時(shí)間戳一般以第一幀為0開始)
時(shí)間戳 = pts * (AVRational.num/AVRational.den)
為什么要這么算(挖坑)我們看下ffmpeg的說明:
“當(dāng)有理數(shù)用浮點(diǎn)數(shù)做轉(zhuǎn)換時(shí)是有損的,ffmpeg要求高精度的計(jì)算的時(shí)間戳,所以用分?jǐn)?shù)來做換算”。
我們在看下?lián)Q算用到的結(jié)構(gòu)體,一看到他是用分?jǐn)?shù)就容易理解了
typedef struct AVRational{
int num; ///<分子
int den; ///< 分母
} AVRational;
其實(shí)當(dāng)num=1,den=1000的時(shí)候pts的時(shí)間單位就相當(dāng)于毫秒 1/1000秒
其實(shí)當(dāng)num=1,den=1000000的時(shí)候pts的時(shí)間單位就相當(dāng)于微秒 1/1000000秒
時(shí)間換算
比如我們要通過ffmpeg實(shí)現(xiàn)直播推流,推流一個(gè)文件,文件中的時(shí)間基數(shù)一般是{ num=1,den=1000000} ,推流用的正常是timebase {num=1,den=1000}。那就可以做如下計(jì)算:
推流的pts = 文件pts * 文件timebase / 推流timebase
如果手動(dòng)計(jì)算要判斷分母是否為0,不然會(huì)造成程序宕掉。當(dāng)然ffmpeg內(nèi)部也提供了轉(zhuǎn)換的函數(shù)
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const;
AVCodecContext *vc = NULL; //視頻編碼器上下文 AVStream *vs = NULL;//輸出rtmp封裝器的視頻流 ///編碼,推流處理代碼。。。。。 //。。。 //。。。 //編碼后的視頻packet,時(shí)間基數(shù)使用的視頻編碼器 AVPacket pkt; //。。。 //推流用pts //使用ffmpeg函數(shù)換算 //pkt.pts = av_rescale_q(pkt.pts,vc->timebase,vs->timebase); //如果手動(dòng)換算 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)
更多的資料也可以關(guān)注我51cto上的視頻課程
夏老師的課堂 http://edu.51cto.com/lecturer/12016059.html
http://edu.51cto.com/course/10840.html
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。